From 9a4b0b576dbc86c9f2dc2c0d6e16272e0f93dd76 Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Tue, 23 Jan 2001 19:09:30 +0000 Subject: [PATCH] added filter iterator [SVN r8735] --- include/boost/pending/iterator_adaptors.hpp | 55 +++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/include/boost/pending/iterator_adaptors.hpp b/include/boost/pending/iterator_adaptors.hpp index 74f4534..8ceb505 100644 --- a/include/boost/pending/iterator_adaptors.hpp +++ b/include/boost/pending/iterator_adaptors.hpp @@ -130,6 +130,10 @@ struct default_iterator_policies // and thought they were non-const. Also, Sun C++ does not like static // function templates. + template + void initialize(Iterator&) + { } + template Reference dereference(type, const Iterator& x) const { return *x; } @@ -317,13 +321,16 @@ public: iterator_adaptor() { } - iterator_adaptor(const Iterator& iter, const Policies& p = Policies()) - : m_iter_p(iter, p) {} + iterator_adaptor(const Iterator& it, const Policies& p = Policies()) + : m_iter_p(it, p) { + policies().initialize(iter()); + } template iterator_adaptor (const iterator_adaptor& src) : m_iter_p(src.iter(), src.policies()) { + policies().initialize(iter()); } reference operator*() const { @@ -617,7 +624,7 @@ struct indirect_iterators //============================================================================= // Reverse Iterators Adaptor -struct reverse_iterator_policies +struct reverse_iterator_policies : public default_iterator_policies { template Reference dereference(type, const Iterator& x) const @@ -778,6 +785,48 @@ struct projection_iterators { typedef typename Adaptors::const_iterator const_iterator; }; +//============================================================================= +// Filter Iterator Adaptor + + template + class filter_iterator_policies : public default_iterator_policies { + public: + filter_iterator_policies() { } + + filter_iterator_policies(const Predicate& p, const Iterator& end) + : m_predicate(p), m_end(end) { } + + void initialize(Iterator& x) { + advance(x); + } + void increment(Iterator& x) { + ++x; + advance(x); + } + private: + void advance(Iterator& iter) + { + while (m_end != iter && !m_predicate(*iter)) + ++iter; + } + Predicate m_predicate; + Iterator m_end; + }; + + template +#else + class Traits +#endif + > + class filter_iterator { + typedef filter_iterator_policies Policies; + public: + typedef iterator_adaptor type; + }; + + } // namespace boost #endif