*** empty log message ***

[SVN r25001]
This commit is contained in:
Thorsten Jørgen Ottosen
2004-09-10 11:48:58 +00:00
parent da43d13564
commit 3b3cb0571c
2 changed files with 118 additions and 128 deletions

View File

@ -11,10 +11,7 @@
#ifndef BOOST_RANGE_ITERATOR_RANGE_HPP
#define BOOST_RANGE_ITERATOR_RANGE_HPP
#include <boost/range/config.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/empty.hpp>
#include <boost/range/functions.hpp>
#include <boost/range/result_iterator.hpp>
#include <boost/range/difference_type.hpp>
#include <boost/iterator/iterator_traits.hpp>
@ -185,6 +182,11 @@ namespace boost {
return empty() ? 0: &iterator_range::end;
}
bool equal( const iterator_range& r ) const
{
return m_Begin == r.m_Begin && m_End == r.m_End;
}
private:
template< class ForwardRange >
iterator adl_begin( ForwardRange& r )
@ -244,26 +246,98 @@ namespace boost {
return Os;
}
//! Comparison operator ( equal )
/*!
Compare operands for equality
*/
template< class IteratorT, class IteratorT2 >
inline bool operator==( const iterator_range<IteratorT>& l,
const iterator_range<IteratorT2>& r )
/////////////////////////////////////////////////////////////////////
// comparison operators
/////////////////////////////////////////////////////////////////////
namespace range_detail
{
return ! (l != r);
template< class Left, class Right >
inline bool equal( const Left& l, const Right& r )
{
BOOST_DEDUCED_TYPENAME range_size<Left>::type
l_size = boost::size( l ),
r_size = boost::size( r );
if( l_size != r_size )
return false;
return std::equal( boost::begin(l), boost::end(l),
boost::begin(r) );
}
//! Comparison operator ( not-equal )
/*!
Compare operands for non-equality
*/
template< class IteratorT, class IteratorT2 >
inline bool operator!=( const iterator_range<IteratorT>& l,
const iterator_range<IteratorT2>& r )
template< class Left, class Right >
inline bool less_than( const Left& l, const Right& r )
{
return l.begin() != r.begin() || l.end() != r.end();
return std::lexicographical_compare( boost::begin(l),
boost::end(l),
boost::begin(r),
boost::end(r) );
}
}
template< class Iterator1T, class Iterator2T >
inline bool operator==( const iterator_range<Iterator1T>& l,
const iterator_range<Iterator2T>& r )
{
return range_detail::equal( l, r );
}
template< class IteratorT, class SinglePassRange >
inline bool operator==( const iterator_range<IteratorT>& l,
const SinglePassRange& r )
{
return range_detail::equal( l, r );
}
template< class IteratorT, class SinglePassRange >
inline bool operator==( const SinglePassRange& l,
const iterator_range<IteratorT>& r )
{
return range_detail::equal( l, r );
}
template< class Iterator1T, class Iterator2T >
inline bool operator!=( const iterator_range<Iterator1T>& l,
const iterator_range<Iterator2T>& r )
{
return !range_detail::equal( l, r );
}
template< class IteratorT, class SinglePassRange >
inline bool operator!=( const iterator_range<IteratorT>& l,
const SinglePassRange& r )
{
return !range_detail::equal( l, r );
}
template< class IteratorT, class SinglePassRange >
inline bool operator!=( const SinglePassRange& l,
const iterator_range<IteratorT>& r )
{
return !range_detail::equal( l, r );
}
template< class Iterator1T, class Iterator2T >
inline bool operator<( const iterator_range<Iterator1T>& l,
const iterator_range<Iterator2T>& r )
{
return range_detail::less_than( l, r );
}
template< class IteratorT, class ForwardRange >
inline bool operator<( const iterator_range<IteratorT>& l,
const ForwardRange& r )
{
return range_detail::less_than( l, r );
}
template< class IteratorT, class ForwardRange >
inline bool operator<( const ForwardRange& l,
const iterator_range<IteratorT>& r )
{
return range_detail::less_than( l, r );
}
// iterator range utilities -----------------------------------------//
@ -284,48 +358,6 @@ namespace boost {
}
/*
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
template< typename Range >
@ -336,28 +368,6 @@ namespace boost {
( 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
//! iterator_range construct helper
/*!
@ -380,48 +390,6 @@ namespace boost {
( r );
}
/*
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

View File

@ -87,6 +87,28 @@ namespace boost
};
template< class ForwardRange, class ForwardRange2 >
inline bool operator==( const sub_range<ForwardRange>& l,
const sub_range<ForwardRange2>& r )
{
return range_detail::equal( l, r );
}
template< class ForwardRange, class ForwardRange2 >
inline bool operator!=( const sub_range<ForwardRange>& l,
const sub_range<ForwardRange2>& r )
{
return !range_detail::equal( l, r );
}
template< class ForwardRange, class ForwardRange2 >
inline bool operator<( const sub_range<ForwardRange>& l,
const sub_range<ForwardRange2>& r )
{
return range_detail::less_than( l, r );
}
} // namespace 'boost'
#endif