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 @@
Defined in header boost/generator_iterator.hpp
+ "../../boost/iterator/generator_iterator.hpp">boost/iterator/generator_iterator.hppThe 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);
}
+}
#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