blob: e4b2ce787d169901ddde0f5e872740eb34b4352d [file] [log] [blame]
// 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