#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
{
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