fix for recently introduced regression to sub_range const propagation.

This commit is contained in:
Neil Groves
2014-03-04 20:22:57 +00:00
parent e26866d3fa
commit e089e0748f
3 changed files with 286 additions and 39 deletions

View File

@ -18,11 +18,17 @@
#include <boost/range/sub_range.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/test/test_tools.hpp>
#include <iostream>
#include <string>
#include <vector>
namespace boost_range_test
{
namespace
{
void check_sub_range()
{
@ -136,13 +142,107 @@ void check_sub_range()
BOOST_CHECK( rrr == boost::as_literal("HEllo worlD") );
}
#include <boost/test/unit_test.hpp>
boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] )
template<class T>
void check_mutable_type(T&)
{
boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" );
BOOST_STATIC_ASSERT(!boost::is_const<T>::value);
}
test->add( BOOST_TEST_CASE( &check_sub_range ) );
template<class T>
void check_constant_type(T&)
{
BOOST_STATIC_ASSERT(boost::is_const<T>::value);
}
template<class Range, class Iterator>
void check_is_const_iterator(Iterator it)
{
BOOST_STATIC_ASSERT((
boost::is_same<
BOOST_DEDUCED_TYPENAME boost::range_iterator<
BOOST_DEDUCED_TYPENAME boost::add_const<Range>::type
>::type,
Iterator
>::value));
}
template<class Range, class Iterator>
void check_is_iterator(Iterator it)
{
BOOST_STATIC_ASSERT((
boost::is_same<
BOOST_DEDUCED_TYPENAME boost::range_iterator<
BOOST_DEDUCED_TYPENAME boost::remove_const<Range>::type
>::type,
Iterator
>::value));
}
void const_propagation_mutable_collection(void)
{
typedef std::vector<int> coll_t;
typedef boost::sub_range<coll_t> sub_range_t;
coll_t c;
c.push_back(0);
sub_range_t rng(c);
const sub_range_t crng(c);
check_is_iterator<sub_range_t>(rng.begin());
check_is_iterator<sub_range_t>(rng.end());
check_is_const_iterator<sub_range_t>(crng.begin());
check_is_const_iterator<sub_range_t>(crng.end());
check_mutable_type(rng[0]);
check_mutable_type(rng.front());
check_mutable_type(rng.back());
check_constant_type(crng[0]);
check_constant_type(crng.front());
check_constant_type(crng.back());
}
void const_propagation_const_collection(void)
{
typedef std::vector<int> coll_t;
typedef boost::sub_range<const coll_t> sub_range_t;
coll_t c;
c.push_back(0);
sub_range_t rng(c);
const sub_range_t crng(c);
check_is_const_iterator<sub_range_t>(rng.begin());
check_is_const_iterator<sub_range_t>(rng.end());
check_is_const_iterator<sub_range_t>(crng.begin());
check_is_const_iterator<sub_range_t>(crng.end());
check_constant_type(rng[0]);
check_constant_type(rng.front());
check_constant_type(rng.back());
check_constant_type(crng[0]);
check_constant_type(crng.front());
check_constant_type(crng.back());
}
} // anonymous namespace
} // namespace boost_range_test
boost::unit_test::test_suite* init_unit_test_suite(int, char*[])
{
boost::unit_test::test_suite* test =
BOOST_TEST_SUITE( "Boost.Range sub_range test suite" );
test->add(BOOST_TEST_CASE(&boost_range_test::check_sub_range));
test->add(BOOST_TEST_CASE(
&boost_range_test::const_propagation_const_collection));
test->add(BOOST_TEST_CASE(
&boost_range_test::const_propagation_mutable_collection));
return test;
}