forked from boostorg/range
strided adaptor rewritten to correct defects and optimise performance.
This commit is contained in:
@ -19,24 +19,39 @@
|
||||
#include <boost/range/begin.hpp>
|
||||
#include <boost/range/end.hpp>
|
||||
#include <boost/range/size_type.hpp>
|
||||
#include <boost/range/detail/has_member_size.hpp>
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/utility.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace range_detail
|
||||
{
|
||||
|
||||
template<class SinglePassRange>
|
||||
inline BOOST_DEDUCED_TYPENAME range_size<const SinglePassRange>::type
|
||||
inline typename enable_if<
|
||||
has_member_size<SinglePassRange>,
|
||||
typename range_size<const SinglePassRange>::type
|
||||
>::type
|
||||
range_calculate_size(const SinglePassRange& rng)
|
||||
{
|
||||
BOOST_ASSERT( (boost::end(rng) - boost::begin(rng)) >= 0 &&
|
||||
"reachability invariant broken!" );
|
||||
return boost::end(rng) - boost::begin(rng);
|
||||
return rng.size();
|
||||
}
|
||||
|
||||
template<class SinglePassRange>
|
||||
inline typename disable_if<
|
||||
has_member_size<SinglePassRange>,
|
||||
typename range_size<const SinglePassRange>::type
|
||||
>::type
|
||||
range_calculate_size(const SinglePassRange& rng)
|
||||
{
|
||||
return std::distance(boost::begin(rng), boost::end(rng));
|
||||
}
|
||||
}
|
||||
|
||||
template<class SinglePassRange>
|
||||
inline BOOST_DEDUCED_TYPENAME range_size<const SinglePassRange>::type
|
||||
inline typename range_size<const SinglePassRange>::type
|
||||
size(const SinglePassRange& rng)
|
||||
{
|
||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
||||
|
Reference in New Issue
Block a user