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