Added new post_splitter posting handler
This commit is contained in:
parent
f491979d55
commit
e86a4767bc
2 changed files with 92 additions and 1 deletions
|
|
@ -39,8 +39,49 @@
|
||||||
|
|
||||||
namespace ledger {
|
namespace ledger {
|
||||||
|
|
||||||
|
void post_splitter::print_title(const value_t& val)
|
||||||
|
{
|
||||||
|
if (! report.HANDLED(no_titles)) {
|
||||||
|
std::ostringstream buf;
|
||||||
|
val.print(buf);
|
||||||
|
post_chain->title(buf.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void post_splitter::flush()
|
||||||
|
{
|
||||||
|
foreach (value_to_posts_map::value_type pair, posts_map) {
|
||||||
|
preflush_func(pair.first);
|
||||||
|
|
||||||
|
foreach (post_t * post, pair.second)
|
||||||
|
(*post_chain)(*post);
|
||||||
|
|
||||||
|
post_chain->flush();
|
||||||
|
post_chain->clear();
|
||||||
|
|
||||||
|
if (postflush_func)
|
||||||
|
(*postflush_func)(pair.first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void post_splitter::operator()(post_t& post)
|
||||||
|
{
|
||||||
|
bind_scope_t bound_scope(report, post);
|
||||||
|
value_t result(group_by_expr.calc(bound_scope));
|
||||||
|
|
||||||
|
value_to_posts_map::iterator i = posts_map.find(result);
|
||||||
|
if (i != posts_map.end()) {
|
||||||
|
(*i).second.push_back(&post);
|
||||||
|
} else {
|
||||||
|
std::pair<value_to_posts_map::iterator, bool> inserted
|
||||||
|
= posts_map.insert(value_to_posts_map::value_type(result, posts_list()));
|
||||||
|
assert(inserted.second);
|
||||||
|
(*inserted.first).second.push_back(&post);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pass_down_posts::pass_down_posts(post_handler_ptr handler,
|
pass_down_posts::pass_down_posts(post_handler_ptr handler,
|
||||||
posts_iterator& iter)
|
posts_iterator& iter)
|
||||||
: item_handler<post_t>(handler)
|
: item_handler<post_t>(handler)
|
||||||
{
|
{
|
||||||
TRACE_CTOR(pass_down_posts, "post_handler_ptr, posts_iterator");
|
TRACE_CTOR(pass_down_posts, "post_handler_ptr, posts_iterator");
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,56 @@
|
||||||
|
|
||||||
namespace ledger {
|
namespace ledger {
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Posting collector
|
||||||
|
//
|
||||||
|
|
||||||
|
class post_splitter : public item_handler<post_t>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef std::map<value_t, posts_list> value_to_posts_map;
|
||||||
|
typedef function<void (const value_t&)> custom_flusher_t;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
value_to_posts_map posts_map;
|
||||||
|
report_t& report;
|
||||||
|
post_handler_ptr post_chain;
|
||||||
|
expr_t group_by_expr;
|
||||||
|
custom_flusher_t preflush_func;
|
||||||
|
optional<custom_flusher_t> postflush_func;
|
||||||
|
|
||||||
|
public:
|
||||||
|
post_splitter(report_t& _report,
|
||||||
|
post_handler_ptr _post_chain,
|
||||||
|
expr_t _group_by_expr)
|
||||||
|
: report(_report), post_chain(_post_chain),
|
||||||
|
group_by_expr(_group_by_expr),
|
||||||
|
preflush_func(bind(&post_splitter::print_title, this, _1)) {
|
||||||
|
TRACE_CTOR(post_splitter, "scope_t&, post_handler_ptr, expr_t");
|
||||||
|
}
|
||||||
|
virtual ~post_splitter() {
|
||||||
|
TRACE_DTOR(post_splitter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_preflush_func(custom_flusher_t functor) {
|
||||||
|
preflush_func = functor;
|
||||||
|
}
|
||||||
|
void set_postflush_func(custom_flusher_t functor) {
|
||||||
|
postflush_func = functor;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void print_title(const value_t& val);
|
||||||
|
|
||||||
|
virtual void flush();
|
||||||
|
virtual void operator()(post_t& post);
|
||||||
|
|
||||||
|
virtual void clear() {
|
||||||
|
posts_map.clear();
|
||||||
|
post_chain->clear();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Posting filters
|
// Posting filters
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue