*** 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 #ifndef BOOST_RANGE_ITERATOR_RANGE_HPP
#define BOOST_RANGE_ITERATOR_RANGE_HPP #define BOOST_RANGE_ITERATOR_RANGE_HPP
#include <boost/range/config.hpp> #include <boost/range/functions.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/empty.hpp>
#include <boost/range/result_iterator.hpp> #include <boost/range/result_iterator.hpp>
#include <boost/range/difference_type.hpp> #include <boost/range/difference_type.hpp>
#include <boost/iterator/iterator_traits.hpp> #include <boost/iterator/iterator_traits.hpp>
@ -185,6 +182,11 @@ namespace boost {
return empty() ? 0: &iterator_range::end; 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: private:
template< class ForwardRange > template< class ForwardRange >
iterator adl_begin( ForwardRange& r ) iterator adl_begin( ForwardRange& r )
@ -244,26 +246,98 @@ namespace boost {
return Os; return Os;
} }
//! Comparison operator ( equal ) /////////////////////////////////////////////////////////////////////
/*! // comparison operators
Compare operands for equality /////////////////////////////////////////////////////////////////////
*/
template< class IteratorT, class IteratorT2 > namespace range_detail
inline bool operator==( const iterator_range<IteratorT>& l,
const iterator_range<IteratorT2>& r )
{ {
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) );
}
template< class Left, class Right >
inline bool less_than( const Left& l, const Right& r )
{
return std::lexicographical_compare( boost::begin(l),
boost::end(l),
boost::begin(r),
boost::end(r) );
}
} }
//! Comparison operator ( not-equal ) template< class Iterator1T, class Iterator2T >
/*! inline bool operator==( const iterator_range<Iterator1T>& l,
Compare operands for non-equality const iterator_range<Iterator2T>& r )
*/
template< class IteratorT, class IteratorT2 >
inline bool operator!=( const iterator_range<IteratorT>& l,
const iterator_range<IteratorT2>& r )
{ {
return l.begin() != r.begin() || l.end() != r.end(); 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 -----------------------------------------// // 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 #ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
template< typename Range > template< typename Range >
@ -336,28 +368,6 @@ 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
/*! /*!
@ -380,48 +390,6 @@ namespace boost {
( r ); ( 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 #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
//! copy a range into a sequence //! 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' } // namespace 'boost'
#endif #endif