diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 9a8a5e0..82b152b 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -52,6 +52,7 @@ test-suite range : [ range-test adaptor_test/type_erased ] [ range-test adaptor_test/type_erased_abstract ] [ range-test adaptor_test/type_erased_brackets ] + [ range-test adaptor_test/type_erased_mix_values ] [ 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.cpp b/test/adaptor_test/type_erased.cpp index 80bed09..3163998 100644 --- a/test/adaptor_test/type_erased.cpp +++ b/test/adaptor_test/type_erased.cpp @@ -23,159 +23,143 @@ namespace boost_range_adaptor_type_erased_test { - - void test_type_erased() + namespace { - test_driver< std::list >(); - test_driver< std::vector >(); - test_driver< std::list >(); - test_driver< std::vector >(); - } - - void test_type_erased_single_pass() - { - test_type_erased_exercise_buffer_types< std::list, boost::single_pass_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::deque, boost::single_pass_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::vector, boost::single_pass_traversal_tag >(); - - test_type_erased_exercise_buffer_types< std::list, boost::single_pass_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::deque, boost::single_pass_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::vector, boost::single_pass_traversal_tag >(); - } - - void test_type_erased_forward() - { - test_type_erased_exercise_buffer_types< std::list, boost::forward_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::deque, boost::forward_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::vector, boost::forward_traversal_tag >(); - - test_type_erased_exercise_buffer_types< std::list, boost::forward_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::deque, boost::forward_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::vector, boost::forward_traversal_tag >(); - } - - void test_type_erased_bidirectional() - { - test_type_erased_exercise_buffer_types< std::list, boost::bidirectional_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::deque, boost::bidirectional_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::vector, boost::bidirectional_traversal_tag >(); - - test_type_erased_exercise_buffer_types< std::list, boost::bidirectional_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::deque, boost::bidirectional_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::vector, boost::bidirectional_traversal_tag >(); - } - - void test_type_erased_random_access() - { - test_type_erased_exercise_buffer_types< std::deque, boost::random_access_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::vector, boost::random_access_traversal_tag >(); - - test_type_erased_exercise_buffer_types< std::deque, boost::random_access_traversal_tag >(); - test_type_erased_exercise_buffer_types< std::vector, boost::random_access_traversal_tag >(); - } - - void test_type_erased_multiple_different_template_parameter_conversion() - { - typedef boost::any_range< - int - , boost::random_access_traversal_tag - , int& - , std::ptrdiff_t - > source_range_type; - - typedef boost::any_range< - int - , boost::single_pass_traversal_tag - , const int& - , std::ptrdiff_t - > target_range_type; - - source_range_type source; - - // Converting via construction - target_range_type t1(source); - - // Converting via assignment - target_range_type t2; - t2 = source; - - // Converting via construction to a type with a reference type - // that is a value - typedef boost::any_range< - int - , boost::single_pass_traversal_tag - , int - , std::ptrdiff_t - > target_range2_type; - - target_range2_type t3(source); - target_range2_type t4; - t4 = source; - } - - template< - class Traversal - , class ValueType - , class SourceValueType - , class SourceReference - , class TargetValueType - , class TargetReference - > - void test_type_erased_mix_values_impl() - { - typedef std::vector< ValueType > Container; - - typedef typename boost::any_range_type_generator< - Container - , SourceValueType - , Traversal - , SourceReference - >::type source_type; - - typedef typename boost::any_range_type_generator< - Container - , TargetValueType - , Traversal - , TargetReference - >::type target_type; - - Container test_data; - for (int i = 0; i < 10; ++i) - test_data.push_back(i); - - const source_type source_data(test_data); - target_type t1(source_data); - BOOST_CHECK_EQUAL_COLLECTIONS( source_data.begin(), source_data.end(), - t1.begin(), t1.end() ); - - target_type t2; - t2 = source_data; - BOOST_CHECK_EQUAL_COLLECTIONS( source_data.begin(), source_data.end(), - t2.begin(), t2.end() ); - } - - template - void test_type_erased_mix_values_driver() - { - test_type_erased_mix_values_impl< - Traversal, - MockType, - MockType2, const MockType&, - MockType, const MockType& - >(); - } - - void test_type_erased_mix_values() - { - test_type_erased_mix_values_driver< boost::single_pass_traversal_tag >(); - test_type_erased_mix_values_driver< boost::forward_traversal_tag >(); - test_type_erased_mix_values_driver< boost::bidirectional_traversal_tag >(); - test_type_erased_mix_values_driver< boost::random_access_traversal_tag >(); - } +void test_type_erased() +{ + test_driver< std::list >(); + test_driver< std::vector >(); + test_driver< std::list >(); + test_driver< std::vector >(); } +void test_type_erased_single_pass() +{ + test_type_erased_exercise_buffer_types< std::list, boost::single_pass_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::deque, boost::single_pass_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::vector, boost::single_pass_traversal_tag >(); + + test_type_erased_exercise_buffer_types< std::list, boost::single_pass_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::deque, boost::single_pass_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::vector, boost::single_pass_traversal_tag >(); +} + +void test_type_erased_forward() +{ + test_type_erased_exercise_buffer_types< std::list, boost::forward_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::deque, boost::forward_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::vector, boost::forward_traversal_tag >(); + + test_type_erased_exercise_buffer_types< std::list, boost::forward_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::deque, boost::forward_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::vector, boost::forward_traversal_tag >(); +} + +void test_type_erased_bidirectional() +{ + test_type_erased_exercise_buffer_types< std::list, boost::bidirectional_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::deque, boost::bidirectional_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::vector, boost::bidirectional_traversal_tag >(); + + test_type_erased_exercise_buffer_types< std::list, boost::bidirectional_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::deque, boost::bidirectional_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::vector, boost::bidirectional_traversal_tag >(); +} + +void test_type_erased_random_access() +{ + test_type_erased_exercise_buffer_types< std::deque, boost::random_access_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::vector, boost::random_access_traversal_tag >(); + + test_type_erased_exercise_buffer_types< std::deque, boost::random_access_traversal_tag >(); + test_type_erased_exercise_buffer_types< std::vector, boost::random_access_traversal_tag >(); +} + +void test_type_erased_multiple_different_template_parameter_conversion() +{ + typedef boost::any_range< + int + , boost::random_access_traversal_tag + , int& + , std::ptrdiff_t + > source_range_type; + + typedef boost::any_range< + int + , boost::single_pass_traversal_tag + , const int& + , std::ptrdiff_t + > target_range_type; + + source_range_type source; + + // Converting via construction + target_range_type t1(source); + + // Converting via assignment + target_range_type t2; + t2 = source; + + // Converting via construction to a type with a reference type + // that is a value + typedef boost::any_range< + int + , boost::single_pass_traversal_tag + , int + , std::ptrdiff_t + > target_range2_type; + + target_range2_type t3(source); + target_range2_type t4; + t4 = source; +} + +template< + class Traversal + , class ValueType + , class SourceValueType + , class SourceReference + , class TargetValueType + , class TargetReference +> +void test_type_erased_mix_values_impl() +{ + typedef std::vector< ValueType > Container; + + typedef typename boost::any_range_type_generator< + Container + , SourceValueType + , Traversal + , SourceReference + >::type source_type; + + typedef typename boost::any_range_type_generator< + Container + , TargetValueType + , Traversal + , TargetReference + >::type target_type; + + Container test_data; + for (int i = 0; i < 10; ++i) + test_data.push_back(i); + + const source_type source_data(test_data); + target_type t1(source_data); + BOOST_CHECK_EQUAL_COLLECTIONS( source_data.begin(), source_data.end(), + t1.begin(), t1.end() ); + + target_type t2; + t2 = source_data; + BOOST_CHECK_EQUAL_COLLECTIONS( source_data.begin(), source_data.end(), + t2.begin(), t2.end() ); +} + + } // anonymous namespace +} // namespace boost_range_adaptor_type_erased_test + boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[]) { @@ -188,7 +172,6 @@ init_unit_test_suite(int argc, char* argv[]) test->add( BOOST_TEST_CASE( &boost_range_adaptor_type_erased_test::test_type_erased_bidirectional ) ); test->add( BOOST_TEST_CASE( &boost_range_adaptor_type_erased_test::test_type_erased_random_access ) ); test->add( BOOST_TEST_CASE( &boost_range_adaptor_type_erased_test::test_type_erased_multiple_different_template_parameter_conversion ) ); - test->add( BOOST_TEST_CASE( &boost_range_adaptor_type_erased_test::test_type_erased_mix_values ) ); return test; } diff --git a/test/adaptor_test/type_erased_mix_values.cpp b/test/adaptor_test/type_erased_mix_values.cpp new file mode 100644 index 0000000..ae5fe84 --- /dev/null +++ b/test/adaptor_test/type_erased_mix_values.cpp @@ -0,0 +1,101 @@ +// 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 "type_erased_test.hpp" + +#include + +#include +#include +#include + +#include +#include +#include +#include + +namespace boost_range_adaptor_type_erased_test +{ + namespace + { + +template< + class Traversal + , class ValueType + , class SourceValueType + , class SourceReference + , class TargetValueType + , class TargetReference +> +void mix_values_impl() +{ + typedef std::vector< ValueType > Container; + + typedef typename boost::any_range_type_generator< + Container + , SourceValueType + , Traversal + , SourceReference + >::type source_type; + + typedef typename boost::any_range_type_generator< + Container + , TargetValueType + , Traversal + , TargetReference + >::type target_type; + + Container test_data; + for (int i = 0; i < 10; ++i) + test_data.push_back(i); + + const source_type source_data(test_data); + target_type t1(source_data); + BOOST_CHECK_EQUAL_COLLECTIONS( source_data.begin(), source_data.end(), + t1.begin(), t1.end() ); + + target_type t2; + t2 = source_data; + BOOST_CHECK_EQUAL_COLLECTIONS( source_data.begin(), source_data.end(), + t2.begin(), t2.end() ); +} + +template +void mix_values_driver() +{ + mix_values_impl< + Traversal, + MockType, + MockType2, const MockType&, + MockType, const MockType& + >(); +} + +void mix_values() +{ + mix_values_driver< boost::single_pass_traversal_tag >(); + mix_values_driver< boost::forward_traversal_tag >(); + mix_values_driver< boost::bidirectional_traversal_tag >(); + mix_values_driver< boost::random_access_traversal_tag >(); +} + + } // anonymous namespace +} // namespace boost_range_adaptor_type_erased_test + +boost::unit_test::test_suite* +init_unit_test_suite(int argc, char* argv[]) +{ + boost::unit_test::test_suite* test = + BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_mix_values"); + + test->add(BOOST_TEST_CASE( + &boost_range_adaptor_type_erased_test::mix_values)); + + return test; +} +