changed the way changed_value_filter is called

This commit is contained in:
John Wiegley 2004-08-10 18:36:30 -04:00
parent a2efee0a8e
commit c5a137d9e9
3 changed files with 53 additions and 36 deletions

View file

@ -83,9 +83,15 @@ struct format_t
} }
}; };
template <typename T>
struct item_formatter : public item_handler<T> {
virtual ~item_formatter() {}
virtual void flush() const = 0;
};
#define COLLAPSED_REGISTER 1 // support collapsed registers #define COLLAPSED_REGISTER 1 // support collapsed registers
class format_transaction : public item_handler<transaction_t> class format_transaction : public item_formatter<transaction_t>
{ {
std::ostream& output_stream; std::ostream& output_stream;
const format_t& first_line_format; const format_t& first_line_format;
@ -127,8 +133,13 @@ class format_transaction : public item_handler<transaction_t>
#ifdef COLLAPSED_REGISTER #ifdef COLLAPSED_REGISTER
virtual ~format_transaction() { virtual ~format_transaction() {
flush();
}
virtual void flush() const {
if (subtotal) if (subtotal)
report_cumulative_subtotal(); report_cumulative_subtotal();
output_stream.flush();
} }
void report_cumulative_subtotal() const; void report_cumulative_subtotal() const;
@ -138,26 +149,34 @@ class format_transaction : public item_handler<transaction_t>
}; };
class changed_value_filter : public item_handler<transaction_t> class changed_value_filter : public item_formatter<transaction_t>
{ {
const item_handler<transaction_t>& handler; item_formatter<transaction_t> * handler;
mutable entry_t modified_entry; mutable entry_t modified_entry;
mutable transaction_t modified_xact; mutable transaction_t modified_xact;
mutable transaction_t * last_xact; mutable transaction_t * last_xact;
public: public:
changed_value_filter(const item_handler<transaction_t>& _handler) changed_value_filter(item_formatter<transaction_t> * _handler)
: handler(_handler), modified_xact(&modified_entry, NULL), : handler(_handler), modified_xact(&modified_entry, NULL),
last_xact(NULL) { last_xact(NULL) {
assert(handler);
modified_entry.payee = "Commodities revalued"; modified_entry.payee = "Commodities revalued";
} }
virtual ~changed_value_filter() { virtual ~changed_value_filter() {
flush();
handler->flush();
assert(handler);
delete handler;
}
virtual void flush() const {
(*this)(NULL); (*this)(NULL);
} }
void operator()(transaction_t * xact) const { virtual void operator()(transaction_t * xact) const {
if (last_xact) { if (last_xact) {
balance_t prev_bal, cur_bal; balance_t prev_bal, cur_bal;
@ -178,19 +197,19 @@ class changed_value_filter : public item_handler<transaction_t>
modified_xact.total = diff; modified_xact.total = diff;
modified_xact.total.negate(); modified_xact.total.negate();
handler(&modified_xact); (*handler)(&modified_xact);
} }
} }
if (xact) if (xact)
handler(xact); (*handler)(xact);
last_xact = xact; last_xact = xact;
} }
}; };
class format_account : public item_handler<account_t> class format_account : public item_formatter<account_t>
{ {
std::ostream& output_stream; std::ostream& output_stream;
const format_t& format; const format_t& format;
@ -205,6 +224,10 @@ class format_account : public item_handler<account_t>
disp_pred(display_predicate) {} disp_pred(display_predicate) {}
virtual ~format_account() {} virtual ~format_account() {}
virtual void flush() const {
output_stream.flush();
}
static bool disp_subaccounts_p(const account_t * account, static bool disp_subaccounts_p(const account_t * account,
const item_predicate<account_t>& disp_pred, const item_predicate<account_t>& disp_pred,
const account_t *& to_show); const account_t *& to_show);
@ -225,7 +248,7 @@ class format_account : public item_handler<account_t>
}; };
class format_equity : public item_handler<account_t> class format_equity : public item_formatter<account_t>
{ {
std::ostream& output_stream; std::ostream& output_stream;
const format_t& first_line_format; const format_t& first_line_format;
@ -251,9 +274,14 @@ class format_equity : public item_handler<account_t>
} }
virtual ~format_equity() { virtual ~format_equity() {
flush();
}
virtual void flush() const {
account_t summary(NULL, "Equity:Opening Balances"); account_t summary(NULL, "Equity:Opening Balances");
summary.value = - total; summary.value = - total;
next_lines_format.format_elements(output_stream, details_t(&summary)); next_lines_format.format_elements(output_stream, details_t(&summary));
output_stream.flush();
} }
virtual void operator()(account_t * account) const { virtual void operator()(account_t * account) const {

36
main.cc
View file

@ -587,8 +587,10 @@ int main(int argc, char * argv[])
first_line_format = next_lines_format = f; first_line_format = next_lines_format = f;
} }
if (command == "b") {
format_t format(first_line_format); format_t format(first_line_format);
format_t nformat(next_lines_format);
if (command == "b") {
format_account formatter(std::cout, format, display_predicate); format_account formatter(std::cout, format, display_predicate);
walk_accounts(journal->master, formatter, predicate, walk_accounts(journal->master, formatter, predicate,
xact_display_flags, show_subtotals, sort_order.get()); xact_display_flags, show_subtotals, sort_order.get());
@ -600,15 +602,11 @@ int main(int argc, char * argv[])
} }
} }
else if (command == "E") { 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); format_equity formatter(std::cout, format, nformat, display_predicate);
walk_accounts(journal->master, formatter, predicate, walk_accounts(journal->master, formatter, predicate,
xact_display_flags, true, sort_order.get()); xact_display_flags, true, sort_order.get());
} }
else if (command == "e") { else if (command == "e") {
format_t format(first_line_format);
format_t nformat(next_lines_format);
format_transaction formatter(std::cout, format, nformat); format_transaction formatter(std::cout, format, nformat);
for (transactions_list::iterator i = new_entry->transactions.begin(); 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); handle_transaction(*i, formatter, xact_display_flags);
} }
else { else {
format_t format(first_line_format); std::auto_ptr<item_formatter<transaction_t> >
format_t nformat(next_lines_format); formatter(new format_transaction(std::cout, format, nformat,
format_transaction formatter(std::cout, format, nformat, display_predicate, display_predicate,
#ifdef COLLAPSED_REGISTER #ifdef COLLAPSED_REGISTER
! show_subtotals, ! show_subtotals,
#endif #endif
show_inverted); show_inverted));
if (show_commodities_revalued)
formatter.reset(new changed_value_filter(formatter.release()));
if (! sort_order.get()) { if (! sort_order.get()) {
if (show_commodities_revalued) {
changed_value_filter filtered_formatter(formatter);
walk_entries(journal->entries.begin(), journal->entries.end(), walk_entries(journal->entries.begin(), journal->entries.end(),
filtered_formatter, predicate, xact_display_flags); *formatter.get(), predicate, xact_display_flags);
} else {
walk_entries(journal->entries.begin(), journal->entries.end(),
formatter, predicate, xact_display_flags);
}
} else { } else {
transactions_deque transactions_pool; transactions_deque transactions_pool;
walk_entries(journal->entries.begin(), journal->entries.end(), walk_entries(journal->entries.begin(), journal->entries.end(),
@ -640,15 +635,8 @@ int main(int argc, char * argv[])
xact_display_flags); xact_display_flags);
std::stable_sort(transactions_pool.begin(), transactions_pool.end(), std::stable_sort(transactions_pool.begin(), transactions_pool.end(),
compare_items<transaction_t>(sort_order.get())); compare_items<transaction_t>(sort_order.get()));
if (show_commodities_revalued) {
changed_value_filter filtered_formatter(formatter);
walk_transactions(transactions_pool.begin(), transactions_pool.end(), walk_transactions(transactions_pool.begin(), transactions_pool.end(),
filtered_formatter); *formatter.get());
} else {
walk_transactions(transactions_pool.begin(), transactions_pool.end(),
formatter);
}
} }
} }

1
walk.h
View file

@ -12,6 +12,7 @@ namespace ledger {
template <typename T> template <typename T>
struct item_handler { struct item_handler {
virtual ~item_handler() {}
virtual void operator()(T * item) const = 0; virtual void operator()(T * item) const = 0;
}; };