mirror of
https://github.com/boostorg/range.git
synced 2025-07-25 18:37:25 +02:00
merge from 1.33.1
[SVN r31968]
This commit is contained in:
File diff suppressed because it is too large
Load Diff
141
doc/example.cpp
Normal file
141
doc/example.cpp
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
#include <boost/range.hpp>
|
||||||
|
#include <iterator> // for std::iterator_traits, std::distance()
|
||||||
|
|
||||||
|
namespace Foo
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Our sample UDT. A 'Pair'
|
||||||
|
// will work as a range when the stored
|
||||||
|
// elements are iterators.
|
||||||
|
//
|
||||||
|
template< class T >
|
||||||
|
struct Pair
|
||||||
|
{
|
||||||
|
T first, last;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace 'Foo'
|
||||||
|
|
||||||
|
namespace boost
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Specialize metafunctions. We must include the range.hpp header.
|
||||||
|
// We must open the 'boost' namespace.
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
template< class T >
|
||||||
|
struct range_value< Foo::Pair<T> >
|
||||||
|
{
|
||||||
|
typedef typename std::iterator_traits<T>::value_type type;
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
struct range_iterator< Foo::Pair<T> >
|
||||||
|
{
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
struct range_const_iterator< Foo::Pair<T> >
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Remark: this is defined similar to 'range_iterator'
|
||||||
|
// because the 'Pair' type does not distinguish
|
||||||
|
// between an iterator and a const_iterator.
|
||||||
|
//
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
template< class T >
|
||||||
|
struct range_difference< Foo::Pair<T> >
|
||||||
|
{
|
||||||
|
typedef typename std::iterator_traits<T>::difference_type type;
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
struct range_size< Foo::Pair<T> >
|
||||||
|
{
|
||||||
|
int static_assertion[ sizeof( std::size_t ) >=
|
||||||
|
sizeof( typename range_difference< Foo::Pair<T> >::type ) ];
|
||||||
|
typedef std::size_t type;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace 'boost'
|
||||||
|
|
||||||
|
namespace Foo
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// The required functions. These should be defined in
|
||||||
|
// the same namespace as 'Pair', in this case
|
||||||
|
// in namespace 'Foo'.
|
||||||
|
//
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
inline T boost_range_begin( Pair<T>& x )
|
||||||
|
{
|
||||||
|
return x.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
inline T boost_range_begin( const Pair<T>& x )
|
||||||
|
{
|
||||||
|
return x.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
inline T boost_range_end( Pair<T>& x )
|
||||||
|
{
|
||||||
|
return x.last;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
inline T boost_range_end( const Pair<T>& x )
|
||||||
|
{
|
||||||
|
return x.last;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
inline typename boost::range_size< Pair<T> >::type
|
||||||
|
boost_range_size( const Pair<T>& x )
|
||||||
|
{
|
||||||
|
return std::distance(x.first,x.last);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace 'Foo'
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
typedef std::vector<int>::iterator iter;
|
||||||
|
std::vector<int> vec;
|
||||||
|
vec.push_back( 42 );
|
||||||
|
Foo::Pair<iter> pair = { vec.begin(), vec.end() };
|
||||||
|
const Foo::Pair<iter>& cpair = pair;
|
||||||
|
//
|
||||||
|
// Notice that we call 'begin' etc with qualification.
|
||||||
|
//
|
||||||
|
iter i = boost::begin( pair );
|
||||||
|
iter e = boost::end( pair );
|
||||||
|
i = boost::begin( cpair );
|
||||||
|
e = boost::end( cpair );
|
||||||
|
boost::range_size< Foo::Pair<iter> >::type s = boost::size( pair );
|
||||||
|
s = boost::size( cpair );
|
||||||
|
boost::range_const_reverse_iterator< Foo::Pair<iter> >::type
|
||||||
|
ri = boost::rbegin( cpair ),
|
||||||
|
re = boost::rend( cpair );
|
||||||
|
|
||||||
|
//
|
||||||
|
// Test metafunctions
|
||||||
|
//
|
||||||
|
|
||||||
|
boost::range_value< Foo::Pair<iter> >::type
|
||||||
|
v = *boost::begin(pair);
|
||||||
|
|
||||||
|
boost::range_difference< Foo::Pair<iter> >::type
|
||||||
|
d = boost::end(pair) - boost::begin(pair);
|
||||||
|
}
|
||||||
|
|
@ -87,7 +87,7 @@ free-standing functions so syntactic and/or semantic differences can be removed.
|
|||||||
</span><span class=special>{
|
</span><span class=special>{
|
||||||
</span><span class=keyword>return </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>find</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>end</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>value </span><span class=special>);
|
</span><span class=keyword>return </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>find</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>end</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>value </span><span class=special>);
|
||||||
</span><span class=special>}
|
</span><span class=special>}
|
||||||
|
|
||||||
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardReadableRange</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>>
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardReadableRange</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>>
|
||||||
</span><span class=keyword>inline </span><span class=keyword>typename </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>range_const_iterator</span><span class=special>< </span><span
|
</span><span class=keyword>inline </span><span class=keyword>typename </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>range_const_iterator</span><span class=special>< </span><span
|
||||||
class=identifier>ForwardReadableRange </span><span class=special>>::</span><span class=identifier>type
|
class=identifier>ForwardReadableRange </span><span class=special>>::</span><span class=identifier>type
|
||||||
@ -95,7 +95,7 @@ class=identifier>ForwardReadableRange </span><span class=special>>::</span><s
|
|||||||
</span><span class=special>{
|
</span><span class=special>{
|
||||||
</span><span class=keyword>return </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>find</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>end</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>value </span><span class=special>);
|
</span><span class=keyword>return </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>find</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>end</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>value </span><span class=special>);
|
||||||
</span><span class=special>}
|
</span><span class=special>}
|
||||||
|
|
||||||
</span><span class=comment>//
|
</span><span class=comment>//
|
||||||
// replace first value and return its index
|
// replace first value and return its index
|
||||||
//
|
//
|
||||||
@ -104,7 +104,7 @@ class=identifier>ForwardReadableRange </span><span class=special>>::</span><s
|
|||||||
</span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>ForwardReadableWriteableRange</span><span class=special>& </span><span class=identifier>c</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>T</span><span class=special>& </span><span class=identifier>value</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>T</span><span class=special>& </span><span class=identifier>replacement </span><span class=special>)
|
</span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>ForwardReadableWriteableRange</span><span class=special>& </span><span class=identifier>c</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>T</span><span class=special>& </span><span class=identifier>value</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>T</span><span class=special>& </span><span class=identifier>replacement </span><span class=special>)
|
||||||
</span><span class=special>{
|
</span><span class=special>{
|
||||||
</span><span class=keyword>typename </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>range_iterator</span><span class=special>< </span><span class=identifier>ForwardReadableWriteableRange </span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>found </span><span class=special>= </span><span class=identifier>find</span><span class=special>( </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>value </span><span class=special>);
|
</span><span class=keyword>typename </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>range_iterator</span><span class=special>< </span><span class=identifier>ForwardReadableWriteableRange </span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>found </span><span class=special>= </span><span class=identifier>find</span><span class=special>( </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>value </span><span class=special>);
|
||||||
|
|
||||||
</span><span class=keyword>if</span><span class=special>( </span><span class=identifier>found </span><span class=special>!= </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>end</span><span class=special>( </span><span class=identifier>c </span><span class=special>) </span><span class=special>)
|
</span><span class=keyword>if</span><span class=special>( </span><span class=identifier>found </span><span class=special>!= </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>end</span><span class=special>( </span><span class=identifier>c </span><span class=special>) </span><span class=special>)
|
||||||
</span><span class=special>*</span><span class=identifier>found </span><span class=special>= </span><span class=identifier>replacement</span><span class=special>;
|
</span><span class=special>*</span><span class=identifier>found </span><span class=special>= </span><span class=identifier>replacement</span><span class=special>;
|
||||||
</span><span class=keyword>return </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>distance</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>found </span><span class=special>);
|
</span><span class=keyword>return </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>distance</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>c </span><span class=special>), </span><span class=identifier>found </span><span class=special>);
|
||||||
@ -115,30 +115,30 @@ class=identifier>ForwardReadableRange </span><span class=special>>::</span><s
|
|||||||
//
|
//
|
||||||
</span><span class=keyword>const </span><span class=keyword>int </span><span class=identifier>N </span><span class=special>= </span><span class=number>5</span><span class=special>;
|
</span><span class=keyword>const </span><span class=keyword>int </span><span class=identifier>N </span><span class=special>= </span><span class=number>5</span><span class=special>;
|
||||||
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special><</span><span class=keyword>int</span><span class=special>> </span><span class=identifier>my_vector</span><span class=special>;
|
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special><</span><span class=keyword>int</span><span class=special>> </span><span class=identifier>my_vector</span><span class=special>;
|
||||||
</span><span class=keyword>int </span><span class=identifier>values</span><span class=special>[] </span><span class=special>= </span><span class=special>{ </span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>,</span><span class=number>4</span><span class=special>,</span><span class=number>5</span><span class=special>,</span><span class=number>6</span><span class=special>,</span><span class=number>7</span><span class=special>,</span><span class=number>8</span><span class=special>,</span><span class=number>9 </span><span class=special>};
|
</span><span class=keyword>int </span><span class=identifier>values</span><span class=special>[] </span><span class=special>= </span><span class=special>{ </span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>,</span><span class=number>4</span><span class=special>,</span><span class=number>5</span><span class=special>,</span><span class=number>6</span><span class=special>,</span><span class=number>7</span><span class=special>,</span><span class=number>8</span><span class=special>,</span><span class=number>9 </span><span class=special>};
|
||||||
</span>
|
</span>
|
||||||
<span class=identifier>my_vector</span><span class=special>.</span><span
|
<span class=identifier>my_vector</span><span class=special>.</span><span
|
||||||
class=identifier>assign</span><span class=special>( </span><span class=identifier>values</span><span class=special>, </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>end</span><span class=special>( </span><span class=identifier>values </span><span class=special>) </span><span class=special>);</span>
|
class=identifier>assign</span><span class=special>( </span><span class=identifier>values</span><span class=special>, </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>end</span><span class=special>( </span><span class=identifier>values </span><span class=special>) </span><span class=special>);</span>
|
||||||
</span><span class=keyword>typedef </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special><</span><span class=keyword>int</span><span class=special>>::</span><span class=identifier>iterator </span><span class=identifier>iterator</span><span class=special>;
|
</span><span class=keyword>typedef </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special><</span><span class=keyword>int</span><span class=special>>::</span><span class=identifier>iterator </span><span class=identifier>iterator</span><span class=special>;
|
||||||
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special><</span><span class=identifier>iterator</span><span class=special>,</span><span class=identifier>iterator</span><span class=special>> </span><span class=identifier>my_view</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>my_vector </span><span class=special>),
|
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special><</span><span class=identifier>iterator</span><span class=special>,</span><span class=identifier>iterator</span><span class=special>> </span><span class=identifier>my_view</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>my_vector </span><span class=special>),
|
||||||
</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>my_vector </span><span class=special>) </span><span class=special>+ </span><span class=identifier>N </span><span class=special>);
|
</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>begin</span><span class=special>( </span><span class=identifier>my_vector </span><span class=special>) </span><span class=special>+ </span><span class=identifier>N </span><span class=special>);
|
||||||
</span><span class=keyword>char </span><span class=identifier>str_val</span><span class=special>[] </span><span class=special>= </span><span class=string>"a string"</span><span class=special>;
|
</span><span class=keyword>char </span><span class=identifier>str_val</span><span class=special>[] </span><span class=special>= </span><span class=string>"a string"</span><span class=special>;
|
||||||
</span><span class=keyword>char</span><span class=special>* </span><span class=identifier>str </span><span class=special>= </span><span class=identifier>str_val</span><span class=special>;
|
</span><span class=keyword>char</span><span class=special>* </span><span class=identifier>str </span><span class=special>= </span><span class=identifier>str_val</span><span class=special>;
|
||||||
|
|
||||||
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>cout </span><span class=special><< </span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>my_vector</span><span class=special>, </span><span class=number>4</span><span class=special>, </span><span class=number>2 </span><span class=special>)
|
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>cout </span><span class=special><< </span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>my_vector</span><span class=special>, </span><span class=number>4</span><span class=special>, </span><span class=number>2 </span><span class=special>);
|
||||||
</span><span class=special><< </span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>my_view</span><span class=special>, </span><span class=number>4</span><span class=special>, </span><span class=number>2 </span><span class=special>)
|
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>cout </span><span class=special><< </span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>my_view</span><span class=special>, </span><span class=number>4</span><span class=special>, </span><span class=number>2 </span><span class=special>);
|
||||||
</span><span class=special><< </span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>str</span><span class=special>, </span><span class=literal>'a'</span><span class=special>, </span><span class=literal>'b' </span><span class=special>);
|
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>cout </span><span class=special><< </span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>str</span><span class=special>, </span><span class=literal>'a'</span><span class=special>, </span><span class=literal>'b' </span><span class=special>);
|
||||||
</span>
|
</span>
|
||||||
<span class=comment>// prints '3', '5' and '0' </span>
|
<span class=comment>// prints '3', '5' and '0' </span>
|
||||||
</pre>
|
</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
By using the free-standing functions and <a
|
By using the free-standing functions and <a
|
||||||
href="../../mpl/doc/refmanual/metafunction.html">metafunctions</a>, the code automatically
|
href="../../mpl/doc/refmanual/metafunction.html">metafunctions</a>, the code automatically
|
||||||
works for all the types supported by this library; now and in the future.
|
works for all the types supported by this library; now and in the future.
|
||||||
Notice that we have to
|
Notice that we have to
|
||||||
provide two version of <code >find()</code> since we cannot forward a non-const
|
provide two version of <code >find()</code> since we cannot forward a non-const
|
||||||
rvalue with reference arguments (see this article about <a href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm" target="_self" >The
|
rvalue with reference arguments (see this article about <a href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm" target="_self" >The
|
||||||
Forwarding Problem</a> ).
|
Forwarding Problem</a> ).
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
|
@ -386,7 +386,7 @@ VAlign="top"><code>boost::range_const_reverse_iterator<X>::type</code></TD>
|
|||||||
</TR>
|
</TR>
|
||||||
<TR>
|
<TR>
|
||||||
<TD VAlign="top">Beginning of range</TD>
|
<TD VAlign="top">Beginning of range</TD>
|
||||||
<TD VAlign="top"><code>rboost::begin(a)</code></TD>
|
<TD VAlign="top"><code>boost::rbegin(a)</code></TD>
|
||||||
<TD VAlign="top"><code>boost::range_reverse_iterator<X>::type</code> if
|
<TD VAlign="top"><code>boost::range_reverse_iterator<X>::type</code> if
|
||||||
<code>a</code> is mutable, <code>boost::range_const_reverse_iterator<X>::type</code>
|
<code>a</code> is mutable, <code>boost::range_const_reverse_iterator<X>::type</code>
|
||||||
otherwise.</TD>
|
otherwise.</TD>
|
||||||
@ -394,7 +394,7 @@ otherwise.</TD>
|
|||||||
<code>boost::range_reverse_iterator<X>::type(boost::end(a))</code>.</TD> </TR>
|
<code>boost::range_reverse_iterator<X>::type(boost::end(a))</code>.</TD> </TR>
|
||||||
<TR>
|
<TR>
|
||||||
<TD VAlign="top">End of range</TD>
|
<TD VAlign="top">End of range</TD>
|
||||||
<TD VAlign="top"><code>rboost::end(a)</code></TD>
|
<TD VAlign="top"><code>boost::rend(a)</code></TD>
|
||||||
<TD VAlign="top"><code>boost::range_reverse_iterator<X>::type</code> if
|
<TD VAlign="top"><code>boost::range_reverse_iterator<X>::type</code> if
|
||||||
<code>a</code> is mutable, <code>boost::range_const_reverse_iterator<X>::type</code>
|
<code>a</code> is mutable, <code>boost::range_const_reverse_iterator<X>::type</code>
|
||||||
otherwise.</TD>
|
otherwise.</TD>
|
||||||
@ -405,7 +405,7 @@ otherwise.</TD>
|
|||||||
|
|
||||||
<h3>Complexity guarantees</h3>
|
<h3>Complexity guarantees</h3>
|
||||||
|
|
||||||
<code>rboost::begin(a)</code> has the same complexity as <code>boost::end(a)</code> and <code>rboost::end(a)</code>
|
<code>boost::rbegin(a)</code> has the same complexity as <code>boost::end(a)</code> and <code>boost::rend(a)</code>
|
||||||
has the same complexity as <code>boost::begin(a)</code> from <a
|
has the same complexity as <code>boost::begin(a)</code> from <a
|
||||||
href="#forward_range">Forward Range</a>.
|
href="#forward_range">Forward Range</a>.
|
||||||
|
|
||||||
@ -414,13 +414,13 @@ otherwise.</TD>
|
|||||||
<Table border="1" cellpadding="5">
|
<Table border="1" cellpadding="5">
|
||||||
<TR>
|
<TR>
|
||||||
<TD VAlign="top">Valid reverse range</TD>
|
<TD VAlign="top">Valid reverse range</TD>
|
||||||
<TD VAlign="top">For any Bidirectional Range <code>a</code>, <code>[rboost::begin(a),rboost::end(a))</code>
|
<TD VAlign="top">For any Bidirectional Range <code>a</code>, <code>[boost::rbegin(a),boost::rend(a))</code>
|
||||||
is a valid range, that is, <code>rboost::end(a)</code> is reachable from <code>rboost::begin(a)</code>
|
is a valid range, that is, <code>boost::rend(a)</code> is reachable from <code>boost::rbegin(a)</code>
|
||||||
in a finite number of increments.</TD>
|
in a finite number of increments.</TD>
|
||||||
</TR>
|
</TR>
|
||||||
<TR>
|
<TR>
|
||||||
<TD VAlign="top">Completeness</TD>
|
<TD VAlign="top">Completeness</TD>
|
||||||
<TD VAlign="top">An algorithm that iterates through the range <code>[rboost::begin(a),rboost::end(a))</code>
|
<TD VAlign="top">An algorithm that iterates through the range <code>[boost::rbegin(a),boost::rend(a))</code>
|
||||||
will pass through every element of <code>a</code>.</TD>
|
will pass through every element of <code>a</code>.</TD>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
# pragma once
|
# pragma once
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <boost/type_traits/remove_const.hpp>
|
||||||
#include <boost/range/config.hpp>
|
#include <boost/range/config.hpp>
|
||||||
|
|
||||||
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
||||||
@ -46,7 +47,8 @@ namespace range_detail
|
|||||||
}
|
}
|
||||||
|
|
||||||
template< typename C >
|
template< typename C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_iterator<
|
||||||
|
typename remove_const<C>::type >::type
|
||||||
boost_range_begin( C& c )
|
boost_range_begin( C& c )
|
||||||
{
|
{
|
||||||
return c.begin();
|
return c.begin();
|
||||||
@ -140,7 +142,8 @@ namespace range_detail
|
|||||||
|
|
||||||
|
|
||||||
template< class T >
|
template< class T >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_iterator<T>::type begin( T& r )
|
inline BOOST_DEDUCED_TYPENAME range_iterator<
|
||||||
|
typename remove_const<T>::type >::type begin( T& r )
|
||||||
{
|
{
|
||||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
||||||
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
||||||
|
@ -16,12 +16,25 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/range/config.hpp>
|
#include <boost/range/config.hpp>
|
||||||
|
#include <boost/range/const_iterator.hpp>
|
||||||
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
|
||||||
#include <boost/range/detail/difference_type.hpp>
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <boost/iterator/iterator_traits.hpp>
|
#include <boost/iterator/iterator_traits.hpp>
|
||||||
|
|
||||||
|
namespace boost
|
||||||
|
{
|
||||||
|
template< class T >
|
||||||
|
struct range_difference
|
||||||
|
{
|
||||||
|
typedef BOOST_DEDUCED_TYPENAME iterator_difference<
|
||||||
|
BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type >::type
|
||||||
|
type;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
//#include <boost/range/detail/difference_type.hpp>
|
||||||
|
//#else
|
||||||
|
|
||||||
|
/*
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
@ -30,13 +43,13 @@ namespace boost
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// default
|
// default
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
template< typename C >
|
template< typename C >
|
||||||
struct range_difference
|
struct range_difference
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME C::difference_type type;
|
typedef BOOST_DEDUCED_TYPENAME C::difference_type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// pair
|
// pair
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@ -44,14 +57,14 @@ namespace boost
|
|||||||
template< typename Iterator >
|
template< typename Iterator >
|
||||||
struct range_difference< std::pair<Iterator,Iterator> >
|
struct range_difference< std::pair<Iterator,Iterator> >
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME
|
typedef BOOST_DEDUCED_TYPENAME
|
||||||
iterator_difference<Iterator>::type type;
|
iterator_difference<Iterator>::type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename Iterator >
|
template< typename Iterator >
|
||||||
struct range_difference< const std::pair<Iterator,Iterator> >
|
struct range_difference< const std::pair<Iterator,Iterator> >
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME
|
typedef BOOST_DEDUCED_TYPENAME
|
||||||
iterator_difference<Iterator>::type type;
|
iterator_difference<Iterator>::type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -127,5 +140,6 @@ namespace boost
|
|||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
*/
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
# pragma once
|
# pragma once
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <boost/type_traits/remove_const.hpp>
|
||||||
#include <boost/range/config.hpp>
|
#include <boost/range/config.hpp>
|
||||||
|
|
||||||
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
||||||
@ -25,34 +26,35 @@
|
|||||||
#include <boost/range/iterator.hpp>
|
#include <boost/range/iterator.hpp>
|
||||||
#include <boost/range/const_iterator.hpp>
|
#include <boost/range/const_iterator.hpp>
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
|
|
||||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
||||||
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
||||||
/**/
|
/**/
|
||||||
namespace range_detail
|
namespace range_detail
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// primary template
|
// primary template
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
template< typename C >
|
template< typename C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type
|
||||||
boost_range_end( const C& c )
|
boost_range_end( const C& c )
|
||||||
{
|
{
|
||||||
return c.end();
|
return c.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
template< typename C >
|
template< typename C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_iterator<
|
||||||
|
typename remove_const<C>::type >::type
|
||||||
boost_range_end( C& c )
|
boost_range_end( C& c )
|
||||||
{
|
{
|
||||||
return c.end();
|
return c.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// pair
|
// pair
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
@ -62,13 +64,13 @@ namespace range_detail
|
|||||||
{
|
{
|
||||||
return p.second;
|
return p.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
template< typename Iterator >
|
template< typename Iterator >
|
||||||
inline Iterator boost_range_end( std::pair<Iterator,Iterator>& p )
|
inline Iterator boost_range_end( std::pair<Iterator,Iterator>& p )
|
||||||
{
|
{
|
||||||
return p.second;
|
return p.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// array
|
// array
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
@ -76,13 +78,13 @@ namespace range_detail
|
|||||||
template< typename T, std::size_t sz >
|
template< typename T, std::size_t sz >
|
||||||
inline const T* boost_range_end( const T (&array)[sz] )
|
inline const T* boost_range_end( const T (&array)[sz] )
|
||||||
{
|
{
|
||||||
return range_detail::array_end<T,sz>( array );
|
return range_detail::array_end<T,sz>( array );
|
||||||
}
|
}
|
||||||
|
|
||||||
template< typename T, std::size_t sz >
|
template< typename T, std::size_t sz >
|
||||||
inline T* boost_range_end( T (&array)[sz] )
|
inline T* boost_range_end( T (&array)[sz] )
|
||||||
{
|
{
|
||||||
return range_detail::array_end<T,sz>( array );
|
return range_detail::array_end<T,sz>( array );
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
@ -134,18 +136,19 @@ namespace range_detail
|
|||||||
|
|
||||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
||||||
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
||||||
/**/
|
/**/
|
||||||
} // namespace 'range_detail'
|
} // namespace 'range_detail'
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template< class T >
|
template< class T >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_iterator<T>::type end( T& r )
|
inline BOOST_DEDUCED_TYPENAME range_iterator<
|
||||||
|
typename remove_const<T>::type >::type end( T& r )
|
||||||
{
|
{
|
||||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
|
||||||
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
||||||
/**/
|
/**/
|
||||||
using namespace range_detail;
|
using namespace range_detail;
|
||||||
#endif
|
#endif
|
||||||
return boost_range_end( r );
|
return boost_range_end( r );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,7 +159,7 @@ inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type end( const T& r )
|
|||||||
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
!BOOST_WORKAROUND(__GNUC__, < 3) \
|
||||||
/**/
|
/**/
|
||||||
using namespace range_detail;
|
using namespace range_detail;
|
||||||
#endif
|
#endif
|
||||||
return boost_range_end( r );
|
return boost_range_end( r );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ namespace boost
|
|||||||
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
||||||
|
|
||||||
template< class C >
|
template< class C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type
|
||||||
rbegin( C& c )
|
rbegin( C& c )
|
||||||
{
|
{
|
||||||
return BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type( end( c ) );
|
return BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type( end( c ) );
|
||||||
@ -35,16 +35,18 @@ rbegin( C& c )
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
template< class C >
|
template< class C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<
|
||||||
|
typename remove_const<C>::type >::type
|
||||||
rbegin( C& c )
|
rbegin( C& c )
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type
|
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<
|
||||||
|
typename remove_const<C>::type >::type
|
||||||
iter_type;
|
iter_type;
|
||||||
return iter_type( end( c ) );
|
return iter_type( end( c ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template< class C >
|
template< class C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
|
||||||
rbegin( const C& c )
|
rbegin( const C& c )
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
|
typedef BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
|
||||||
|
@ -22,29 +22,31 @@
|
|||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
||||||
|
|
||||||
template< class C >
|
template< class C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type
|
||||||
rend( C& c )
|
rend( C& c )
|
||||||
{
|
{
|
||||||
return BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type( begin( c ) );
|
return BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type( begin( c ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
template< class C >
|
template< class C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<
|
||||||
|
typename remove_const<C>::type >::type
|
||||||
rend( C& c )
|
rend( C& c )
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type
|
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<
|
||||||
|
typename remove_const<C>::type >::type
|
||||||
iter_type;
|
iter_type;
|
||||||
return iter_type( begin( c ) );
|
return iter_type( begin( c ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template< class C >
|
template< class C >
|
||||||
inline BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
|
inline BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
|
||||||
rend( const C& c )
|
rend( const C& c )
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
|
typedef BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
|
||||||
|
@ -16,6 +16,54 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/range/config.hpp>
|
#include <boost/range/config.hpp>
|
||||||
|
/*
|
||||||
|
#include <boost/range/difference_type.hpp>
|
||||||
|
|
||||||
|
namespace boost
|
||||||
|
{
|
||||||
|
namespace range_detail
|
||||||
|
{
|
||||||
|
template< class T >
|
||||||
|
struct add_unsigned;
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct add_unsigned<short>
|
||||||
|
{
|
||||||
|
typedef unsigned short type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct add_unsigned<int>
|
||||||
|
{
|
||||||
|
typedef unsigned int type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct add_unsigned<long>
|
||||||
|
{
|
||||||
|
typedef unsigned long type;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef BOOST_HAS_LONG_LONG
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct add_unsigned<long long>
|
||||||
|
{
|
||||||
|
typedef unsigned long long type;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T >
|
||||||
|
struct range_size
|
||||||
|
{
|
||||||
|
typedef BOOST_DEDUCED_TYPENAME range_detail::add_unsigned<
|
||||||
|
BOOST_DEDUCED_TYPENAME range_difference<T>::type >::type
|
||||||
|
type;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
#include <boost/range/detail/size_type.hpp>
|
#include <boost/range/detail/size_type.hpp>
|
||||||
@ -29,13 +77,13 @@ namespace boost
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// default
|
// default
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
template< typename C >
|
template< typename C >
|
||||||
struct range_size
|
struct range_size
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME C::size_type type;
|
typedef BOOST_DEDUCED_TYPENAME C::size_type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// pair
|
// pair
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@ -45,7 +93,7 @@ namespace boost
|
|||||||
{
|
{
|
||||||
typedef std::size_t type;
|
typedef std::size_t type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename Iterator >
|
template< typename Iterator >
|
||||||
struct range_size< const std::pair<Iterator,Iterator> >
|
struct range_size< const std::pair<Iterator,Iterator> >
|
||||||
{
|
{
|
||||||
@ -124,4 +172,5 @@ namespace boost
|
|||||||
|
|
||||||
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -16,12 +16,26 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/range/config.hpp>
|
#include <boost/range/config.hpp>
|
||||||
|
#include <boost/range/iterator.hpp>
|
||||||
|
|
||||||
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
#include <boost/range/detail/value_type.hpp>
|
#include <boost/range/detail/value_type.hpp>
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include <boost/iterator/iterator_traits.hpp>
|
#include <boost/iterator/iterator_traits.hpp>
|
||||||
|
|
||||||
|
namespace boost
|
||||||
|
{
|
||||||
|
template< class T >
|
||||||
|
struct range_value
|
||||||
|
{
|
||||||
|
typedef BOOST_DEDUCED_TYPENAME iterator_value<
|
||||||
|
BOOST_DEDUCED_TYPENAME range_iterator<T>::type >::type
|
||||||
|
type;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
@ -31,13 +45,13 @@ namespace boost
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// default
|
// default
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
template< typename C >
|
template< typename C >
|
||||||
struct range_value
|
struct range_value
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME C::value_type type;
|
typedef BOOST_DEDUCED_TYPENAME C::value_type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// pair
|
// pair
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@ -45,15 +59,15 @@ namespace boost
|
|||||||
template< typename Iterator >
|
template< typename Iterator >
|
||||||
struct range_value< std::pair<Iterator,Iterator> >
|
struct range_value< std::pair<Iterator,Iterator> >
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME
|
typedef BOOST_DEDUCED_TYPENAME
|
||||||
iterator_value<Iterator>::type type;
|
iterator_value<Iterator>::type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template< typename Iterator >
|
template< typename Iterator >
|
||||||
struct range_value< const std::pair<Iterator,Iterator> >
|
struct range_value< const std::pair<Iterator,Iterator> >
|
||||||
{
|
{
|
||||||
typedef BOOST_DEDUCED_TYPENAME
|
typedef BOOST_DEDUCED_TYPENAME
|
||||||
iterator_value<Iterator>::type type;
|
iterator_value<Iterator>::type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -72,7 +86,7 @@ namespace boost
|
|||||||
{
|
{
|
||||||
typedef const T type;
|
typedef const T type;
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// string
|
// string
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@ -126,7 +140,7 @@ namespace boost
|
|||||||
};
|
};
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
*/
|
||||||
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -35,6 +35,7 @@ test-suite range :
|
|||||||
[ range-test algorithm_example ]
|
[ range-test algorithm_example ]
|
||||||
[ range-test reversible_range ]
|
[ range-test reversible_range ]
|
||||||
[ range-test const_ranges ]
|
[ range-test const_ranges ]
|
||||||
|
[ range-test extension_mechanism ]
|
||||||
# [ range-test mfc : <include>$(VC71_ROOT)/atlmfc/include ]
|
# [ range-test mfc : <include>$(VC71_ROOT)/atlmfc/include ]
|
||||||
;
|
;
|
||||||
|
|
||||||
|
112
test/extension_mechanism.cpp
Executable file
112
test/extension_mechanism.cpp
Executable file
@ -0,0 +1,112 @@
|
|||||||
|
// Boost.Range library
|
||||||
|
//
|
||||||
|
// Copyright Thorsten Ottosen 2003-2004. 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/
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include <boost/detail/workaround.hpp>
|
||||||
|
|
||||||
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
||||||
|
# pragma warn -8091 // supress warning in Boost.Test
|
||||||
|
# pragma warn -8057 // unused argument argc/argv in Boost.Test
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <boost/range.hpp>
|
||||||
|
#include <boost/test/test_tools.hpp>
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Generic range algorithm
|
||||||
|
//
|
||||||
|
template< class Rng >
|
||||||
|
typename boost::range_result_iterator<Rng>::type foo_algo( Rng& r )
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// This will only compile for Rng = UDT if the qualified calls
|
||||||
|
// find boost_range_XXX via ADL.
|
||||||
|
//
|
||||||
|
return boost::size(r) == 0u ? boost::begin(r) : boost::end(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Foo
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Our sample UDT
|
||||||
|
//
|
||||||
|
struct X
|
||||||
|
{
|
||||||
|
typedef std::vector<int> data_t;
|
||||||
|
typedef data_t::iterator iterator;
|
||||||
|
typedef data_t::const_iterator const_iterator;
|
||||||
|
typedef data_t::size_type size_type;
|
||||||
|
|
||||||
|
data_t vec;
|
||||||
|
|
||||||
|
void push_back( int i )
|
||||||
|
{ vec.push_back(i); }
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// The required functions. No type-traits need
|
||||||
|
// to be defined because X defines the proper set of
|
||||||
|
// nested types.
|
||||||
|
//
|
||||||
|
inline X::iterator boost_range_begin( X& x )
|
||||||
|
{
|
||||||
|
return x.vec.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline X::const_iterator boost_range_begin( const X& x )
|
||||||
|
{
|
||||||
|
return x.vec.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline X::iterator boost_range_end( X& x )
|
||||||
|
{
|
||||||
|
return x.vec.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline X::const_iterator boost_range_end( const X& x )
|
||||||
|
{
|
||||||
|
return x.vec.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline X::size_type boost_range_size( const X& x )
|
||||||
|
{
|
||||||
|
return x.vec.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_extension()
|
||||||
|
{
|
||||||
|
Foo::X x;
|
||||||
|
x.push_back(3);
|
||||||
|
const Foo::X x2;
|
||||||
|
|
||||||
|
foo_algo( x );
|
||||||
|
foo_algo( x2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
using boost::unit_test::test_suite;
|
||||||
|
|
||||||
|
test_suite* init_unit_test_suite( int argc, char* argv[] )
|
||||||
|
{
|
||||||
|
test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" );
|
||||||
|
|
||||||
|
test->add( BOOST_TEST_CASE( &check_extension ) );
|
||||||
|
|
||||||
|
return test;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user