Move to new iterator adaptors

[SVN r19074]
This commit is contained in:
Dave Abrahams 2003-07-11 22:18:58 +00:00
parent 22b8494e9a
commit c4b7aaf281

View File

@ -14,57 +14,63 @@
#ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP #ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
#define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP #define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
#include <boost/iterator_adaptors.hpp> #include <boost/iterator/iterator_facade.hpp>
#include <boost/ref.hpp> #include <boost/ref.hpp>
namespace boost { namespace boost {
template<class Generator> template<class Generator>
class generator_iterator_policies class generator_iterator
: public iterator_facade<
generator_iterator<Generator>
, typename Generator::result_type
, readable_lvalue_iterator_tag
, single_pass_traversal_tag
>
{ {
public: typedef iterator_facade<
generator_iterator_policies() { } generator_iterator<Generator>
, typename Generator::result_type
, readable_iterator_tag
, single_pass_traversal_tag
> super_t;
template<class Base> public:
void initialize(Base& base) { generator_iterator() {}
m_value = (*base)(); generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {}
void increment()
{
m_value = (*m_g)();
} }
// The Iter template argument is necessary for compatibility with a MWCW
// bug workaround
template <class IteratorAdaptor>
void increment(IteratorAdaptor& iter) {
m_value = (*iter.base())();
}
template <class IteratorAdaptor>
const typename Generator::result_type& const typename Generator::result_type&
dereference(const IteratorAdaptor&) const dereference() const
{ return m_value; } {
return m_value;
}
template <class IteratorAdaptor1, class IteratorAdaptor2> bool equal(generator_iterator const& y) const
bool equal(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const {
{ return x.base() == y.base() && return this->m_g == y.m_g && this->m_value == y.m_value;
x.policies().m_value == y.policies().m_value; } }
private: private:
typename Generator::result_type m_value; Generator* m_g;
typename Generator::result_type m_value;
}; };
template<class Generator> template<class Generator>
struct generator_iterator_generator struct generator_iterator_generator
{ {
typedef iterator_adaptor<Generator*, generator_iterator_policies<Generator>, typedef generator_iterator<Generator> type;
typename Generator::result_type, const typename Generator::result_type&,
const typename Generator::result_type*, std::input_iterator_tag,
long> type;
}; };
template <class Generator> template <class Generator>
inline typename generator_iterator_generator<Generator>::type inline generator_iterator<Generator>
make_generator_iterator(Generator & gen) make_generator_iterator(Generator & gen)
{ {
typedef typename generator_iterator_generator<Generator>::type result_t; typedef generator_iterator<Generator> result_t;
return result_t(&gen); return result_t(&gen);
} }