further performance tweaks
This commit is contained in:
parent
55d58940ce
commit
e98144ee28
2 changed files with 40 additions and 22 deletions
58
format.cc
58
format.cc
|
|
@ -177,11 +177,45 @@ void format_t::format_elements(std::ostream& out,
|
||||||
out << elem->chars;
|
out << elem->chars;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case element_t::VALUE:
|
||||||
|
case element_t::TOTAL:
|
||||||
case element_t::VALUE_EXPR: {
|
case element_t::VALUE_EXPR: {
|
||||||
balance_t value;
|
value_expr_t * expr;
|
||||||
elem->val_expr->compute(value, details);
|
switch (elem->type) {
|
||||||
value.write(out, elem->min_width, (elem->max_width > 0 ?
|
#ifdef NO_CLEANUP
|
||||||
elem->max_width : elem->min_width));
|
case element_t::VALUE: expr = value_expr; break;
|
||||||
|
case element_t::TOTAL: expr = total_expr; break;
|
||||||
|
#else
|
||||||
|
case element_t::VALUE: expr = value_expr.get(); break;
|
||||||
|
case element_t::TOTAL: expr = total_expr.get(); break;
|
||||||
|
#endif
|
||||||
|
case element_t::VALUE_EXPR: expr = elem->val_expr; break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
value_t value;
|
||||||
|
expr->compute(value, details);
|
||||||
|
switch (value.type) {
|
||||||
|
case value_t::BOOLEAN:
|
||||||
|
out << (*((bool *) value.data) ? "1" : "0");
|
||||||
|
break;
|
||||||
|
case value_t::INTEGER:
|
||||||
|
out << *((unsigned int *) value.data);
|
||||||
|
break;
|
||||||
|
case value_t::AMOUNT:
|
||||||
|
out << std::string(*((amount_t *) value.data));
|
||||||
|
break;
|
||||||
|
case value_t::BALANCE:
|
||||||
|
((balance_t *) value.data)->write(out, elem->min_width,
|
||||||
|
(elem->max_width > 0 ?
|
||||||
|
elem->max_width : elem->min_width));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -289,22 +323,6 @@ void format_t::format_elements(std::ostream& out,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case element_t::VALUE: {
|
|
||||||
balance_t value;
|
|
||||||
compute_value(value, details);
|
|
||||||
value.write(out, elem->min_width, (elem->max_width > 0 ?
|
|
||||||
elem->max_width : elem->min_width));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case element_t::TOTAL: {
|
|
||||||
balance_t value;
|
|
||||||
compute_total(value, details);
|
|
||||||
value.write(out, elem->min_width, (elem->max_width > 0 ?
|
|
||||||
elem->max_width : elem->min_width));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case element_t::SPACER:
|
case element_t::SPACER:
|
||||||
for (const account_t * acct = details.account;
|
for (const account_t * acct = details.account;
|
||||||
acct;
|
acct;
|
||||||
|
|
|
||||||
4
walk.h
4
walk.h
|
|
@ -44,9 +44,9 @@ struct compare_items {
|
||||||
bool operator()(const T * left, const T * right) const {
|
bool operator()(const T * left, const T * right) const {
|
||||||
assert(left);
|
assert(left);
|
||||||
assert(right);
|
assert(right);
|
||||||
balance_t left_result;
|
value_t left_result;
|
||||||
sort_order->compute(left_result, details_t(left));
|
sort_order->compute(left_result, details_t(left));
|
||||||
balance_t right_result;
|
value_t right_result;
|
||||||
sort_order->compute(right_result, details_t(right));
|
sort_order->compute(right_result, details_t(right));
|
||||||
return left_result < right_result;
|
return left_result < right_result;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue