|
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