forked from boostorg/utility
		
	
		
			
				
	
	
		
			81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // (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
 | |
| 
 |