generator_iterator.hpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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_GENERATOR_ITERATOR_HPP_INCLUDED_
  11. #define BOOST_ITERATOR_GENERATOR_ITERATOR_HPP_INCLUDED_
  12. #include <memory>
  13. #include <type_traits>
  14. #include <boost/iterator/iterator_facade.hpp>
  15. #include <boost/iterator/iterator_categories.hpp>
  16. namespace boost {
  17. namespace iterators {
  18. template< typename Generator >
  19. class generator_iterator :
  20. public iterator_facade<
  21. generator_iterator< Generator >,
  22. decltype(std::declval< Generator& >()()),
  23. single_pass_traversal_tag,
  24. decltype(std::declval< Generator& >()()) const&
  25. >
  26. {
  27. friend class iterator_core_access;
  28. private:
  29. using super_t = iterator_facade<
  30. generator_iterator< Generator >,
  31. decltype(std::declval< Generator& >()()),
  32. single_pass_traversal_tag,
  33. decltype(std::declval< Generator& >()()) const&
  34. >;
  35. public:
  36. generator_iterator() :
  37. m_g(nullptr),
  38. m_value()
  39. {}
  40. generator_iterator(Generator* g) :
  41. m_g(g),
  42. m_value((*m_g)())
  43. {}
  44. private:
  45. void increment()
  46. {
  47. m_value = (*m_g)();
  48. }
  49. typename super_t::reference dereference() const
  50. {
  51. return m_value;
  52. }
  53. bool equal(generator_iterator const& y) const
  54. {
  55. return m_g == y.m_g && m_value == y.m_value;
  56. }
  57. private:
  58. Generator* m_g;
  59. typename Generator::result_type m_value;
  60. };
  61. template< typename Generator >
  62. struct generator_iterator_generator
  63. {
  64. using type = generator_iterator< Generator >;
  65. };
  66. template< typename Generator >
  67. inline generator_iterator< Generator > make_generator_iterator(Generator& gen)
  68. {
  69. return generator_iterator< Generator >(std::addressof(gen));
  70. }
  71. } // namespace iterators
  72. using iterators::generator_iterator;
  73. using iterators::generator_iterator_generator;
  74. using iterators::make_generator_iterator;
  75. } // namespace boost
  76. #endif // BOOST_ITERATOR_GENERATOR_ITERATOR_HPP_INCLUDED_