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