|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r62625 - in trunk: boost/iterator libs/iterator/test
From: jewillco_at_[hidden]
Date: 2010-06-08 21:08:45
Author: jewillco
Date: 2010-06-08 21:08:45 EDT (Tue, 08 Jun 2010)
New Revision: 62625
URL: http://svn.boost.org/trac/boost/changeset/62625
Log:
Applied patches from #1427; fixes #1427
Text files modified:
trunk/boost/iterator/transform_iterator.hpp | 27 +++++++--------------------
trunk/libs/iterator/test/transform_iterator_test.cpp | 30 ++++++++++++++++++++++++++++++
2 files changed, 37 insertions(+), 20 deletions(-)
Modified: trunk/boost/iterator/transform_iterator.hpp
==============================================================================
--- trunk/boost/iterator/transform_iterator.hpp (original)
+++ trunk/boost/iterator/transform_iterator.hpp 2010-06-08 21:08:45 EDT (Tue, 08 Jun 2010)
@@ -20,6 +20,8 @@
#include <boost/type_traits/is_reference.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/result_of.hpp>
+
#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
# include <boost/type_traits/is_base_and_derived.hpp>
@@ -35,33 +37,18 @@
namespace detail
{
-
- template <class UnaryFunc>
- struct function_object_result
- {
- typedef typename UnaryFunc::result_type type;
- };
-
-#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- template <class Return, class Argument>
- struct function_object_result<Return(*)(Argument)>
- {
- typedef Return type;
- };
-#endif
-
// Compute the iterator_adaptor instantiation to be used for transform_iterator
template <class UnaryFunc, class Iterator, class Reference, class Value>
struct transform_iterator_base
{
private:
+ typedef typename std::iterator_traits<Iterator>::reference Arg1;
+
// By default, dereferencing the iterator yields the same as
- // the function. Do we need to adjust the way
- // function_object_result is computed for the standard
- // proposal (e.g. using Doug's result_of)?
+ // the function.
typedef typename ia_dflt_help<
Reference
- , function_object_result<UnaryFunc>
+ , result_of<UnaryFunc(typename std::iterator_traits<Iterator>::value_type)>
>::type reference;
// To get the default for Value: remove any reference on the
@@ -113,7 +100,7 @@
#endif
}
- template<
+ template <
class OtherUnaryFunction
, class OtherIterator
, class OtherReference
Modified: trunk/libs/iterator/test/transform_iterator_test.cpp
==============================================================================
--- trunk/libs/iterator/test/transform_iterator_test.cpp (original)
+++ trunk/libs/iterator/test/transform_iterator_test.cpp 2010-06-08 21:08:45 EDT (Tue, 08 Jun 2010)
@@ -102,6 +102,16 @@
return arg*2;
}
+struct polymorphic_mult_functor
+{
+ //Implement result_of protocol
+ template <class FArgs> struct result;
+ template <class F, class T> struct result<F(T)> {typedef T type;};
+
+ template <class T>
+ typename result<polymorphic_mult_functor(T)>::type
+ operator()(const T& _arg) const {return _arg*2;}
+};
int
main()
@@ -244,5 +254,25 @@
);
}
+ // Test transform_iterator with polymorphic object function
+ {
+ int x[N], y[N];
+ for (int k = 0; k < N; ++k)
+ x[k] = k;
+ std::copy(x, x + N, y);
+
+ for (int k2 = 0; k2 < N; ++k2)
+ x[k2] = x[k2] * 2;
+
+ boost::input_iterator_test(
+ boost::make_transform_iterator(y, polymorphic_mult_functor()), x[0], x[1]);
+
+ boost::input_iterator_test(
+ boost::make_transform_iterator(&y[0], polymorphic_mult_functor()), x[0], x[1]);
+
+ boost::random_access_readable_iterator_test(
+ boost::make_transform_iterator(y, polymorphic_mult_functor()), N, x);
+ }
+
return boost::report_errors();
}
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