forked from boostorg/range
Boost.Range - removed unnecessary code from the sliced adaptor.
Added a unit test to test the use of a non-member function as a transform functor and composition of strided, sliced and transformed range adaptors. [SVN r61404]
This commit is contained in:
@ -38,17 +38,6 @@ namespace boost
|
|||||||
return boost::make_iterator_range( rng, t, u - boost::size(rng) );
|
return boost::make_iterator_range( rng, t, u - boost::size(rng) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template< class RandomAccessRange >
|
|
||||||
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<const RandomAccessRange>::type >
|
|
||||||
slice( const RandomAccessRange& rng, std::size_t t, std::size_t u )
|
|
||||||
{
|
|
||||||
BOOST_ASSERT( t <= u && "error in slice indices" );
|
|
||||||
BOOST_ASSERT( static_cast<std::size_t>(boost::size(rng)) >= u &&
|
|
||||||
"second slice index out of bounds" );
|
|
||||||
|
|
||||||
return boost::make_iterator_range( rng, t, u - boost::size(rng) );
|
|
||||||
}
|
|
||||||
|
|
||||||
template< class RandomAccessRange >
|
template< class RandomAccessRange >
|
||||||
inline iterator_range<
|
inline iterator_range<
|
||||||
BOOST_DEDUCED_TYPENAME range_iterator<RandomAccessRange>::type >
|
BOOST_DEDUCED_TYPENAME range_iterator<RandomAccessRange>::type >
|
||||||
@ -57,14 +46,6 @@ namespace boost
|
|||||||
return adaptors::slice( r, f.t, f.u );
|
return adaptors::slice( r, f.t, f.u );
|
||||||
}
|
}
|
||||||
|
|
||||||
template< class RandomAccessRange >
|
|
||||||
inline iterator_range<
|
|
||||||
BOOST_DEDUCED_TYPENAME range_iterator<const RandomAccessRange>::type >
|
|
||||||
operator|( const RandomAccessRange& r, const sliced& f )
|
|
||||||
{
|
|
||||||
return adaptors::slice( r, f.t, f.u );
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace adaptors
|
} // namespace adaptors
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ test-suite range :
|
|||||||
[ range-test adaptor_test/reversed ]
|
[ range-test adaptor_test/reversed ]
|
||||||
[ range-test adaptor_test/sliced ]
|
[ range-test adaptor_test/sliced ]
|
||||||
[ range-test adaptor_test/strided ]
|
[ range-test adaptor_test/strided ]
|
||||||
|
[ range-test adaptor_test/strided2 ]
|
||||||
[ range-test adaptor_test/tokenized ]
|
[ range-test adaptor_test/tokenized ]
|
||||||
[ range-test adaptor_test/transformed ]
|
[ range-test adaptor_test/transformed ]
|
||||||
[ range-test adaptor_test/uniqued ]
|
[ range-test adaptor_test/uniqued ]
|
||||||
|
67
test/adaptor_test/strided2.cpp
Normal file
67
test/adaptor_test/strided2.cpp
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// Boost.Range library
|
||||||
|
//
|
||||||
|
// Copyright Neil Groves 2010. 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/
|
||||||
|
//
|
||||||
|
|
||||||
|
// This test was added due to a report that the Range Adaptors:
|
||||||
|
// 1. Caused havoc when using namespace boost::adaptors was used
|
||||||
|
// 2. Did not work with non-member functions
|
||||||
|
// 3. The strided adaptor could not be composed with sliced
|
||||||
|
//
|
||||||
|
// None of these issues could be reproduced on GCC 4.4, but this
|
||||||
|
// work makes for useful additional test coverage since this
|
||||||
|
// uses chaining of adaptors and non-member functions whereas
|
||||||
|
// most of the tests avoid this use case.
|
||||||
|
|
||||||
|
#include <boost/range/adaptor/strided.hpp>
|
||||||
|
#include <boost/range/adaptor/sliced.hpp>
|
||||||
|
#include <boost/range/adaptor/transformed.hpp>
|
||||||
|
#include <boost/range/irange.hpp>
|
||||||
|
|
||||||
|
#include <boost/test/test_tools.hpp>
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
#include <boost/assign.hpp>
|
||||||
|
#include <boost/range/algorithm_ext.hpp>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace boost
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
int times_two(int x) { return x * 2; }
|
||||||
|
|
||||||
|
void strided_test2()
|
||||||
|
{
|
||||||
|
using namespace boost::adaptors;
|
||||||
|
using namespace boost::assign;
|
||||||
|
std::vector<int> v;
|
||||||
|
boost::push_back(v, boost::irange(0,10));
|
||||||
|
std::vector<int> z;
|
||||||
|
boost::push_back(z, v | sliced(2,6) | strided(2) | transformed(×_two));
|
||||||
|
std::vector<int> reference;
|
||||||
|
reference += 4,8;
|
||||||
|
BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(),
|
||||||
|
z.begin(), z.end() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::unit_test::test_suite*
|
||||||
|
init_unit_test_suite(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
boost::unit_test::test_suite* test
|
||||||
|
= BOOST_TEST_SUITE( "RangeTestSuite.adaptor.strided2" );
|
||||||
|
|
||||||
|
test->add( BOOST_TEST_CASE( &boost::strided_test2 ) );
|
||||||
|
|
||||||
|
return test;
|
||||||
|
}
|
Reference in New Issue
Block a user