// (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



