diff --git a/doc/generator_iterator.htm b/doc/generator_iterator.htm index b0e376e..6f50f6c 100644 --- a/doc/generator_iterator.htm +++ b/doc/generator_iterator.htm @@ -15,7 +15,7 @@

Generator Iterator Adaptor

Defined in header boost/generator_iterator.hpp

+ "../../boost/iterator/generator_iterator.hpp">boost/iterator/generator_iterator.hpp

The generator iterator adaptor makes it easier to create custom input iterators from 0-ary functions and function objects. The adaptor takes a @@ -33,9 +33,7 @@

 namespace boost {
-  template <class Generator>
-  class generator_iterator_policies;
-
+namespace iterators {
   template <class Generator>
   class generator_iterator_generator;
 
@@ -43,6 +41,7 @@ namespace boost {
   typename generator_iterator_generator<Generator>::type
   make_generator_iterator(Generator & gen);
 }
+}
 

@@ -60,8 +59,8 @@ template <class Generator> class generator_iterator_generator { public: - typedef unspecified type; // the resulting generator iterator type -} + using type = unspecified; // the resulting generator iterator type +};

Template Parameters

@@ -78,8 +77,8 @@ public: "http://www.sgi.com/tech/stl/Generator.html">Generator The generator (0-ary function object) type being wrapped. The - return type of the function must be defined as - Generator::result_type. The function object must be a model of + return type of the function is deduced automatically from its + operator(). The function object must be a model of Generator. @@ -122,14 +121,14 @@ make_generator_iterator(Generator & gen);
 #include <iostream>
-#include <boost/generator_iterator.hpp>
+#include <boost/iterators/generator_iterator.hpp>
 
 class my_generator
 {
 public:
-  typedef int result_type;
+  using result_type = int;
   my_generator() : state(0) { }
-  int operator()() { return ++state; }
+  result_type operator()() { return ++state; }
 private:
   int state;
 };
@@ -137,7 +136,7 @@ private:
 int main()
 {
   my_generator gen;
-  boost::generator_iterator_generator<my_generator>::type it = boost::make_generator_iterator(gen);
+  auto it = boost::iterators::make_generator_iterator(gen);
   for(int i = 0; i < 10; ++i, ++it)
     std::cout << *it << std::endl;
 }
diff --git a/include/boost/generator_iterator.hpp b/include/boost/generator_iterator.hpp
index e5c2459..57dfecc 100644
--- a/include/boost/generator_iterator.hpp
+++ b/include/boost/generator_iterator.hpp
@@ -1,85 +1,14 @@
-// (C) Copyright Jens Maurer 2001.
+// (C) Copyright Andrey Semashev 2025.
 // 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 
-#include 
+// This is a deprecated header left for backward compatibility.
+// Please use  instead.
 
-namespace boost {
-namespace iterators {
-
-template
-class generator_iterator
-  : public iterator_facade<
-        generator_iterator
-      , typename Generator::result_type
-      , single_pass_traversal_tag
-      , typename Generator::result_type const&
-    >
-{
-    typedef iterator_facade<
-        generator_iterator
-      , 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
-struct generator_iterator_generator
-{
-  typedef generator_iterator type;
-};
-
-template 
-inline generator_iterator
-make_generator_iterator(Generator& gen)
-{
-  typedef generator_iterator result_t;
-  return result_t(&gen);
-}
-
-} // namespace iterators
-
-using iterators::generator_iterator;
-using iterators::generator_iterator_generator;
-using iterators::make_generator_iterator;
-
-} // namespace boost
+#include 
 
 #endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
diff --git a/include/boost/iterator/generator_iterator.hpp b/include/boost/iterator/generator_iterator.hpp
new file mode 100644
index 0000000..3a57ef7
--- /dev/null
+++ b/include/boost/iterator/generator_iterator.hpp
@@ -0,0 +1,96 @@
+// (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_GENERATOR_ITERATOR_HPP_INCLUDED_
+#define BOOST_ITERATOR_GENERATOR_ITERATOR_HPP_INCLUDED_
+
+#include 
+#include 
+
+#include 
+#include 
+
+namespace boost {
+namespace iterators {
+
+template< typename Generator >
+class generator_iterator :
+    public iterator_facade<
+        generator_iterator< Generator >,
+        decltype(std::declval< Generator& >()()),
+        single_pass_traversal_tag,
+        decltype(std::declval< Generator& >()()) const&
+    >
+{
+    friend class iterator_core_access;
+
+private:
+    using super_t = iterator_facade<
+        generator_iterator< Generator >,
+        decltype(std::declval< Generator& >()()),
+        single_pass_traversal_tag,
+        decltype(std::declval< Generator& >()()) const&
+    >;
+
+public:
+    generator_iterator() :
+        m_g(nullptr),
+        m_value()
+    {}
+
+    generator_iterator(Generator* g) :
+        m_g(g),
+        m_value((*m_g)())
+    {}
+
+private:
+    void increment()
+    {
+        m_value = (*m_g)();
+    }
+
+    typename super_t::reference dereference() const
+    {
+        return m_value;
+    }
+
+    bool equal(generator_iterator const& y) const
+    {
+        return m_g == y.m_g && m_value == y.m_value;
+    }
+
+private:
+    Generator* m_g;
+    typename Generator::result_type m_value;
+};
+
+template< typename Generator >
+struct generator_iterator_generator
+{
+    using type = generator_iterator< Generator >;
+};
+
+template< typename Generator >
+inline generator_iterator< Generator > make_generator_iterator(Generator& gen)
+{
+    return generator_iterator< Generator >(std::addressof(gen));
+}
+
+} // namespace iterators
+
+using iterators::generator_iterator;
+using iterators::generator_iterator_generator;
+using iterators::make_generator_iterator;
+
+} // namespace boost
+
+#endif // BOOST_ITERATOR_GENERATOR_ITERATOR_HPP_INCLUDED_
diff --git a/test/generator_iterator_test.cpp b/test/generator_iterator_test.cpp
index c31bd66..51173a6 100644
--- a/test/generator_iterator_test.cpp
+++ b/test/generator_iterator_test.cpp
@@ -6,7 +6,7 @@
 // http://www.boost.org/LICENSE_1_0.txt
 //
 
-#include 
+#include 
 #include 
 #include 
 
diff --git a/test/test_cmake/main.cpp b/test/test_cmake/main.cpp
index 21de84f..ea4f74d 100644
--- a/test/test_cmake/main.cpp
+++ b/test/test_cmake/main.cpp
@@ -4,7 +4,6 @@
 //  See accompanying file LICENSE_1_0.txt or copy at
 //  https://www.boost.org/LICENSE_1_0.txt)
 
-#include 
 #include 
 #include 
 #include 
@@ -15,6 +14,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include