From cf35984971341b8a8688eb02a22bcbc1772991d1 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Tue, 19 Jul 2011 23:29:41 -0500 Subject: Use Boost iterator_facade to create new iterators --- src/iterators.h | 110 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 34 deletions(-) (limited to 'src/iterators.h') diff --git a/src/iterators.h b/src/iterators.h index 5113d3b2..696b5911 100644 --- a/src/iterators.h +++ b/src/iterators.h @@ -51,14 +51,35 @@ namespace ledger { class journal_t; -class posts_iterator : public noncopyable +template +class iterator_facade_base + : public boost::iterator_facade { + typedef Value node_base; + public: - virtual ~posts_iterator() throw() {} - virtual post_t * operator()() = 0; + iterator_facade_base() : m_node(NULL) {} + + explicit iterator_facade_base(node_base p) : m_node(p) {} + + void increment(); + +private: + friend class boost::iterator_core_access; + + bool equal(iterator_facade_base const& other) const { + return this->m_node == other.m_node; + } + + node_base& dereference() const { return const_cast(m_node); } + +protected: + node_base m_node; }; -class xact_posts_iterator : public posts_iterator +class xact_posts_iterator + : public iterator_facade_base { posts_list::iterator posts_i; posts_list::iterator posts_end; @@ -74,7 +95,7 @@ public: TRACE_CTOR(xact_posts_iterator, "xact_t&"); reset(xact); } - virtual ~xact_posts_iterator() throw() { + ~xact_posts_iterator() throw() { TRACE_DTOR(xact_posts_iterator); } @@ -83,16 +104,21 @@ public: posts_end = xact.posts.end(); posts_uninitialized = false; + + increment(); } - virtual post_t * operator()() { + void increment() { if (posts_uninitialized || posts_i == posts_end) - return NULL; - return *posts_i++; + m_node = NULL; + else + m_node = *posts_i++; } }; -class xacts_iterator : public noncopyable +class xacts_iterator + : public iterator_facade_base { public: xacts_list::iterator xacts_i; @@ -103,22 +129,35 @@ public: xacts_iterator() : xacts_uninitialized(true) { TRACE_CTOR(xacts_iterator, ""); } - xacts_iterator(journal_t& journal) : xacts_uninitialized(true) { + xacts_iterator(journal_t& journal) : xacts_uninitialized(false) { TRACE_CTOR(xacts_iterator, "journal_t&"); reset(journal); } - virtual ~xacts_iterator() throw() { + xacts_iterator(xacts_list::iterator beg, + xacts_list::iterator end) : xacts_uninitialized(false) { + TRACE_CTOR(xacts_iterator, "xacts_list::iterator, xacts_list::iterator"); + reset(beg, end); + } + ~xacts_iterator() throw() { TRACE_DTOR(xacts_iterator); } void reset(journal_t& journal); - xact_t * operator()(); + void reset(xacts_list::iterator beg, xacts_list::iterator end) { + xacts_i = beg; + xacts_end = end; + increment(); + } + + void increment(); }; -class journal_posts_iterator : public posts_iterator +class journal_posts_iterator + : public iterator_facade_base { - xacts_iterator xacts; + xacts_iterator xacts; xact_posts_iterator posts; public: @@ -129,16 +168,18 @@ public: TRACE_CTOR(journal_posts_iterator, "journal_t&"); reset(journal); } - virtual ~journal_posts_iterator() throw() { + ~journal_posts_iterator() throw() { TRACE_DTOR(journal_posts_iterator); } void reset(journal_t& journal); - virtual post_t * operator()(); + void increment(); }; -class posts_commodities_iterator : public posts_iterator +class posts_commodities_iterator + : public iterator_facade_base { protected: journal_posts_iterator journal_posts; @@ -155,23 +196,18 @@ public: TRACE_CTOR(posts_commodities_iterator, "journal_t&"); reset(journal); } - virtual ~posts_commodities_iterator() throw() { + ~posts_commodities_iterator() throw() { TRACE_DTOR(posts_commodities_iterator); } void reset(journal_t& journal); - virtual post_t * operator()(); -}; - -class accounts_iterator : public noncopyable -{ -public: - virtual ~accounts_iterator() throw() {} - virtual account_t * operator()() = 0; + void increment(); }; -class basic_accounts_iterator : public accounts_iterator +class basic_accounts_iterator + : public iterator_facade_base { std::list accounts_i; std::list accounts_end; @@ -183,20 +219,24 @@ public: basic_accounts_iterator(account_t& account) { TRACE_CTOR(basic_accounts_iterator, "account_t&"); push_back(account); + increment(); } - virtual ~basic_accounts_iterator() throw() { + ~basic_accounts_iterator() throw() { TRACE_DTOR(basic_accounts_iterator); } + void increment(); + +private: void push_back(account_t& account) { accounts_i.push_back(account.accounts.begin()); accounts_end.push_back(account.accounts.end()); } - - virtual account_t * operator()(); }; -class sorted_accounts_iterator : public accounts_iterator +class sorted_accounts_iterator + : public iterator_facade_base { expr_t sort_cmp; bool flatten_all; @@ -213,16 +253,18 @@ public: : sort_cmp(_sort_cmp), flatten_all(_flatten_all) { TRACE_CTOR(sorted_accounts_iterator, "const expr_t&, bool, account_t&"); push_back(account); + increment(); } - virtual ~sorted_accounts_iterator() throw() { + ~sorted_accounts_iterator() throw() { TRACE_DTOR(sorted_accounts_iterator); } + void increment(); + +private: void push_back(account_t& account); void push_all(account_t& account, accounts_deque_t& deque); void sort_accounts(account_t& account, accounts_deque_t& deque); - - virtual account_t * operator()(); }; } // namespace ledger -- cgit v1.2.3 From a468c9c00b95b85b6437a854b13085c337d81978 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Mon, 25 Jul 2011 19:32:39 -0500 Subject: Removed TRACE macros from the iterators --- src/iterators.h | 51 +++++++++++---------------------------------------- 1 file changed, 11 insertions(+), 40 deletions(-) (limited to 'src/iterators.h') diff --git a/src/iterators.h b/src/iterators.h index 696b5911..93782400 100644 --- a/src/iterators.h +++ b/src/iterators.h @@ -87,17 +87,12 @@ class xact_posts_iterator bool posts_uninitialized; public: - xact_posts_iterator() : posts_uninitialized(true) { - TRACE_CTOR(xact_posts_iterator, ""); - } + xact_posts_iterator() : posts_uninitialized(true) {} xact_posts_iterator(xact_t& xact) : posts_uninitialized(true) { - TRACE_CTOR(xact_posts_iterator, "xact_t&"); reset(xact); } - ~xact_posts_iterator() throw() { - TRACE_DTOR(xact_posts_iterator); - } + ~xact_posts_iterator() throw() {} void reset(xact_t& xact) { posts_i = xact.posts.begin(); @@ -126,21 +121,15 @@ public: bool xacts_uninitialized; - xacts_iterator() : xacts_uninitialized(true) { - TRACE_CTOR(xacts_iterator, ""); - } + xacts_iterator() : xacts_uninitialized(true) {} xacts_iterator(journal_t& journal) : xacts_uninitialized(false) { - TRACE_CTOR(xacts_iterator, "journal_t&"); reset(journal); } xacts_iterator(xacts_list::iterator beg, xacts_list::iterator end) : xacts_uninitialized(false) { - TRACE_CTOR(xacts_iterator, "xacts_list::iterator, xacts_list::iterator"); reset(beg, end); } - ~xacts_iterator() throw() { - TRACE_DTOR(xacts_iterator); - } + ~xacts_iterator() throw() {} void reset(journal_t& journal); @@ -161,16 +150,11 @@ class journal_posts_iterator xact_posts_iterator posts; public: - journal_posts_iterator() { - TRACE_CTOR(journal_posts_iterator, ""); - } + journal_posts_iterator() {} journal_posts_iterator(journal_t& journal) { - TRACE_CTOR(journal_posts_iterator, "journal_t&"); reset(journal); } - ~journal_posts_iterator() throw() { - TRACE_DTOR(journal_posts_iterator); - } + ~journal_posts_iterator() throw() {} void reset(journal_t& journal); @@ -189,16 +173,11 @@ protected: xacts_list xact_temps; public: - posts_commodities_iterator() { - TRACE_CTOR(posts_commodities_iterator, ""); - } + posts_commodities_iterator() {} posts_commodities_iterator(journal_t& journal) { - TRACE_CTOR(posts_commodities_iterator, "journal_t&"); reset(journal); } - ~posts_commodities_iterator() throw() { - TRACE_DTOR(posts_commodities_iterator); - } + ~posts_commodities_iterator() throw() {} void reset(journal_t& journal); @@ -213,17 +192,12 @@ class basic_accounts_iterator std::list accounts_end; public: - basic_accounts_iterator() { - TRACE_CTOR(basic_accounts_iterator, ""); - } + basic_accounts_iterator() {} basic_accounts_iterator(account_t& account) { - TRACE_CTOR(basic_accounts_iterator, "account_t&"); push_back(account); increment(); } - ~basic_accounts_iterator() throw() { - TRACE_DTOR(basic_accounts_iterator); - } + ~basic_accounts_iterator() throw() {} void increment(); @@ -251,13 +225,10 @@ public: sorted_accounts_iterator(account_t& account, const expr_t& _sort_cmp, bool _flatten_all) : sort_cmp(_sort_cmp), flatten_all(_flatten_all) { - TRACE_CTOR(sorted_accounts_iterator, "const expr_t&, bool, account_t&"); push_back(account); increment(); } - ~sorted_accounts_iterator() throw() { - TRACE_DTOR(sorted_accounts_iterator); - } + ~sorted_accounts_iterator() throw() {} void increment(); -- cgit v1.2.3