86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // (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 { | ||
|  | namespace iterators { | ||
|  | 
 | ||
|  | 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 iterators | ||
|  | 
 | ||
|  | using iterators::generator_iterator; | ||
|  | using iterators::generator_iterator_generator; | ||
|  | using iterators::make_generator_iterator; | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP |