1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // Copyright Neil Groves 2013. 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)
- //
- //
- // For more information, see http://www.boost.org/libs/range/
- //
- // Acknowledgments:
- // Implemented by Andy in response to Ticket 6888 - unique fix
- //
- #ifndef BOOST_RANGE_TEST_TEST_DRIVER_RANGE_OVERLOAD_TEST_DRIVER_HPP_INCLUDED
- #define BOOST_RANGE_TEST_TEST_DRIVER_RANGE_OVERLOAD_TEST_DRIVER_HPP_INCLUDED
-
- #include "range_return_test_driver.hpp"
- #include <boost/assert.hpp>
- #include <boost/test/test_tools.hpp>
- #include <boost/test/unit_test.hpp>
-
- namespace boost
- {
- namespace range_test
- {
-
- // A test driver to exercise a test through range_return_test_driver
- // plus the overload that determines the return_type by overload
- //
- // The test driver also contains the code required to check the
- // return value correctness.
- //
- // The TestPolicy needs to implement all those required by
- // range_return_test_driver, and additionally
- //
- // - perform the boost range version of the algorithm that determines
- // the return_type by overload
- class range_overload_test_driver : range_return_test_driver
- {
- public:
- template< class Container,
- class TestPolicy >
- void operator()(Container& cont, TestPolicy policy)
- {
- range_return_test_driver::operator()(cont, policy);
- test_range_overload<Container, TestPolicy>()(cont, policy);
- }
-
- private:
- template< class Container, class TestPolicy >
- struct test_range_overload
- {
- void operator()(Container& cont, TestPolicy policy)
- {
- typedef BOOST_DEDUCED_TYPENAME range_iterator<Container>::type iterator_t;
- typedef BOOST_DEDUCED_TYPENAME TestPolicy::template test_range_overload<Container> test_range_overload_t;
- const range_return_value result_type = test_range_overload_t::result_type;
- typedef BOOST_DEDUCED_TYPENAME range_return<Container, result_type>::type range_return_t;
-
- Container reference(cont);
- Container test_cont(cont);
-
- test_range_overload_t test_range_overload_fn;
- range_return_t range_result = test_range_overload_fn(policy, test_cont);
-
- iterator_t reference_it = policy.reference(reference);
-
- check_results<result_type>::test(test_cont, reference,
- range_result, reference_it);
- }
- };
- };
- }
- }
-
- #endif // include guard
|