1 // Copyright Neil Groves 2013. Use, modification and 2 // distribution is subject to the Boost Software License, Version 3 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 // 6 // 7 // For more information, see http://www.boost.org/libs/range/ 8 // 9 // Acknowledgments: 10 // Implemented by Andy in response to Ticket 6888 - unique fix 11 // 12 #ifndef BOOST_RANGE_TEST_TEST_DRIVER_RANGE_OVERLOAD_TEST_DRIVER_HPP_INCLUDED 13 #define BOOST_RANGE_TEST_TEST_DRIVER_RANGE_OVERLOAD_TEST_DRIVER_HPP_INCLUDED 14 15 #include "range_return_test_driver.hpp" 16 #include <boost/assert.hpp> 17 #include <boost/test/test_tools.hpp> 18 #include <boost/test/unit_test.hpp> 19 20 namespace boost 21 { 22 namespace range_test 23 { 24 25 // A test driver to exercise a test through range_return_test_driver 26 // plus the overload that determines the return_type by overload 27 // 28 // The test driver also contains the code required to check the 29 // return value correctness. 30 // 31 // The TestPolicy needs to implement all those required by 32 // range_return_test_driver, and additionally 33 // 34 // - perform the boost range version of the algorithm that determines 35 // the return_type by overload 36 class range_overload_test_driver : range_return_test_driver 37 { 38 public: 39 template< class Container, 40 class TestPolicy > operator ()(Container & cont,TestPolicy policy)41 void operator()(Container& cont, TestPolicy policy) 42 { 43 range_return_test_driver::operator()(cont, policy); 44 test_range_overload<Container, TestPolicy>()(cont, policy); 45 } 46 47 private: 48 template< class Container, class TestPolicy > 49 struct test_range_overload 50 { operator ()boost::range_test::range_overload_test_driver::test_range_overload51 void operator()(Container& cont, TestPolicy policy) 52 { 53 typedef BOOST_DEDUCED_TYPENAME range_iterator<Container>::type iterator_t; 54 typedef BOOST_DEDUCED_TYPENAME TestPolicy::template test_range_overload<Container> test_range_overload_t; 55 const range_return_value result_type = test_range_overload_t::result_type; 56 typedef BOOST_DEDUCED_TYPENAME range_return<Container, result_type>::type range_return_t; 57 58 Container reference(cont); 59 Container test_cont(cont); 60 61 test_range_overload_t test_range_overload_fn; 62 range_return_t range_result = test_range_overload_fn(policy, test_cont); 63 64 iterator_t reference_it = policy.reference(reference); 65 66 check_results<result_type>::test(test_cont, reference, 67 range_result, reference_it); 68 } 69 }; 70 }; 71 } 72 } 73 74 #endif // include guard