From c4b7aaf2810c2101700bf2184724fc53ad400a6c Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Fri, 11 Jul 2003 22:18:58 +0000 Subject: [PATCH] Move to new iterator adaptors [SVN r19074] --- include/boost/generator_iterator.hpp | 64 +++++++++++++++------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/include/boost/generator_iterator.hpp b/include/boost/generator_iterator.hpp index e27090c..2397288 100644 --- a/include/boost/generator_iterator.hpp +++ b/include/boost/generator_iterator.hpp @@ -14,57 +14,63 @@ #ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP #define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP -#include +#include #include namespace boost { template -class generator_iterator_policies +class generator_iterator + : public iterator_facade< + generator_iterator + , typename Generator::result_type + , readable_lvalue_iterator_tag + , single_pass_traversal_tag + > { -public: - generator_iterator_policies() { } + typedef iterator_facade< + generator_iterator + , typename Generator::result_type + , readable_iterator_tag + , single_pass_traversal_tag + > super_t; + + public: + generator_iterator() {} + generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {} - template - void initialize(Base& base) { - m_value = (*base)(); + void increment() + { + m_value = (*m_g)(); } - // The Iter template argument is necessary for compatibility with a MWCW - // bug workaround - template - void increment(IteratorAdaptor& iter) { - m_value = (*iter.base())(); - } - - template const typename Generator::result_type& - dereference(const IteratorAdaptor&) const - { return m_value; } + dereference() const + { + return m_value; + } - template - bool equal(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const - { return x.base() == y.base() && - x.policies().m_value == y.policies().m_value; } + bool equal(generator_iterator const& y) const + { + return this->m_g == y.m_g && this->m_value == y.m_value; + } -private: - typename Generator::result_type m_value; + private: + Generator* m_g; + typename Generator::result_type m_value; }; template struct generator_iterator_generator { - typedef iterator_adaptor, - typename Generator::result_type, const typename Generator::result_type&, - const typename Generator::result_type*, std::input_iterator_tag, - long> type; + typedef generator_iterator type; }; template -inline typename generator_iterator_generator::type +inline generator_iterator make_generator_iterator(Generator & gen) { - typedef typename generator_iterator_generator::type result_t; + typedef generator_iterator result_t; return result_t(&gen); }