From 3e9d0f80c2ef25c0b409e5a61b688e5360ec374c Mon Sep 17 00:00:00 2001 From: Jens Maurer Date: Mon, 19 Nov 2001 22:11:51 +0000 Subject: [PATCH] add generator iterator adaptor [SVN r11736] --- generator_iterator.htm | 150 ++++++++++++++++++++++++++++++++++++++ iterator_adaptor_test.cpp | 22 ++++++ iterator_adaptors.htm | 6 +- 3 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 generator_iterator.htm diff --git a/generator_iterator.htm b/generator_iterator.htm new file mode 100644 index 0000000..76b94ed --- /dev/null +++ b/generator_iterator.htm @@ -0,0 +1,150 @@ + + + + +Generator Iterator Adaptor Documentation + + + + +c++boost.gif (8819 bytes) + +

Generator Iterator Adaptor

+Defined in header boost/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 +Generator +and creates a model of +Input Iterator. +Each increment retrieves an item from the generator and makes it +available to be retrieved by dereferencing. The motivation for this +iterator is that some concepts can be more naturally expressed as a +generator, while most STL algorithms expect an iterator. An example +is the Random Number library. + +

Synopsis

+ +
+
+namespace boost {
+  template <class Generator>
+  class generator_iterator_policies;
+
+  template <class Generator>
+  class generator_iterator_generator;
+
+  template <class Generator>
+  typename generator_iterator_generator<Generator>::type
+  make_generator_iterator(Generator & gen);
+}
+
+
+ +
+ +

The Generator Iterator Generator Class

+ +The class generator_iterator_generator is a helper class whose purpose +is to construct a generator iterator type. The template parameter for +this class is the Generator function object type that is being +wrapped. The generator iterator adaptor only holds a reference (or +pointer) to the function object, therefore the function object must +outlive the generator iterator adaptor constructed from it. + +
+template <class Generator>
+class generator_iterator_generator
+{
+public:
+  typedef iterator_adaptor<...> type; // the resulting generator iterator type 
+}
+
+ + +

Template Parameters

+ + + + + + + + + +
ParameterDescription
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 +Generator. +
+ +

Concept Model

+The generator iterator class is a model of +Input Iterator. + +

Members

+The generator iterator implements the member functions +and operators required of the +Input Iterator +concept. + +
+ +
+

The Generator Iterator Object Generator

+ +The make_generator_iterator() function provides a +convenient way to create generator iterator objects. The function +saves the user the trouble of explicitly writing out the iterator +types. + +
+
+template <class Generator>
+typename generator_iterator_generator<Generator>::type
+make_function_output_iterator(Generator & gen);
+
+
+ +
+ + +

Example

+ +The following program shows how generator_iterator +transforms a generator into an input iterator. + +
+
+#include <iostream>
+#include <boost/generator_iterator.hpp>
+
+class my_generator
+{
+public:
+  typedef int result_type;
+  my_generator() : state(0) { }
+  int operator()() { return ++state; }
+private:
+  int state;
+};
+
+int main()
+{
+  my_generator gen;
+  boost::generator_iterator<my_generator> it(gen);
+  for(int i = 0; i < 10; ++i, ++it)
+    std::cout << *it << std::endl;
+}
+
+
+ +
+ +Written by Jens Maurer. + + + diff --git a/iterator_adaptor_test.cpp b/iterator_adaptor_test.cpp index aa7600b..629aac0 100644 --- a/iterator_adaptor_test.cpp +++ b/iterator_adaptor_test.cpp @@ -9,6 +9,7 @@ // See http://www.boost.org for most recent version including documentation. // Revision History +// 19 Nov 01 Added generator_iterator. (Jens Maurer) // 04 Nov 01 Updated with respect to change in named parameters. // (Jeremy Siek) // 08 Mar 01 Moved indirect and transform tests to separate files. @@ -51,6 +52,7 @@ #include #include +#include #include #include #include @@ -105,6 +107,14 @@ template struct foo; void blah(int) { } +struct my_gen +{ + typedef int result_type; + my_gen() : n(0) { } + int operator()() { return ++n; } + int n; +}; + int main() { @@ -382,6 +392,18 @@ main() if (zero) // don't do this, just make sure it compiles assert((*i).m_x == i->foo()); } + + { + // check generator_iterator + my_gen g1; + boost::generator_iterator_generator::type gen = + boost::make_generator_iterator(g1); + assert(*gen == 1); + ++gen; + gen++; + assert(*gen == 3); + } + std::cout << "test successful " << std::endl; return 0; } diff --git a/iterator_adaptors.htm b/iterator_adaptors.htm index 2b6c7a5..af3211b 100644 --- a/iterator_adaptors.htm +++ b/iterator_adaptors.htm @@ -122,6 +122,8 @@ "../../boost/function_output_iterator.hpp">boost/function_output_iterator.hpp
Function Output Iterator Adaptor +
  • Header boost/generator_iterator.hpp
    + Generator Iterator Adaptor

    Dave @@ -145,7 +147,9 @@ "filter_iterator.htm">filter_ iterator generators and made some simplifications to the main iterator_adaptor template.
    - + Jens Maurer + contributed the generator iterator + adaptor.

    Class template iterator_adaptor