forked from boostorg/range
*** empty log message ***
[SVN r24875]
This commit is contained in:
@ -21,7 +21,7 @@
|
|||||||
#error "macro already defined!"
|
#error "macro already defined!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
||||||
#define BOOST_RANGE_DEDUCED_TYPENAME
|
#define BOOST_RANGE_DEDUCED_TYPENAME
|
||||||
#else
|
#else
|
||||||
#define BOOST_RANGE_DEDUCED_TYPENAME BOOST_DEDUCED_TYPENAME
|
#define BOOST_RANGE_DEDUCED_TYPENAME BOOST_DEDUCED_TYPENAME
|
||||||
|
@ -118,8 +118,29 @@ inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type end( const T& r )
|
|||||||
return range_detail::end( r );
|
return range_detail::end( r );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
||||||
|
// BCB is not able to overload pointer when class overloads are also available
|
||||||
|
template<>
|
||||||
|
inline range_const_iterator<const char*>::type end<const char*>( const char*& r )
|
||||||
|
{
|
||||||
|
return range_detail::str_end( r );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline range_const_iterator<const wchar_t*>::type end<const wchar_t*>( const wchar_t*& r )
|
||||||
|
{
|
||||||
|
return range_detail::str_end( r );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
} // namespace 'boost'
|
} // namespace 'boost'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
#include <boost/range/begin.hpp>
|
#include <boost/range/begin.hpp>
|
||||||
#include <boost/range/end.hpp>
|
#include <boost/range/end.hpp>
|
||||||
#include <boost/range/empty.hpp>
|
#include <boost/range/empty.hpp>
|
||||||
|
#include <boost/range/result_iterator.hpp>
|
||||||
|
#include <boost/range/difference_type.hpp>
|
||||||
#include <boost/iterator/iterator_traits.hpp>
|
#include <boost/iterator/iterator_traits.hpp>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -88,13 +90,13 @@ namespace boost {
|
|||||||
//! Constructor from a Range
|
//! Constructor from a Range
|
||||||
template< class Range >
|
template< class Range >
|
||||||
iterator_range( const Range& r ) :
|
iterator_range( const Range& r ) :
|
||||||
m_Begin( boost::begin( r ) ), m_End( boost::end( r ) ),
|
m_Begin( adl_begin( r ) ), m_End( adl_end( r ) ),
|
||||||
singular(false) {}
|
singular(false) {}
|
||||||
|
|
||||||
//! Constructor from a Range
|
//! Constructor from a Range
|
||||||
template< class Range >
|
template< class Range >
|
||||||
iterator_range( Range& r ) :
|
iterator_range( Range& r ) :
|
||||||
m_Begin( boost::begin( r ) ), m_End( boost::end( r ) ),
|
m_Begin( adl_begin( r ) ), m_End( adl_end( r ) ),
|
||||||
singular(false) {}
|
singular(false) {}
|
||||||
|
|
||||||
template< class Iterator >
|
template< class Iterator >
|
||||||
@ -112,8 +114,8 @@ namespace boost {
|
|||||||
template< class ForwardRange >
|
template< class ForwardRange >
|
||||||
iterator_range& operator=( ForwardRange& r )
|
iterator_range& operator=( ForwardRange& r )
|
||||||
{
|
{
|
||||||
m_Begin = boost::begin( r );
|
m_Begin = adl_begin( r );
|
||||||
m_End = boost::end( r );
|
m_End = adl_end( r );
|
||||||
singular = false;
|
singular = false;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -121,8 +123,8 @@ namespace boost {
|
|||||||
template< class ForwardRange >
|
template< class ForwardRange >
|
||||||
iterator_range& operator=( const ForwardRange& r )
|
iterator_range& operator=( const ForwardRange& r )
|
||||||
{
|
{
|
||||||
m_Begin = boost::begin( r );
|
m_Begin = adl_begin( r );
|
||||||
m_End = boost::end( r );
|
m_End = adl_end( r );
|
||||||
singular = false;
|
singular = false;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -183,6 +185,29 @@ namespace boost {
|
|||||||
return empty() ? 0: &iterator_range::end;
|
return empty() ? 0: &iterator_range::end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template< class ForwardRange >
|
||||||
|
iterator adl_begin( ForwardRange& r )
|
||||||
|
{
|
||||||
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
||||||
|
return boost::begin( r );
|
||||||
|
#else
|
||||||
|
using boost::begin;
|
||||||
|
return begin( r );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class ForwardRange >
|
||||||
|
iterator adl_end( ForwardRange& r )
|
||||||
|
{
|
||||||
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
||||||
|
return boost::end( r );
|
||||||
|
#else
|
||||||
|
using boost::end;
|
||||||
|
return end( r );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// begin and end iterators
|
// begin and end iterators
|
||||||
IteratorT m_Begin;
|
IteratorT m_Begin;
|
||||||
@ -258,6 +283,49 @@ namespace boost {
|
|||||||
return iterator_range<IteratorT>( Begin, End );
|
return iterator_range<IteratorT>( Begin, End );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace range_detail
|
||||||
|
{
|
||||||
|
template< class Range >
|
||||||
|
inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type >
|
||||||
|
make_sub_range_impl( Range& r,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end )
|
||||||
|
{
|
||||||
|
BOOST_ASSERT( advance_begin >= 0 );
|
||||||
|
BOOST_ASSERT( advance_end >= 0 );
|
||||||
|
|
||||||
|
BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type
|
||||||
|
new_begin = begin( r ),
|
||||||
|
new_end = end( r );
|
||||||
|
std::advance( new_begin, advance_begin );
|
||||||
|
std::advance( new_end, -advance_end );
|
||||||
|
return make_iterator_range( new_begin, new_end );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template< class Range >
|
||||||
|
inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type >
|
||||||
|
make_super_range_impl( Range& r,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end )
|
||||||
|
{
|
||||||
|
BOOST_ASSERT( advance_begin >= 0 );
|
||||||
|
BOOST_ASSERT( advance_end >= 0 );
|
||||||
|
|
||||||
|
BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type
|
||||||
|
new_begin = begin( r ),
|
||||||
|
new_end = end( r );
|
||||||
|
std::advance( new_begin, -advance_begin );
|
||||||
|
std::advance( new_end, advance_end );
|
||||||
|
return make_iterator_range( new_begin, new_end );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
||||||
|
|
||||||
template< typename Range >
|
template< typename Range >
|
||||||
@ -268,6 +336,28 @@ namespace boost {
|
|||||||
( begin( r ), end( r ) );
|
( begin( r ), end( r ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template< class Range >
|
||||||
|
inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type >
|
||||||
|
make_sub_range( Range& r,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end = 0 )
|
||||||
|
{
|
||||||
|
return range_detail::make_sub_range_impl( r, advance_begin, advance_end );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template< class Range >
|
||||||
|
inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type >
|
||||||
|
make_super_range( Range& r,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end = 0 )
|
||||||
|
{
|
||||||
|
return range_detail::make_super_range_impl( r, advance_begin, advance_end );
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
//! iterator_range construct helper
|
//! iterator_range construct helper
|
||||||
/*!
|
/*!
|
||||||
@ -289,7 +379,50 @@ namespace boost {
|
|||||||
return iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator<ForwardRange>::type >
|
return iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator<ForwardRange>::type >
|
||||||
( r );
|
( r );
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
template< class Range >
|
||||||
|
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<Range>::type >
|
||||||
|
make_sub_range( Range& r,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end = 0 )
|
||||||
|
{
|
||||||
|
return range_detail::make_sub_range_impl( r, advance_begin, advance_end );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class Range >
|
||||||
|
inline iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator<Range>::type >
|
||||||
|
make_sub_range( const Range& r,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end = 0 )
|
||||||
|
{
|
||||||
|
return range_detail::make_sub_range_impl( r, advance_begin, advance_end );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template< class Range >
|
||||||
|
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<Range>::type >
|
||||||
|
make_super_range( Range& r,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end = 0 )
|
||||||
|
{
|
||||||
|
return range_detail::make_super_range_impl( r, advance_begin, advance_end );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template< class Range >
|
||||||
|
inline iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator<Range>::type >
|
||||||
|
make_super_range( const Range& r,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end = 0 )
|
||||||
|
{
|
||||||
|
return range_detail::make_super_range_impl( r, advance_begin, advance_end );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
||||||
|
|
||||||
//! copy a range into a sequence
|
//! copy a range into a sequence
|
||||||
/*!
|
/*!
|
||||||
|
Reference in New Issue
Block a user