From c5a137d9e9f8f221b3cdf996a7269302426f7898 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Tue, 10 Aug 2004 18:36:30 -0400 Subject: [PATCH] changed the way changed_value_filter is called --- format.h | 46 +++++++++++++++++++++++++++++++++++++--------- main.cc | 42 +++++++++++++++--------------------------- walk.h | 1 + 3 files changed, 53 insertions(+), 36 deletions(-) diff --git a/format.h b/format.h index 973a123c..737fa101 100644 --- a/format.h +++ b/format.h @@ -83,9 +83,15 @@ struct format_t } }; +template +struct item_formatter : public item_handler { + virtual ~item_formatter() {} + virtual void flush() const = 0; +}; + #define COLLAPSED_REGISTER 1 // support collapsed registers -class format_transaction : public item_handler +class format_transaction : public item_formatter { std::ostream& output_stream; const format_t& first_line_format; @@ -127,8 +133,13 @@ class format_transaction : public item_handler #ifdef COLLAPSED_REGISTER virtual ~format_transaction() { + flush(); + } + + virtual void flush() const { if (subtotal) report_cumulative_subtotal(); + output_stream.flush(); } void report_cumulative_subtotal() const; @@ -138,26 +149,34 @@ class format_transaction : public item_handler }; -class changed_value_filter : public item_handler +class changed_value_filter : public item_formatter { - const item_handler& handler; + item_formatter * handler; mutable entry_t modified_entry; mutable transaction_t modified_xact; mutable transaction_t * last_xact; public: - changed_value_filter(const item_handler& _handler) + changed_value_filter(item_formatter * _handler) : handler(_handler), modified_xact(&modified_entry, NULL), last_xact(NULL) { + assert(handler); modified_entry.payee = "Commodities revalued"; } virtual ~changed_value_filter() { + flush(); + handler->flush(); + assert(handler); + delete handler; + } + + virtual void flush() const { (*this)(NULL); } - void operator()(transaction_t * xact) const { + virtual void operator()(transaction_t * xact) const { if (last_xact) { balance_t prev_bal, cur_bal; @@ -178,19 +197,19 @@ class changed_value_filter : public item_handler modified_xact.total = diff; modified_xact.total.negate(); - handler(&modified_xact); + (*handler)(&modified_xact); } } if (xact) - handler(xact); + (*handler)(xact); last_xact = xact; } }; -class format_account : public item_handler +class format_account : public item_formatter { std::ostream& output_stream; const format_t& format; @@ -205,6 +224,10 @@ class format_account : public item_handler disp_pred(display_predicate) {} virtual ~format_account() {} + virtual void flush() const { + output_stream.flush(); + } + static bool disp_subaccounts_p(const account_t * account, const item_predicate& disp_pred, const account_t *& to_show); @@ -225,7 +248,7 @@ class format_account : public item_handler }; -class format_equity : public item_handler +class format_equity : public item_formatter { std::ostream& output_stream; const format_t& first_line_format; @@ -251,9 +274,14 @@ class format_equity : public item_handler } virtual ~format_equity() { + flush(); + } + + virtual void flush() const { account_t summary(NULL, "Equity:Opening Balances"); summary.value = - total; next_lines_format.format_elements(output_stream, details_t(&summary)); + output_stream.flush(); } virtual void operator()(account_t * account) const { diff --git a/main.cc b/main.cc index 96fdddab..5d04b675 100644 --- a/main.cc +++ b/main.cc @@ -587,8 +587,10 @@ int main(int argc, char * argv[]) first_line_format = next_lines_format = f; } + format_t format(first_line_format); + format_t nformat(next_lines_format); + if (command == "b") { - format_t format(first_line_format); format_account formatter(std::cout, format, display_predicate); walk_accounts(journal->master, formatter, predicate, xact_display_flags, show_subtotals, sort_order.get()); @@ -600,15 +602,11 @@ int main(int argc, char * argv[]) } } else if (command == "E") { - format_t format(first_line_format); - format_t nformat(next_lines_format); format_equity formatter(std::cout, format, nformat, display_predicate); walk_accounts(journal->master, formatter, predicate, xact_display_flags, true, sort_order.get()); } else if (command == "e") { - format_t format(first_line_format); - format_t nformat(next_lines_format); format_transaction formatter(std::cout, format, nformat); for (transactions_list::iterator i = new_entry->transactions.begin(); @@ -617,22 +615,19 @@ int main(int argc, char * argv[]) handle_transaction(*i, formatter, xact_display_flags); } else { - format_t format(first_line_format); - format_t nformat(next_lines_format); - format_transaction formatter(std::cout, format, nformat, display_predicate, + std::auto_ptr > + formatter(new format_transaction(std::cout, format, nformat, + display_predicate, #ifdef COLLAPSED_REGISTER - ! show_subtotals, + ! show_subtotals, #endif - show_inverted); + show_inverted)); + if (show_commodities_revalued) + formatter.reset(new changed_value_filter(formatter.release())); + if (! sort_order.get()) { - if (show_commodities_revalued) { - changed_value_filter filtered_formatter(formatter); - walk_entries(journal->entries.begin(), journal->entries.end(), - filtered_formatter, predicate, xact_display_flags); - } else { - walk_entries(journal->entries.begin(), journal->entries.end(), - formatter, predicate, xact_display_flags); - } + walk_entries(journal->entries.begin(), journal->entries.end(), + *formatter.get(), predicate, xact_display_flags); } else { transactions_deque transactions_pool; walk_entries(journal->entries.begin(), journal->entries.end(), @@ -640,15 +635,8 @@ int main(int argc, char * argv[]) xact_display_flags); std::stable_sort(transactions_pool.begin(), transactions_pool.end(), compare_items(sort_order.get())); - - if (show_commodities_revalued) { - changed_value_filter filtered_formatter(formatter); - walk_transactions(transactions_pool.begin(), transactions_pool.end(), - filtered_formatter); - } else { - walk_transactions(transactions_pool.begin(), transactions_pool.end(), - formatter); - } + walk_transactions(transactions_pool.begin(), transactions_pool.end(), + *formatter.get()); } } diff --git a/walk.h b/walk.h index 1c91d699..eec7f11e 100644 --- a/walk.h +++ b/walk.h @@ -12,6 +12,7 @@ namespace ledger { template struct item_handler { + virtual ~item_handler() {} virtual void operator()(T * item) const = 0; };