1 | // (C) Copyright Jens Maurer 2001. |
2 | // Distributed under the Boost Software License, Version 1.0. (See |
3 | // accompanying file LICENSE_1_0.txt or copy at |
4 | // http://www.boost.org/LICENSE_1_0.txt) |
5 | // |
6 | // Revision History: |
7 | |
8 | // 15 Nov 2001 Jens Maurer |
9 | // created. |
10 | |
11 | // See http://www.boost.org/libs/utility/iterator_adaptors.htm for documentation. |
12 | |
13 | #ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP |
14 | #define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP |
15 | |
16 | #include <boost/iterator/iterator_facade.hpp> |
17 | #include <boost/ref.hpp> |
18 | |
19 | namespace boost { |
20 | namespace iterators { |
21 | |
22 | template<class Generator> |
23 | class generator_iterator |
24 | : public iterator_facade< |
25 | generator_iterator<Generator> |
26 | , typename Generator::result_type |
27 | , single_pass_traversal_tag |
28 | , typename Generator::result_type const& |
29 | > |
30 | { |
31 | typedef iterator_facade< |
32 | generator_iterator<Generator> |
33 | , typename Generator::result_type |
34 | , single_pass_traversal_tag |
35 | , typename Generator::result_type const& |
36 | > super_t; |
37 | |
38 | public: |
39 | generator_iterator() {} |
40 | generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {} |
41 | |
42 | void increment() |
43 | { |
44 | m_value = (*m_g)(); |
45 | } |
46 | |
47 | const typename Generator::result_type& |
48 | dereference() const |
49 | { |
50 | return m_value; |
51 | } |
52 | |
53 | bool equal(generator_iterator const& y) const |
54 | { |
55 | return this->m_g == y.m_g && this->m_value == y.m_value; |
56 | } |
57 | |
58 | private: |
59 | Generator* m_g; |
60 | typename Generator::result_type m_value; |
61 | }; |
62 | |
63 | template<class Generator> |
64 | struct generator_iterator_generator |
65 | { |
66 | typedef generator_iterator<Generator> type; |
67 | }; |
68 | |
69 | template <class Generator> |
70 | inline generator_iterator<Generator> |
71 | make_generator_iterator(Generator & gen) |
72 | { |
73 | typedef generator_iterator<Generator> result_t; |
74 | return result_t(&gen); |
75 | } |
76 | |
77 | } // namespace iterators |
78 | |
79 | using iterators::generator_iterator; |
80 | using iterators::generator_iterator_generator; |
81 | using iterators::make_generator_iterator; |
82 | |
83 | } // namespace boost |
84 | |
85 | #endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP |
86 | |