diff --git a/include/boost/range/detail/any_iterator_interface.hpp b/include/boost/range/detail/any_iterator_interface.hpp index cd56714..1585805 100644 --- a/include/boost/range/detail/any_iterator_interface.hpp +++ b/include/boost/range/detail/any_iterator_interface.hpp @@ -12,8 +12,7 @@ #include #include -#include -#include +#include #include #include #include @@ -35,15 +34,16 @@ namespace boost }; template - struct mutable_reference_type_generator + struct reference_as_value_type_generator { + typedef typename remove_reference< + typename remove_const::type + >::type value_type; + typedef typename mpl::if_< - typename mpl::and_< - typename is_const::type, - typename mpl::not_::type>::type - >::type, - T, - typename add_reference::type + typename is_convertible::type, + value_type, + T >::type type; }; @@ -53,16 +53,12 @@ namespace boost > struct any_incrementable_iterator_interface { - typedef typename mutable_reference_type_generator< - Reference - >::type reference; - + typedef Reference reference; typedef typename const_reference_type_generator< Reference >::type const_reference; - - typedef typename remove_const< - typename remove_reference::type + typedef typename reference_as_value_type_generator< + Reference >::type reference_as_value_type; typedef Buffer buffer_type; diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index b195926..cd2774e 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -81,6 +81,7 @@ test-suite range : [ range-test adaptor_test/type_erased_forward ] [ range-test adaptor_test/type_erased_bidirectional ] [ range-test adaptor_test/type_erased_random_access ] + [ range-test adaptor_test/type_erased_transformed ] [ range-test adaptor_test/uniqued ] [ range-test adaptor_test/adjacent_filtered_example ] [ range-test adaptor_test/copied_example ] diff --git a/test/adaptor_test/type_erased_transformed.cpp b/test/adaptor_test/type_erased_transformed.cpp new file mode 100644 index 0000000..1b38261 --- /dev/null +++ b/test/adaptor_test/type_erased_transformed.cpp @@ -0,0 +1,67 @@ +// Boost.Range library +// +// Copyright Neil Groves 2014. Use, modification and +// distribution is subject to 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) +// +#include +#include +#include +#include "type_erased_test.hpp" + +#include + +#include + +namespace boost_range_adaptor_type_erased_test +{ + namespace + { + +typedef boost::any_range< + int, + boost::random_access_traversal_tag, + int, + std::ptrdiff_t +> any_integer_value_range; + +struct get_fn +{ + typedef boost::int32_t result_type; + boost::int32_t operator()(const MockType& val) const + { + return val.get(); + } +}; + +int accumulate_any_integer_value_range(any_integer_value_range rng) +{ + return boost::accumulate(rng, 0); +} + +void test_type_erased_transformed() +{ + std::vector v(5, MockType(3)); + + const int sum = accumulate_any_integer_value_range( + v | boost::adaptors::transformed(get_fn())); + + BOOST_CHECK_EQUAL(15, sum); +} + + } // anonymous namespace +} // namespace boost_range_adaptor_type_erased_test + +boost::unit_test::test_suite* +init_unit_test_suite(int, char*[]) +{ + boost::unit_test::test_suite* test + = BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_transformed"); + + test->add( + BOOST_TEST_CASE( + &boost_range_adaptor_type_erased_test::test_type_erased_transformed)); + + return test; +}