summaryrefslogtreecommitdiff
path: root/src/iterators.h
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2011-07-19 23:29:41 -0500
committerJohn Wiegley <johnw@newartisans.com>2011-07-19 23:29:41 -0500
commitcf35984971341b8a8688eb02a22bcbc1772991d1 (patch)
tree8defec43b26a6cf9a216dac8b41d79504c32ad93 /src/iterators.h
parent966b6fc359bacad6b22e79fd5afbec0ea80e8d6a (diff)
downloadfork-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.h110
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