diff options
author | John Wiegley <johnw@newartisans.com> | 2011-07-19 23:29:41 -0500 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2011-07-19 23:29:41 -0500 |
commit | cf35984971341b8a8688eb02a22bcbc1772991d1 (patch) | |
tree | 8defec43b26a6cf9a216dac8b41d79504c32ad93 /src/iterators.h | |
parent | 966b6fc359bacad6b22e79fd5afbec0ea80e8d6a (diff) | |
download | fork-ledger-cf35984971341b8a8688eb02a22bcbc1772991d1.tar.gz fork-ledger-cf35984971341b8a8688eb02a22bcbc1772991d1.tar.bz2 fork-ledger-cf35984971341b8a8688eb02a22bcbc1772991d1.zip |
Use Boost iterator_facade to create new iterators
Diffstat (limited to 'src/iterators.h')
-rw-r--r-- | src/iterators.h | 110 |
1 files changed, 76 insertions, 34 deletions
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 <typename Derived, typename Value, typename CategoryOrTraversal> +class iterator_facade_base + : public boost::iterator_facade<Derived, Value, CategoryOrTraversal> { + 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<node_base&>(m_node); } + +protected: + node_base m_node; }; -class xact_posts_iterator : public posts_iterator +class xact_posts_iterator + : public iterator_facade_base<xact_posts_iterator, post_t *, + boost::forward_traversal_tag> { 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<xacts_iterator, xact_t *, + boost::forward_traversal_tag> { 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<journal_posts_iterator, post_t *, + boost::forward_traversal_tag> { - 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<posts_commodities_iterator, post_t *, + boost::forward_traversal_tag> { 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<basic_accounts_iterator, account_t *, + boost::forward_traversal_tag> { std::list<accounts_map::const_iterator> accounts_i; std::list<accounts_map::const_iterator> 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<sorted_accounts_iterator, account_t *, + boost::forward_traversal_tag> { 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 |