Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r80467 - in trunk: boost/iterator libs/iterator/doc libs/iterator/test
From: jeffrey.hellrung_at_[hidden]
Date: 2012-09-09 11:33:14


Author: jeffrey.hellrung
Date: 2012-09-09 11:33:12 EDT (Sun, 09 Sep 2012)
New Revision: 80467
URL: http://svn.boost.org/trac/boost/changeset/80467

Log:
fix #5825; fix #7194
Text files modified:
   trunk/boost/iterator/function_input_iterator.hpp | 24 +++++++++++++++---------
   trunk/libs/iterator/doc/function_input_iterator.rst | 9 ++++++---
   trunk/libs/iterator/test/function_input_iterator_test.cpp | 37 ++++++++++++++++++++++++++++++++++---
   3 files changed, 55 insertions(+), 15 deletions(-)

Modified: trunk/boost/iterator/function_input_iterator.hpp
==============================================================================
--- trunk/boost/iterator/function_input_iterator.hpp (original)
+++ trunk/boost/iterator/function_input_iterator.hpp 2012-09-09 11:33:12 EDT (Sun, 09 Sep 2012)
@@ -1,4 +1,6 @@
 // Copyright 2009 (C) Dean Michael Berris <me_at_[hidden]>
+// Copyright 2012 (C) Google, Inc.
+// Copyright 2012 (C) Jeffrey Lee Hellrung, Jr.
 // 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)
@@ -7,11 +9,14 @@
 #ifndef BOOST_FUNCTION_INPUT_ITERATOR
 #define BOOST_FUNCTION_INPUT_ITERATOR
 
+#include <boost/assert.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/function_types/is_function_pointer.hpp>
 #include <boost/function_types/is_function_reference.hpp>
 #include <boost/function_types/result_type.hpp>
 #include <boost/iterator/iterator_facade.hpp>
+#include <boost/none.hpp>
+#include <boost/optional/optional.hpp>
 
 namespace boost {
 
@@ -29,16 +34,17 @@
         public:
             function_input_iterator() {}
             function_input_iterator(Function & f_, Input state_ = Input())
- : f(&f_), state(state_), value((*f)()) {}
+ : f(&f_), state(state_) {}
 
             void increment() {
- value = (*f)();
+ BOOST_ASSERT(value);
+ value = none;
                 ++state;
             }
 
             typename Function::result_type const &
                 dereference() const {
- return value;
+ return (value ? value : value = (*f)()).get();
             }
 
             bool equal(function_input_iterator const & other) const {
@@ -48,7 +54,7 @@
         private:
             Function * f;
             Input state;
- typename Function::result_type value;
+ mutable optional<typename Function::result_type> value;
         };
 
         template <class Function, class Input>
@@ -63,17 +69,17 @@
         public:
             function_pointer_input_iterator() {}
             function_pointer_input_iterator(Function &f_, Input state_ = Input())
- : f(f_), state(state_), value((*f)())
- {}
+ : f(f_), state(state_) {}
 
             void increment() {
- value = (*f)();
+ BOOST_ASSERT(value);
+ value = none;
                 ++state;
             }
 
             typename function_types::result_type<Function>::type const &
                 dereference() const {
- return value;
+ return (value ? value : value = (*f)()).get();
             }
 
             bool equal(function_pointer_input_iterator const & other) const {
@@ -83,7 +89,7 @@
         private:
             Function f;
             Input state;
- typename function_types::result_type<Function>::type value;
+ mutable optional<typename function_types::result_type<Function>::type> value;
         };
 
         template <class Function, class Input>

Modified: trunk/libs/iterator/doc/function_input_iterator.rst
==============================================================================
--- trunk/libs/iterator/doc/function_input_iterator.rst (original)
+++ trunk/libs/iterator/doc/function_input_iterator.rst 2012-09-09 11:33:12 EDT (Sun, 09 Sep 2012)
@@ -1,10 +1,13 @@
 :Author:
- `Dean Michael Berris <mailto:mikhailberis_at_[hidden]>`_
+ `Dean Michael Berris <mailto:me_at_[hidden]>`_
 
 :License:
     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)
 
+:Copyright:
+ Copyright 2012 Google, Inc.
+
 Function Input Iterator
 =======================
 
@@ -58,7 +61,7 @@
 
         template <class Function, class State>
         typename function_input_iterator<Function, State>
- make_function_input_iterator(Function & f);
+ make_function_input_iterator(Function & f, State s);
 
         struct infinite;
     }
@@ -112,7 +115,7 @@
     copy(
             make_function_input_iterator(f,infinite()),
             make_function_input_iterator(f,infinite()),
- ostream_iterator<int>(count, " ")
+ ostream_iterator<int>(cout, " ")
         );
    
 Above, instead of creating a huge vector we rely on the STL copy algorithm

Modified: trunk/libs/iterator/test/function_input_iterator_test.cpp
==============================================================================
--- trunk/libs/iterator/test/function_input_iterator_test.cpp (original)
+++ trunk/libs/iterator/test/function_input_iterator_test.cpp 2012-09-09 11:33:12 EDT (Sun, 09 Sep 2012)
@@ -3,12 +3,17 @@
 // (See accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
 
-#include <boost/iterator/function_input_iterator.hpp>
-#include <vector>
-#include <iterator>
 #include <cassert>
+#include <cstddef>
+
 #include <algorithm>
 #include <iostream>
+#include <iterator>
+#include <vector>
+
+#include <boost/iterator/function_input_iterator.hpp>
+
+namespace {
 
 struct ones {
     typedef int result_type;
@@ -21,6 +26,17 @@
     return 1;
 }
 
+struct counter {
+ typedef int result_type;
+ int n;
+ explicit counter(int n_) : n(n_) { }
+ result_type operator() () {
+ return n++;
+ }
+};
+
+} // namespace
+
 using namespace std;
 
 int main(int argc, char * argv[])
@@ -65,6 +81,21 @@
     assert(equal(values.begin(), values.end(), generated.begin()));
     cout << "function iterator test with reference to function successful." << endl;
 
+ // test the iterator with a stateful function object
+ counter counter_generator(42);
+ vector<int>().swap(generated);
+ copy(
+ boost::make_function_input_iterator(counter_generator, 0),
+ boost::make_function_input_iterator(counter_generator, 10),
+ back_inserter(generated)
+ );
+
+ assert(generated.size() == 10);
+ assert(counter_generator.n == 42 + 10);
+ for(std::size_t i = 0; i != 10; ++i)
+ assert(generated[i] == 42 + i);
+ cout << "function iterator test with stateful function object successful." << endl;
+
     return 0;
 }
 


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk