// (C) Copyright Jens Maurer 2001. | |
// Distributed under the Boost Software License, Version 1.0. (See | |
// accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
// | |
// Revision History: | |
// 15 Nov 2001 Jens Maurer | |
// created. | |
// See http://www.boost.org/libs/utility/iterator_adaptors.htm for documentation. | |
#ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP | |
#define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP | |
#include <boost/iterator/iterator_facade.hpp> | |
#include <boost/ref.hpp> | |
namespace boost { | |
template<class Generator> | |
class generator_iterator | |
: public iterator_facade< | |
generator_iterator<Generator> | |
, typename Generator::result_type | |
, single_pass_traversal_tag | |
, typename Generator::result_type const& | |
> | |
{ | |
typedef iterator_facade< | |
generator_iterator<Generator> | |
, typename Generator::result_type | |
, single_pass_traversal_tag | |
, typename Generator::result_type const& | |
> super_t; | |
public: | |
generator_iterator() {} | |
generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {} | |
void increment() | |
{ | |
m_value = (*m_g)(); | |
} | |
const typename Generator::result_type& | |
dereference() const | |
{ | |
return m_value; | |
} | |
bool equal(generator_iterator const& y) const | |
{ | |
return this->m_g == y.m_g && this->m_value == y.m_value; | |
} | |
private: | |
Generator* m_g; | |
typename Generator::result_type m_value; | |
}; | |
template<class Generator> | |
struct generator_iterator_generator | |
{ | |
typedef generator_iterator<Generator> type; | |
}; | |
template <class Generator> | |
inline generator_iterator<Generator> | |
make_generator_iterator(Generator & gen) | |
{ | |
typedef generator_iterator<Generator> result_t; | |
return result_t(&gen); | |
} | |
} // namespace boost | |
#endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP | |