generator_iterator.hpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. // 15 Nov 2001 Jens Maurer
  8. // created.
  9. // See http://www.boost.org/libs/utility/iterator_adaptors.htm for documentation.
  10. #ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
  11. #define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
  12. #include <boost/iterator/iterator_facade.hpp>
  13. #include <boost/ref.hpp>
  14. namespace boost {
  15. template<class Generator>
  16. class generator_iterator
  17. : public iterator_facade<
  18. generator_iterator<Generator>
  19. , typename Generator::result_type
  20. , single_pass_traversal_tag
  21. , typename Generator::result_type const&
  22. >
  23. {
  24. typedef iterator_facade<
  25. generator_iterator<Generator>
  26. , typename Generator::result_type
  27. , single_pass_traversal_tag
  28. , typename Generator::result_type const&
  29. > super_t;
  30. public:
  31. generator_iterator() {}
  32. generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {}
  33. void increment()
  34. {
  35. m_value = (*m_g)();
  36. }
  37. const typename Generator::result_type&
  38. dereference() const
  39. {
  40. return m_value;
  41. }
  42. bool equal(generator_iterator const& y) const
  43. {
  44. return this->m_g == y.m_g && this->m_value == y.m_value;
  45. }
  46. private:
  47. Generator* m_g;
  48. typename Generator::result_type m_value;
  49. };
  50. template<class Generator>
  51. struct generator_iterator_generator
  52. {
  53. typedef generator_iterator<Generator> type;
  54. };
  55. template <class Generator>
  56. inline generator_iterator<Generator>
  57. make_generator_iterator(Generator & gen)
  58. {
  59. typedef generator_iterator<Generator> result_t;
  60. return result_t(&gen);
  61. }
  62. } // namespace boost
  63. #endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP