forked from boostorg/range
[boost][range] - fix for ticket 6888 - unique predicate overloads
[SVN r85686]
This commit is contained in:
74
test/test_driver/range_overload_test_driver.hpp
Normal file
74
test/test_driver/range_overload_test_driver.hpp
Normal file
@ -0,0 +1,74 @@
|
||||
// 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
|
Reference in New Issue
Block a user