Compare commits

..

13 Commits

Author SHA1 Message Date
nobody
40920f5879 This commit was manufactured by cvs2svn to create tag
'Version_1_33_1_beta'.

[SVN r31604]
2005-11-08 23:18:41 +00:00
Thorsten Jørgen Ottosen
99378979c2 *** empty log message ***
[SVN r31520]
2005-10-31 23:11:00 +00:00
John Maddock
848c11831e Re-enable broken compiler workarounds (they cause regressions if not present).
[SVN r31512]
2005-10-31 13:29:56 +00:00
Thorsten Jørgen Ottosen
823d513129 *** empty log message ***
[SVN r30988]
2005-09-14 17:05:05 +00:00
Thorsten Jørgen Ottosen
21c1285cd0 *** empty log message ***
[SVN r30927]
2005-09-12 20:08:14 +00:00
Thorsten Jørgen Ottosen
a47b8664f7 simplified metafunctions interface
[SVN r30889]
2005-09-09 16:11:29 +00:00
Thorsten Jørgen Ottosen
19d2d83d29 added remove_const to parameters to avoid common instantiations errors
[SVN r30855]
2005-09-07 16:13:23 +00:00
Thorsten Jørgen Ottosen
06e624858b added discussion on extension mechanism
[SVN r30854]
2005-09-07 16:12:03 +00:00
Thorsten Jørgen Ottosen
43a83f500e added test for extension mechanism
[SVN r30815]
2005-09-05 19:44:09 +00:00
Thorsten Jørgen Ottosen
9b66041b25 *** empty log message ***
[SVN r30508]
2005-08-08 20:58:56 +00:00
Thorsten Jørgen Ottosen
b4f01b66bb *** empty log message ***
[SVN r30490]
2005-08-05 15:16:37 +00:00
Jonathan Turkanis
59f118601a fixed broken links
[SVN r30421]
2005-08-03 19:43:36 +00:00
nobody
d0f9bf8cc0 This commit was manufactured by cvs2svn to create branch 'RC_1_33_0'.
[SVN r30300]
2005-07-28 18:22:24 +00:00
69 changed files with 2675 additions and 8233 deletions

View File

@@ -1,22 +0,0 @@
use-project boost : $(BOOST_ROOT) ;
import boostbook : boostbook ;
import quickbook ;
xml boost_range : boost_range.qbk ;
boostbook standalone
:
boost_range
:
<xsl:param>toc.max.depth=2
<xsl:param>toc.section.depth=4
<xsl:param>chunk.section.depth=2
# <xsl:param>generate.section.toc.level=4
# <xsl:param>chunk.first.sections=7
# <xsl:param>toc.section.depth=10
;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,106 +3,106 @@
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;
};
//
// 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;
};
*/
//
// 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_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_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;
};
*/
struct range_difference< Foo::Pair<T> >
{
typedef typename std::iterator_traits<T>::difference_type type;
};
*/
template< class T >
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;
};
{
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;
}
//
// 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;
}
inline T boost_range_begin( const Pair<T>& x )
{
return x.first;
}
template< class T >
template< class T >
inline T boost_range_end( Pair<T>& x )
{
return x.last;
}
{
return x.last;
}
template< class T >
template< class T >
inline T boost_range_end( const Pair<T>& x )
{
return x.last;
}
{
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);
}
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'
@@ -110,32 +110,32 @@ namespace Foo
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 );
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
//
//
// Test metafunctions
//
boost::range_value< Foo::Pair<iter> >::type
v = *boost::begin(pair);
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);
boost::range_difference< Foo::Pair<iter> >::type
d = boost::end(pair) - boost::begin(pair);
}

View File

@@ -49,12 +49,6 @@
<td ><a href="boost_range.html#range_iterator"
>range_iterator</a></td>
<td><a href="range.html#single_pass_range">Single Pass Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/mutable_iterator.hpp&gt;</code></td>
<td ><a href="boost_range.html#range_mutable_iterator"
>range_mutable_iterator</a></td>
<td><a href="range.html#single_pass_range">Single Pass Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/const_iterator.hpp&gt;</code></td>
@@ -73,24 +67,27 @@
<td ><a href="boost_range.html#range_size" >range_size</a></td>
<td><a href="range.html#forward_range">Forward Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/pointer.hpp&gt;</code></td>
<td ><a href="boost_range.html#range_pointer"
>range_pointer</a></td>
<tr >
<td ><code >&lt;boost/range/result_iterator.hpp&gt;</code></td>
<td ><a href="boost_range.html#range_result_iterator"
>range_result_iterator</a></td>
<td>- </td>
</tr>
<tr >
<td ><code >&lt;boost/range/category.hpp&gt;</code></td>
<td ><a href="boost_range.html#range_category"
>range_category</a></td>
<td>- </td>
</tr>
<tr >
<td ><code >&lt;boost/range/reverse_iterator.hpp&gt;</code></td>
<td ><a href="boost_range.html#range_reverse_iterator" >range_reverse_iterator</a></td>
<td><a href="range.html#bidirectional_range">Bidirectional Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/const_reverse_iterator.hpp&gt;</code></td>
<td ><a href="boost_range.html#range_const_reverse_iterator" >range_const_reverse_iterator</a></td>
<td><a href="range.html#bidirectional_range">Bidirectional Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/reverse_result_iterator.hpp&gt;</code></td>
<td ><a href="boost_range.html#range_reverse_result_iterator">range_reverse_result_iterator</a></td>
<td>- </td>
</tr>
<tr >
<td ><code >&lt;boost/range/begin.hpp&gt;</code></td>
<td >
@@ -111,17 +108,11 @@
<td ><code >&lt;boost/range/empty.hpp&gt;</code></td>
<td ><a href="boost_range.html#empty" >empty</a></td>
<td><a href="range.html#single_pass_range">Single Pass Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/distance.hpp&gt;</code></td>
<td ><a href="boost_range.html#distance" >distance</a></td>
<td><a href="range.html#forward_range">Forward Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/size.hpp&gt;</code></td>
<td ><a href="boost_range.html#size" >size</a></td>
<td><a href="range.html#random_access_range">Random Access Range</a>
</td>
<td><a href="range.html#forward_range">Forward Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/rbegin.hpp&gt;</code></td>
@@ -139,21 +130,6 @@
</td>
<td><a href="range.html#bidirectional_range">Bidirectional Range</a> </td>
</tr>
<tr >
<td ><code >&lt;boost/range/as_array.hpp&gt;</code></td>
<td >
<a href="boost_range.html#as_array" >as_array</a>
</td>
<td>-</td>
</tr>
<tr >
<td ><code >&lt;boost/range/as_literal.hpp&gt;</code></td>
<td >
<a href="boost_range.html#as_literal" >as_literal</a>
</td>
<td>-</td>
</tr>
<tr >
<td ><code >&lt;boost/range/iterator_range.hpp&gt;</code></td>
<td ><a href="utility_class.html#iter_range"
@@ -165,11 +141,6 @@
<td ><a href="utility_class.html#sub_range" >sub_range</a></td>
<td>- </td>
</tr>
<tr >
<td ><code >&lt;boost/range/concepts.hpp&gt;</code></td>
<td ><a href="range.html#concept_checking" >concept checks</a></td>
<td>- </td>
</tr>
</table>
<br

View File

@@ -56,12 +56,9 @@ C++ standard: <blockquote>
vc6 and vc7.
</ul>
</p>
<p>
The concept checks and their documentation was provided by Daniel Walker.
<hr>
<p>
(C) Copyright Thorsten Ottosen 2003-2006
(C) Copyright Thorsten Ottosen 2003-2005
</p>
<br>

View File

@@ -60,14 +60,22 @@ free-standing functions so syntactic and/or semantic differences can be removed.
more flexible, compact and maintainable client code
</li>
<li >
safe use of built-in arrays
correct handling of null-terminated strings
<p>
<b>Warning:</b><i> support for null-terminated strings is deprecated and will
disappear in the next Boost release (1.34). </i>
</p>
</li>
<li >
safe use of built-in arrays (for legacy code; why else would you use
built-in arrays?) </li>
</ul>
</p>
<p >
Below are given a small example (the complete example can be found <a
href="../test/algorithm_example.cpp" target="_self" >here</a>): <blockquote>
Below are given a small example (the complete example can be found <a href="../test/algorithm_example.cpp" target="_self" >here</a>
):
<blockquote>
<pre >
<span class=comment>
//
@@ -79,24 +87,24 @@ free-standing functions so syntactic and/or semantic differences can be removed.
</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=keyword>template</span><span class=special>&lt; </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>&gt;
</span><span class=keyword>inline </span><span class=keyword>typename </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>range_iterator</span><span class=special>&lt; </span><span class=keyword>const </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>&lt; </span><span
class=identifier>ForwardReadableRange </span><span class=special>&gt;::</span><span class=identifier>type
</span><span class=identifier>find</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>ForwardReadableRange</span><span class=special>&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>T</span><span class=special>&amp; </span><span class=identifier>value </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=special>}
</span><span class=comment>//
// replace first value and return its index
//
</span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>ForwardReadableWriteableRange</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>&gt;
</span><span class=keyword>inline </span><span class=keyword>typename </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>range_difference</span><span class=special>&lt; </span><span class=identifier>ForwardReadableWriteableRange </span><span class=special>&gt;::</span><span class=identifier>type
</span><span class=keyword>inline </span><span class=keyword>typename </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>range_size</span><span class=special>&lt; </span><span class=identifier>ForwardReadableWriteableRange </span><span class=special>&gt;::</span><span class=identifier>type
</span><span class=identifier>my_generic_replace</span><span class=special>( </span><span class=identifier>ForwardReadableWriteableRange</span><span class=special>&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>T</span><span class=special>&amp; </span><span class=identifier>value</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>T</span><span class=special>&amp; </span><span class=identifier>replacement </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>&lt; </span><span class=identifier>ForwardReadableWriteableRange </span><span class=special>&gt;::</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=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>);
@@ -107,30 +115,30 @@ class=identifier>ForwardReadableRange </span><span class=special>&gt;::</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=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </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 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>
</span><span class=keyword>typedef </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt;::</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>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=identifier>iterator</span><span class=special>&gt; </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=keyword>char </span><span class=identifier>str_val</span><span class=special>[] </span><span class=special>= </span><span class=string>&quot;a string&quot;</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>&lt;&lt; </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>&lt;&lt; </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>&lt;&lt; </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>&lt;&lt; </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>&lt;&lt; </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>&lt;&lt; </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=comment>// prints '3', '5' and '0' </span>
</pre>
</blockquote>
By using the free-standing functions and <a
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.
By using the free-standing functions and <a
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.
Notice that we have to
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
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
Forwarding Problem</a> ).
</p>
@@ -138,7 +146,7 @@ Notice that we have to
<hr>
<p>
(C) Copyright Thorsten Ottosen 2003-2007
(C) Copyright Thorsten Ottosen 2003-2004
</p>
<br>

View File

@@ -1,313 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.4: http://docutils.sourceforge.net/" />
<title>Boost Range MFC/ATL Extension</title>
<meta name="author" content="Shunsuke Sogame" />
<meta name="date" content="26th of May 2006" />
<meta name="copyright" content="Shunsuke Sogame 2005-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt)." />
<style type="text/css">
@import "http://www.boost.org/libs/ptr_container/doc/default.css";
</style>
</head>
<body>
<div class="document" id="boost-range-mfc-atl-extension">
<h1 class="title"><img alt="Boost" src="http://www.boost.org/libs/ptr_container/doc/boost.png" /> Range MFC/ATL Extension</h1>
<table class="docinfo" frame="void" rules="none">
<col class="docinfo-name" />
<col class="docinfo-content" />
<tbody valign="top">
<tr><th class="docinfo-name">Author:</th>
<td>Shunsuke Sogame</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference" href="mailto:mb2act&#64;yahoo.co.jp">mb2act&#64;yahoo.co.jp</a></td></tr>
<tr><th class="docinfo-name">Date:</th>
<td>26th of May 2006</td></tr>
<tr><th class="docinfo-name">Copyright:</th>
<td>Shunsuke Sogame 2005-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see <a class="reference" href="http://www.boost.org/LICENSE_1_0.txt">LICENSE_1_0.txt</a>).</td></tr>
</tbody>
</table>
<div class="section">
<h1><a id="overview" name="overview">Overview</a></h1>
<p>Boost.Range MFC/ATL Extension provides <a class="reference" href="http://www.boost.org/libs/range/">Boost.Range</a> support for MFC/ATL collection and string types.</p>
<pre class="literal-block">
CTypedPtrArray&lt;CPtrArray, CList&lt;CString&gt; *&gt; myArray;
...
BOOST_FOREACH (CList&lt;CString&gt; *theList, myArray)
{
BOOST_FOREACH (CString&amp; str, *theList)
{
boost::to_upper(str);
std::sort(boost::begin(str), boost::end(str));
...
}
}
</pre>
<ul class="simple">
<li><a class="reference" href="#requirements">Requirements</a></li>
<li><a class="reference" href="#mfc-ranges">MFC Ranges</a></li>
<li><a class="reference" href="#atl-ranges">ATL Ranges</a></li>
<li><a class="reference" href="#const-ranges">const Ranges</a></li>
<li><a class="reference" href="#references">References</a></li>
</ul>
</div>
<div class="section">
<h1><a id="requirements" name="requirements">Requirements</a></h1>
<ul class="simple">
<li><a class="reference" href="http://www.boost.org/">Boost C++ Libraries Version 1.34.0</a> or later (no compilation required)</li>
<li>Visual C++ 7.1 or Visual C++ 8.0</li>
</ul>
</div>
<div class="section">
<h1><a id="mfc-ranges" name="mfc-ranges">MFC Ranges</a></h1>
<p>If the <tt class="docutils literal"><span class="pre">&lt;boost/range/mfc.hpp&gt;</span></tt> is included before or after <a class="reference" href="http://www.boost.org/libs/range/">Boost.Range</a> headers,
the MFC collections and strings become models of Range.
The table below lists the Traversal Category and <tt class="docutils literal"><span class="pre">range_reference</span></tt> of MFC ranges.</p>
<table border="1" class="docutils">
<colgroup>
<col width="34%" />
<col width="21%" />
<col width="45%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head"><tt class="docutils literal"><span class="pre">Range</span></tt></th>
<th class="head">Traversal Category</th>
<th class="head"><tt class="docutils literal"><span class="pre">range_reference&lt;Range&gt;::type</span></tt></th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">CArray&lt;T,A&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">T&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CList&lt;T,A&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">T&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CMap&lt;K,AK,M,AM&gt;</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">Range::CPair&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CTypedPtrArray&lt;B,T*&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">T*</span> <span class="pre">const</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CTypedPtrList&lt;B,T*&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">T*</span> <span class="pre">const</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CTypedPtrMap&lt;B,T*,V*&gt;</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">std::pair&lt;T*,V*&gt;</span> <span class="pre">const</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CByteArray</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">BYTE&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CDWordArray</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">DWORD&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CObArray</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">CObject*</span> <span class="pre">&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CPtrArray</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">void*</span> <span class="pre">&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CStringArray</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">CString&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CUIntArray</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">UINT&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CWordArray</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">WORD&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CObList</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">CObject*</span> <span class="pre">&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CPtrList</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">void*</span> <span class="pre">&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CStringList</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">CString&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CMapPtrToWord</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">std::pair&lt;void*,WORD&gt;</span> <span class="pre">const</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CMapPtrToPtr</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">std::pair&lt;void*,void*&gt;</span> <span class="pre">const</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CMapStringToOb</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">std::pair&lt;String,CObject*&gt;</span> <span class="pre">const</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CMapStringToString</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">Range::CPair&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CMapWordToOb</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">std::pair&lt;WORD,CObject*&gt;</span> <span class="pre">const</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CMapWordToPtr</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">std::pair&lt;WORD,void*&gt;</span> <span class="pre">const</span></tt></td>
</tr>
</tbody>
</table>
<p>Other <a class="reference" href="http://www.boost.org/libs/range/">Boost.Range</a> metafunctions are defined by the following.
Let <tt class="docutils literal"><span class="pre">Range</span></tt> be any type listed above and <tt class="docutils literal"><span class="pre">ReF</span></tt> be the same as <tt class="docutils literal"><span class="pre">range_reference&lt;Range&gt;::type</span></tt>.
<tt class="docutils literal"><span class="pre">range_value&lt;Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">remove_reference&lt;remove_const&lt;Ref&gt;::type&gt;::type</span></tt>,
<tt class="docutils literal"><span class="pre">range_difference&lt;Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">std::ptrdiff_t</span></tt>, and
<tt class="docutils literal"><span class="pre">range_pointer&lt;Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">add_pointer&lt;remove_reference&lt;Ref&gt;::type&gt;::type</span></tt>.
As for <tt class="docutils literal"><span class="pre">const</span> <span class="pre">Range</span></tt>, see <a class="reference" href="#const-ranges">const Ranges</a>.</p>
</div>
<div class="section">
<h1><a id="atl-ranges" name="atl-ranges">ATL Ranges</a></h1>
<p>If the <tt class="docutils literal"><span class="pre">&lt;boost/range/atl.hpp&gt;</span></tt> is included before or after <a class="reference" href="http://www.boost.org/libs/range/">Boost.Range</a> headers,
the ATL collections and strings become models of Range.
The table below lists the Traversal Category and <tt class="docutils literal"><span class="pre">range_reference</span></tt> of ATL ranges.</p>
<table border="1" class="docutils">
<colgroup>
<col width="34%" />
<col width="21%" />
<col width="45%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head"><tt class="docutils literal"><span class="pre">Range</span></tt></th>
<th class="head">Traversal Category</th>
<th class="head"><tt class="docutils literal"><span class="pre">range_reference&lt;Range&gt;::type</span></tt></th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">CAtlArray&lt;E,ET&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">E&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CAutoPtrArray&lt;E&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">E&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CInterfaceArray&lt;I,pi&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">CComQIPtr&lt;I,pi&gt;&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CAtlList&lt;E,ET&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">E&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CAutoPtrList&lt;E&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">E&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CHeapPtrList&lt;E,A&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">E&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CInterfaceList&lt;I,pi&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">CComQIPtr&lt;I,pi&gt;&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CAtlMap&lt;K,V,KT,VT&gt;</span></tt></td>
<td>Forward</td>
<td><tt class="docutils literal"><span class="pre">Range::CPair&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CRBTree&lt;K,V,KT,VT&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">Range::CPair&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CRBMap&lt;K,V,KT,VT&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">Range::CPair&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CRBMultiMap&lt;K,V,KT,VT&gt;</span></tt></td>
<td>Bidirectional</td>
<td><tt class="docutils literal"><span class="pre">Range::CPair&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CSimpleStringT&lt;B,b&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">B&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CStringT&lt;B,ST&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">B&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CFixedStringT&lt;S,n&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">range_reference&lt;S&gt;::type</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CStringT&lt;B,ST&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">B&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CComBSTR</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">OLECHAR&amp;</span></tt></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CSimpleArray&lt;T,TE&gt;</span></tt></td>
<td>Random Access</td>
<td><tt class="docutils literal"><span class="pre">T&amp;</span></tt></td>
</tr>
</tbody>
</table>
<p>Other <a class="reference" href="http://www.boost.org/libs/range/">Boost.Range</a> metafunctions are defined by the following.
Let <tt class="docutils literal"><span class="pre">Range</span></tt> be any type listed above and <tt class="docutils literal"><span class="pre">ReF</span></tt> be the same as <tt class="docutils literal"><span class="pre">range_reference&lt;Range&gt;::type</span></tt>.
<tt class="docutils literal"><span class="pre">range_value&lt;Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">remove_reference&lt;Ref&gt;::type</span></tt>,
<tt class="docutils literal"><span class="pre">range_difference&lt;Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">std::ptrdiff_t</span></tt>, and
<tt class="docutils literal"><span class="pre">range_pointer&lt;Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">add_pointer&lt;remove_reference&lt;Ref&gt;::type&gt;::type</span></tt>.
As for <tt class="docutils literal"><span class="pre">const</span> <span class="pre">Range</span></tt>, see <a class="reference" href="#const-ranges">const Ranges</a>.</p>
</div>
<div class="section">
<h1><a id="const-ranges" name="const-ranges">const Ranges</a></h1>
<p><tt class="docutils literal"><span class="pre">range_reference&lt;const</span> <span class="pre">Range&gt;::type</span></tt> is defined by the following algorithm.
Let <tt class="docutils literal"><span class="pre">Range</span></tt> be any type listed above and <tt class="docutils literal"><span class="pre">ReF</span></tt> be the same as <tt class="docutils literal"><span class="pre">range_reference&lt;Range&gt;::type</span></tt>.</p>
<pre class="literal-block">
if (Range is CObArray || Range is CObList)
return CObject const * &amp;
else if (Range is CPtrArray || Range is CPtrList)
return void const * &amp;
else if (there is a type X such that X&amp; is the same as ReF)
return X const &amp;
else if (there is a type X such that X* const is the same as ReF)
return X const * const
else
return ReF
</pre>
<p>Other <a class="reference" href="http://www.boost.org/libs/range/">Boost.Range</a> metafunctions are defined by the following.
<tt class="docutils literal"><span class="pre">range_value&lt;const</span> <span class="pre">Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">range_value&lt;Range&gt;::type</span></tt>,
<tt class="docutils literal"><span class="pre">range_difference&lt;const</span> <span class="pre">Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">std::ptrdiff_t</span></tt>, and
<tt class="docutils literal"><span class="pre">range_pointer&lt;const</span> <span class="pre">Range&gt;::type</span></tt> is the same as <tt class="docutils literal"><span class="pre">add_pointer&lt;remove_reference&lt;range_reference&lt;const</span> <span class="pre">Range&gt;::type&gt;::type&gt;::type</span></tt>.</p>
</div>
<div class="section">
<h1><a id="references" name="references">References</a></h1>
<ul class="simple">
<li><a class="reference" href="http://www.boost.org/libs/range/">Boost.Range</a></li>
<li><a class="reference" href="http://msdn2.microsoft.com/en-us/library/942860sh.aspx">MFC Collections</a></li>
<li><a class="reference" href="http://msdn2.microsoft.com/en-US/library/15e672bd.aspx">ATL Collection Classes</a></li>
</ul>
</div>
</div>
<div class="footer">
<hr class="footer" />
<a class="reference" href="mfc_atl.rst">View document source</a>.
Generated on: 2006-06-04 22:37 UTC.
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
</div>
</body>
</html>

View File

@@ -1,232 +0,0 @@
++++++++++++++++++++++++++++++++
|Boost| Range MFC/ATL Extension
++++++++++++++++++++++++++++++++
.. |Boost| image:: http://www.boost.org/libs/ptr_container/doc/boost.png
:Author: Shunsuke Sogame
:Contact: mb2act@yahoo.co.jp
:date: 26th of May 2006
:copyright: Shunsuke Sogame 2005-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt__).
__ http://www.boost.org/LICENSE_1_0.txt
========
Overview
========
Boost.Range MFC/ATL Extension provides `Boost.Range`_ support for MFC/ATL collection and string types.
.. parsed-literal::
CTypedPtrArray<CPtrArray, CList<CString> \*> myArray;
...
BOOST_FOREACH (CList<CString> \*theList, myArray)
{
BOOST_FOREACH (CString& str, \*theList)
{
boost::to_upper(str);
std::sort(boost::begin(str), boost::end(str));
...
}
}
* `Requirements`_
* `MFC Ranges`_
* `ATL Ranges`_
* `const Ranges`_
* `References`_
============
Requirements
============
- `Boost C++ Libraries Version 1.34.0`__ or later (no compilation required)
- Visual C++ 7.1 or Visual C++ 8.0
__ Boost_
==========
MFC Ranges
==========
If the ``<boost/range/mfc.hpp>`` is included before or after `Boost.Range`_ headers,
the MFC collections and strings become models of Range.
The table below lists the Traversal Category and ``range_reference`` of MFC ranges.
============================= ================== =======================================
``Range`` Traversal Category ``range_reference<Range>::type``
============================= ================== =======================================
``CArray<T,A>`` Random Access ``T&``
----------------------------- ------------------ ---------------------------------------
``CList<T,A>`` Bidirectional ``T&``
----------------------------- ------------------ ---------------------------------------
``CMap<K,AK,M,AM>`` Forward ``Range::CPair&``
----------------------------- ------------------ ---------------------------------------
``CTypedPtrArray<B,T*>`` Random Access ``T* const``
----------------------------- ------------------ ---------------------------------------
``CTypedPtrList<B,T*>`` Bidirectional ``T* const``
----------------------------- ------------------ ---------------------------------------
``CTypedPtrMap<B,T*,V*>`` Forward ``std::pair<T*,V*> const``
----------------------------- ------------------ ---------------------------------------
``CByteArray`` Random Access ``BYTE&``
----------------------------- ------------------ ---------------------------------------
``CDWordArray`` Random Access ``DWORD&``
----------------------------- ------------------ ---------------------------------------
``CObArray`` Random Access ``CObject* &``
----------------------------- ------------------ ---------------------------------------
``CPtrArray`` Random Access ``void* &``
----------------------------- ------------------ ---------------------------------------
``CStringArray`` Random Access ``CString&``
----------------------------- ------------------ ---------------------------------------
``CUIntArray`` Random Access ``UINT&``
----------------------------- ------------------ ---------------------------------------
``CWordArray`` Random Access ``WORD&``
----------------------------- ------------------ ---------------------------------------
``CObList`` Bidirectional ``CObject* &``
----------------------------- ------------------ ---------------------------------------
``CPtrList`` Bidirectional ``void* &``
----------------------------- ------------------ ---------------------------------------
``CStringList`` Bidirectional ``CString&``
----------------------------- ------------------ ---------------------------------------
``CMapPtrToWord`` Forward ``std::pair<void*,WORD> const``
----------------------------- ------------------ ---------------------------------------
``CMapPtrToPtr`` Forward ``std::pair<void*,void*> const``
----------------------------- ------------------ ---------------------------------------
``CMapStringToOb`` Forward ``std::pair<String,CObject*> const``
----------------------------- ------------------ ---------------------------------------
``CMapStringToString`` Forward ``Range::CPair&``
----------------------------- ------------------ ---------------------------------------
``CMapWordToOb`` Forward ``std::pair<WORD,CObject*> const``
----------------------------- ------------------ ---------------------------------------
``CMapWordToPtr`` Forward ``std::pair<WORD,void*> const``
============================= ================== =======================================
Other `Boost.Range`_ metafunctions are defined by the following.
Let ``Range`` be any type listed above and ``ReF`` be the same as ``range_reference<Range>::type``.
``range_value<Range>::type`` is the same as ``remove_reference<remove_const<Ref>::type>::type``,
``range_difference<Range>::type`` is the same as ``std::ptrdiff_t``, and
``range_pointer<Range>::type`` is the same as ``add_pointer<remove_reference<Ref>::type>::type``.
As for ``const Range``, see `const Ranges`_.
==========
ATL Ranges
==========
If the ``<boost/range/atl.hpp>`` is included before or after `Boost.Range`_ headers,
the ATL collections and strings become models of Range.
The table below lists the Traversal Category and ``range_reference`` of ATL ranges.
============================= ================== =======================================
``Range`` Traversal Category ``range_reference<Range>::type``
============================= ================== =======================================
``CAtlArray<E,ET>`` Random Access ``E&``
----------------------------- ------------------ ---------------------------------------
``CAutoPtrArray<E>`` Random Access ``E&``
----------------------------- ------------------ ---------------------------------------
``CInterfaceArray<I,pi>`` Random Access ``CComQIPtr<I,pi>&``
----------------------------- ------------------ ---------------------------------------
``CAtlList<E,ET>`` Bidirectional ``E&``
----------------------------- ------------------ ---------------------------------------
``CAutoPtrList<E>`` Bidirectional ``E&``
----------------------------- ------------------ ---------------------------------------
``CHeapPtrList<E,A>`` Bidirectional ``E&``
----------------------------- ------------------ ---------------------------------------
``CInterfaceList<I,pi>`` Bidirectional ``CComQIPtr<I,pi>&``
----------------------------- ------------------ ---------------------------------------
``CAtlMap<K,V,KT,VT>`` Forward ``Range::CPair&``
----------------------------- ------------------ ---------------------------------------
``CRBTree<K,V,KT,VT>`` Bidirectional ``Range::CPair&``
----------------------------- ------------------ ---------------------------------------
``CRBMap<K,V,KT,VT>`` Bidirectional ``Range::CPair&``
----------------------------- ------------------ ---------------------------------------
``CRBMultiMap<K,V,KT,VT>`` Bidirectional ``Range::CPair&``
----------------------------- ------------------ ---------------------------------------
``CSimpleStringT<B,b>`` Random Access ``B&``
----------------------------- ------------------ ---------------------------------------
``CStringT<B,ST>`` Random Access ``B&``
----------------------------- ------------------ ---------------------------------------
``CFixedStringT<S,n>`` Random Access ``range_reference<S>::type``
----------------------------- ------------------ ---------------------------------------
``CStringT<B,ST>`` Random Access ``B&``
----------------------------- ------------------ ---------------------------------------
``CComBSTR`` Random Access ``OLECHAR&``
----------------------------- ------------------ ---------------------------------------
``CSimpleArray<T,TE>`` Random Access ``T&``
============================= ================== =======================================
Other `Boost.Range`_ metafunctions are defined by the following.
Let ``Range`` be any type listed above and ``ReF`` be the same as ``range_reference<Range>::type``.
``range_value<Range>::type`` is the same as ``remove_reference<Ref>::type``,
``range_difference<Range>::type`` is the same as ``std::ptrdiff_t``, and
``range_pointer<Range>::type`` is the same as ``add_pointer<remove_reference<Ref>::type>::type``.
As for ``const Range``, see `const Ranges`_.
============
const Ranges
============
``range_reference<const Range>::type`` is defined by the following algorithm.
Let ``Range`` be any type listed above and ``ReF`` be the same as ``range_reference<Range>::type``.
.. parsed-literal::
if (Range is CObArray || Range is CObList)
return CObject const \* &
else if (Range is CPtrArray || Range is CPtrList)
return void const \* &
else if (there is a type X such that X& is the same as ReF)
return X const &
else if (there is a type X such that X* const is the same as ReF)
return X const \* const
else
return ReF
Other `Boost.Range`_ metafunctions are defined by the following.
``range_value<const Range>::type`` is the same as ``range_value<Range>::type``,
``range_difference<const Range>::type`` is the same as ``std::ptrdiff_t``, and
``range_pointer<const Range>::type`` is the same as ``add_pointer<remove_reference<range_reference<const Range>::type>::type>::type``.
==========
References
==========
- `Boost.Range`_
- `MFC Collections`__
- `ATL Collection Classes`__
__ http://msdn2.microsoft.com/en-us/library/942860sh.aspx
__ http://msdn2.microsoft.com/en-US/library/15e672bd.aspx
.. _Boost C++ Libraries: http://www.boost.org/
.. _Boost: `Boost C++ Libraries`_
.. _Boost.Range: http://www.boost.org/libs/range/
.. _forward: http://www.boost.org/libs/range/doc/range.html#forward_range
.. _bidirectional: http://www.boost.org/libs/range/doc/range.html#forward_range
.. _random access: http://www.boost.org/libs/range/doc/range.html#random_access_range

View File

@@ -36,8 +36,6 @@
<a href="#bidirectional_range">Bidirectional Range</a>
<li>
<a href="#random_access_range">Random Access Range</a>
<li>
<a href="#concept_checking">Concept Checking</a>
</ul>
<a name="overview"></a>
@@ -452,59 +450,6 @@ href="../../iterator/doc/new-iter-concepts.html#random-access-traversal-iterator
<hr>
<a name=concept_checking><h2>Concept Checking</h2>
Each of the range concepts has a corresponding concept checking
class in the file boost/range/concepts.hpp. These classes may be
used in conjunction with the <a
href="../../concept_check/concept_check.htm">Boost Concept
Check</a> library to insure that the type of a template parameter
is compatible with a range concept. If not, a meaningful compile
time error is generated. Checks are provided for the range
concepts related to iterator traversal categories. For example,
the following line checks that the type <code>T</code> models the
<a href="#forward_range">ForwardRange</a> concept.
<pre>
function_requires&lt;ForwardRangeConcept&lt;T&gt; &gt;();
</pre>
An additional concept check is required for the value access
property of the range based on the range's iterator type. For
example to check for a ForwardReadableRange, the following code is
required.
<pre>
function_requires&lt;ForwardRangeConcept&lt;T&gt; &gt;();
function_requires&lt;
ReadableIteratorConcept&lt;
typename range_iterator&lt;T&gt;::type
&gt;
&gt;();
</pre>
The following range concept checking classes are provided.
<ul>
<li>
Class <code>SinglePassRangeConcept</code> checks for <a
href="#single_pass_range">Single Pass Range</a>
<li>
Class <code>ForwardRangeConcept</code> checks for <a
href="#forward_range">Forward Range</a>
<li>
Class <code>BidirectionalRangeConcept</code> checks for <a
href="#bidirectional_range">Bidirectional Range</a>
<li>
Class <code>RandomAccessRangeConcept</code> checks for <a
href="#random_access_range">Random Access Range</a>
</ul>
<h3>See also</h3>
<p> <a href="style.html">Range Terminology and style guidelines</a></p>
<p> <a href="../../iterator/doc/iterator_concepts.html">Iterator Concepts</a></p>
<p> <a href="../../concept_check/concept_check.htm">Boost Concept Check library</a></p>
<hr>
<!--
<h3>Notes</h3>

View File

@@ -173,11 +173,11 @@ class=keyword>const;</span>
</span><span class=identifier>ForwardTraversalIterator </span><span class=identifier>End </span><span class=special>);
</span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>&gt;
</span><span class=identifier>iterator_range</span><span class=special>&lt; </span><span class=keyword>typename </span><span class=identifier>iterator</span><span class=special>&lt;</span><span class=identifier>ForwardRange</span><span class=special>&gt;::</span><span class=identifier>type </span><span class=special>&gt;
</span><span class=identifier>iterator_range</span><span class=special>&lt; </span><span class=keyword>typename </span><span class=identifier>iterator_of</span><span class=special>&lt;</span><span class=identifier>ForwardRange</span><span class=special>&gt;::</span><span class=identifier>type </span><span class=special>&gt;
</span><span class=identifier>make_iterator_range</span><span class=special>( </span><span class=identifier>ForwardRange</span><span class=special>&amp; </span><span class=identifier>r </span><span class=special>);
</span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>&gt;
</span><span class=identifier>iterator_range</span><span class=special>&lt; </span><span class=keyword>typename </span><span class=identifier>const_iterator</span><span class=special>&lt;</span><span class=identifier>ForwardRange</span><span class=special>&gt;::</span><span class=identifier>type </span><span class=special>&gt;
</span><span class=identifier>iterator_range</span><span class=special>&lt; </span><span class=keyword>typename </span><span class=identifier>const_iterator_of</span><span class=special>&lt;</span><span class=identifier>ForwardRange</span><span class=special>&gt;::</span><span class=identifier>type </span><span class=special>&gt;
</span><span class=identifier>make_iterator_range</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>&amp; </span><span class=identifier>r </span><span class=special>);
</span>
<span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>Range </span><span class=special>&gt;</span>
@@ -305,7 +305,7 @@ class can propagate constness since it knows what a corresponding
</span><span class=identifier>sub_range</span><span class=special>( </span><span class=identifier>ForwardRange2</span><span class=special>&amp; </span><span class=identifier>r </span><span class=special>);
</span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>ForwardRange2 </span><span class=special>&gt;
</span><span class=identifier>sub_range</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>ForwardRange2</span><span class=special>&amp; </span><span class=identifier>r </span><span class=special>);
</span><span class=identifier>sub_range</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>Range2</span><span class=special>&amp; </span><span class=identifier>r </span><span class=special>);
</span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>ForwardRange2 </span><span class=special>&gt;
</span><span class=identifier>sub_range</span><span class=special>&amp; </span><span class=keyword>operator</span><span class=special>=( </span><span class=identifier>ForwardRange2</span><span class=special>&amp; </span><span class=identifier>r </span><span class=special>);

View File

@@ -1,45 +0,0 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen 2006. 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/
//
#ifndef BOOST_RANGE_AS_ARRAY_HPP
#define BOOST_RANGE_AS_ARRAY_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/range/iterator_range.hpp>
#include <boost/range/detail/str_types.hpp>
namespace boost
{
template< class R >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<R>::type >
as_array( R& r )
{
return boost::make_iterator_range( r );
}
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
template< class Range >
inline boost::iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<const Range>::type >
as_array( const Range& r )
{
return boost::make_iterator_range( r );
}
#endif
}
#endif

View File

@@ -1,131 +0,0 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen 2006. 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/
//
#ifndef BOOST_RANGE_DETAIL_AS_LITERAL_HPP
#define BOOST_RANGE_DETAIL_AS_LITERAL_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#if BOOST_NO_FUNCTION_TEMPLATE_ORDERING
#include <boost/range/detail/as_literal.hpp>
#else
#include <boost/range/iterator_range.hpp>
#include <boost/range/detail/str_types.hpp>
#include <boost/detail/workaround.hpp>
#include <cstring>
#include <cwchar>
namespace boost
{
namespace range_detail
{
inline std::size_t length( const char* s )
{
return strlen( s );
}
inline std::size_t length( const wchar_t* s )
{
return wcslen( s );
}
//
// Remark: the compiler cannot choose between T* and T[sz]
// overloads, so we must put the T* internal to the
// unconstrained version.
//
inline bool is_char_ptr( char* )
{
return true;
}
inline bool is_char_ptr( const char* )
{
return true;
}
inline bool is_char_ptr( wchar_t* )
{
return true;
}
inline bool is_char_ptr( const wchar_t* )
{
return true;
}
template< class T >
inline long is_char_ptr( T /* r */ )
{
return 0L;
}
template< class T >
inline iterator_range<T*>
make_range( T* const r, bool )
{
return iterator_range<T*>( r, r + length(r) );
}
template< class T >
inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<T>::type>
make_range( T& r, long )
{
return boost::make_iterator_range( r );
}
}
template< class Range >
inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<Range>::type>
as_literal( Range& r )
{
return range_detail::make_range( r, range_detail::is_char_ptr(r) );
}
template< class Range >
inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<const Range>::type>
as_literal( const Range& r )
{
return range_detail::make_range( r, range_detail::is_char_ptr(r) );
}
template< class Char, std::size_t sz >
inline iterator_range<Char*> as_literal( Char (&arr)[sz] )
{
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x590)) && __BORLANDC__ >= 0x590
return boost::make_iterator_range<Char*>( arr, arr + sz - 1 );
#else
return boost::make_iterator_range( arr, arr + sz - 1 );
#endif
}
template< class Char, std::size_t sz >
inline iterator_range<const Char*> as_literal( const Char (&arr)[sz] )
{
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x590)) && __BORLANDC__ >= 0x590
return boost::make_iterator_range<const Char*>( arr, arr + sz - 1 );
#else
return boost::make_iterator_range( arr, arr + sz - 1 );
#endif
}
}
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
#endif

View File

@@ -1,733 +0,0 @@
#ifndef BOOST_RANGE_ATL_HPP
#define BOOST_RANGE_ATL_HPP
// Boost.Range ATL Extension
//
// Copyright Shunsuke Sogame 2005-2006.
// Distributed under 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)
// config
//
#include <atldef.h> // _ATL_VER
#if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
#if (_ATL_VER < 0x0700)
#define BOOST_RANGE_ATL_NO_COLLECTIONS
#endif
#endif
#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
#if (_ATL_VER < 0x0700) // dubious
#define BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX
#endif
#endif
#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
#if (_MSC_VER < 1310) // from <boost/regex/mfc.hpp>, but dubious
#define BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING
#endif
#endif
// forward declarations
//
#include <basetyps.h> // IID
namespace ATL {
#if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
// arrays
//
template< class E, class ETraits >
class CAtlArray;
template< class E >
class CAutoPtrArray;
template< class I, const IID *piid >
class CInterfaceArray;
// lists
//
template< class E, class ETraits >
class CAtlList;
template< class E >
class CAutoPtrList;
template< class E, class Allocator >
class CHeapPtrList;
template< class I, const IID *piid >
class CInterfaceList;
// maps
//
template< class K, class V, class KTraits, class VTraits >
class CAtlMap;
template< class K, class V, class KTraits, class VTraits >
class CRBTree;
template< class K, class V, class KTraits, class VTraits >
class CRBMap;
template< class K, class V, class KTraits, class VTraits >
class CRBMultiMap;
// strings
//
#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
template< class BaseType, bool t_bMFCDLL >
class CSimpleStringT;
#else
template< class BaseType >
class CSimpleStringT;
#endif
template< class BaseType, class StringTraits >
class CStringT;
template< class StringType, int t_nChars >
class CFixedStringT;
template< class BaseType, const int t_nSize >
class CStaticString;
#endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
// simples
//
#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
template< class T, class TEqual >
class CSimpleArray;
template< class TKey, class TVal, class TEqual >
class CSimpleMap;
#else
template< class T >
class CSimpleArray;
template< class T >
class CSimpleValArray;
template< class TKey, class TVal >
class CSimpleMap;
#endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
// pointers
//
template< class E >
class CAutoPtr;
template< class T >
class CComPtr;
template< class T, const IID *piid >
class CComQIPtr;
template< class E, class Allocator >
class CHeapPtr;
template< class T >
class CAdapt;
} // namespace ATL
// indirect_iterator customizations
//
#include <boost/mpl/identity.hpp>
#include <boost/pointee.hpp>
namespace boost {
template< class E >
struct pointee< ATL::CAutoPtr<E> > :
mpl::identity<E>
{ };
template< class T >
struct pointee< ATL::CComPtr<T> > :
mpl::identity<T>
{ };
template< class T, const IID *piid >
struct pointee< ATL::CComQIPtr<T, piid> > :
mpl::identity<T>
{ };
template< class E, class Allocator >
struct pointee< ATL::CHeapPtr<E, Allocator> > :
mpl::identity<E>
{ };
template< class T >
struct pointee< ATL::CAdapt<T> > :
pointee<T>
{ };
} // namespace boost
// extended customizations
//
#include <boost/iterator/indirect_iterator.hpp>
#include <boost/iterator/zip_iterator.hpp>
#include <boost/range/detail/microsoft.hpp>
#include <boost/tuple/tuple.hpp>
#include <atlbase.h> // CComBSTR
namespace boost { namespace range_detail_microsoft {
#if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
// arrays
//
struct atl_array_functions :
array_functions
{
template< class Iterator, class X >
Iterator end(X& x) // redefine
{
return x.GetData() + x.GetCount(); // no 'GetSize()'
}
};
template< class E, class ETraits >
struct customization< ATL::CAtlArray<E, ETraits> > :
atl_array_functions
{
template< class X >
struct meta
{
typedef E val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
template< class E >
struct customization< ATL::CAutoPtrArray<E> > :
atl_array_functions
{
template< class X >
struct meta
{
// ATL::CAutoPtr/CHeapPtr is no assignable.
typedef ATL::CAutoPtr<E> val_t;
typedef val_t *miter_t;
typedef val_t const *citer_t;
typedef indirect_iterator<miter_t> mutable_iterator;
typedef indirect_iterator<citer_t> const_iterator;
};
};
template< class I, const IID *piid >
struct customization< ATL::CInterfaceArray<I, piid> > :
atl_array_functions
{
template< class X >
struct meta
{
typedef ATL::CComQIPtr<I, piid> val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
template< class E, class ETraits >
struct customization< ATL::CAtlList<E, ETraits> > :
list_functions
{
template< class X >
struct meta
{
typedef E val_t;
typedef list_iterator<X, val_t> mutable_iterator;
typedef list_iterator<X const, val_t const> const_iterator;
};
};
struct indirected_list_functions
{
template< class Iterator, class X >
Iterator begin(X& x)
{
typedef typename Iterator::base_type base_t; // == list_iterator
return Iterator(base_t(x, x.GetHeadPosition()));
}
template< class Iterator, class X >
Iterator end(X& x)
{
typedef typename Iterator::base_type base_t;
return Iterator(base_t(x, POSITION(0)));
}
};
template< class E >
struct customization< ATL::CAutoPtrList<E> > :
indirected_list_functions
{
template< class X >
struct meta
{
typedef ATL::CAutoPtr<E> val_t;
typedef list_iterator<X, val_t> miter_t;
typedef list_iterator<X const, val_t const> citer_t;
typedef indirect_iterator<miter_t> mutable_iterator;
typedef indirect_iterator<citer_t> const_iterator;
};
};
template< class E, class Allocator >
struct customization< ATL::CHeapPtrList<E, Allocator> > :
indirected_list_functions
{
template< class X >
struct meta
{
typedef ATL::CHeapPtr<E, Allocator> val_t;
typedef list_iterator<X, val_t> miter_t;
typedef list_iterator<X const, val_t const> citer_t;
typedef indirect_iterator<miter_t> mutable_iterator;
typedef indirect_iterator<citer_t> const_iterator;
};
};
template< class I, const IID *piid >
struct customization< ATL::CInterfaceList<I, piid> > :
list_functions
{
template< class X >
struct meta
{
typedef ATL::CComQIPtr<I, piid> val_t;
typedef list_iterator<X, val_t> mutable_iterator;
typedef list_iterator<X const, val_t const> const_iterator;
};
};
// maps
//
struct atl_rb_tree_tag
{ };
template< >
struct customization< atl_rb_tree_tag > :
indirected_list_functions
{
template< class X >
struct meta
{
typedef typename X::CPair val_t;
typedef list_iterator<X, val_t *, val_t *> miter_t;
typedef list_iterator<X const, val_t const *, val_t const *> citer_t;
typedef indirect_iterator<miter_t> mutable_iterator;
typedef indirect_iterator<citer_t> const_iterator;
};
};
template< class K, class V, class KTraits, class VTraits >
struct customization< ATL::CAtlMap<K, V, KTraits, VTraits> > :
customization< atl_rb_tree_tag >
{
template< class Iterator, class X >
Iterator begin(X& x) // redefine
{
typedef typename Iterator::base_type base_t; // == list_iterator
return Iterator(base_t(x, x.GetStartPosition())); // no 'GetHeadPosition'
}
};
// strings
//
struct atl_string_tag
{ };
template< >
struct customization< atl_string_tag >
{
template< class X >
struct meta
{
typedef typename X::PXSTR mutable_iterator;
typedef typename X::PCXSTR const_iterator;
};
template< class Iterator, class X >
typename mutable_<Iterator, X>::type begin(X& x)
{
return x.GetBuffer(0);
}
template< class Iterator, class X >
Iterator begin(X const& x)
{
return x.GetString();
}
template< class Iterator, class X >
Iterator end(X& x)
{
return begin<Iterator>(x) + x.GetLength();
}
};
template< class BaseType, const int t_nSize >
struct customization< ATL::CStaticString<BaseType, t_nSize> >
{
template< class X >
struct meta
{
typedef BaseType const *mutable_iterator;
typedef mutable_iterator const_iterator;
};
template< class Iterator, class X >
Iterator begin(X const& x)
{
return x;
}
template< class Iterator, class X >
Iterator end(X const& x)
{
return begin<Iterator>(x) + X::GetLength();
}
};
#endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
template< >
struct customization< ATL::CComBSTR >
{
template< class X >
struct meta
{
typedef OLECHAR *mutable_iterator;
typedef OLECHAR const *const_iterator;
};
template< class Iterator, class X >
Iterator begin(X& x)
{
return x.operator BSTR();
}
template< class Iterator, class X >
Iterator end(X& x)
{
return begin<Iterator>(x) + x.Length();
}
};
// simples
//
#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
template< class T, class TEqual >
struct customization< ATL::CSimpleArray<T, TEqual> > :
#else
template< class T >
struct customization< ATL::CSimpleArray<T> > :
#endif
array_functions
{
template< class X >
struct meta
{
typedef T val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
#if defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
template< class T >
struct customization< ATL::CSimpleValArray<T> > :
array_functions
{
template< class X >
struct meta
{
typedef T val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
#endif // defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
template< class TKey, class TVal, class TEqual >
struct customization< ATL::CSimpleMap<TKey, TVal, TEqual> >
#else
template< class TKey, class TVal >
struct customization< ATL::CSimpleMap<TKey, TVal> >
#endif
{
template< class X >
struct meta
{
typedef TKey k_val_t;
typedef k_val_t *k_miter_t;
typedef k_val_t const *k_citer_t;
typedef TVal v_val_t;
typedef v_val_t *v_miter_t;
typedef v_val_t const *v_citer_t;
// Topic:
// 'std::pair' can't contain references
// because of reference to reference problem.
typedef zip_iterator< tuple<k_miter_t, v_miter_t> > mutable_iterator;
typedef zip_iterator< tuple<k_citer_t, v_citer_t> > const_iterator;
};
template< class Iterator, class X >
Iterator begin(X& x)
{
return Iterator(boost::make_tuple(x.m_aKey, x.m_aVal));
}
template< class Iterator, class X >
Iterator end(X& x)
{
return Iterator(boost::make_tuple(x.m_aKey + x.GetSize(), x.m_aVal + x.GetSize()));
}
};
} } // namespace boost::range_detail_microsoft
// range customizations
//
#if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
// arrays
//
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CAtlArray, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CAutoPtrArray, 1
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CInterfaceArray, (class)(const IID *)
)
// lists
//
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CAtlList, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CAutoPtrList, 1
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CHeapPtrList, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CInterfaceList, (class)(const IID *)
)
//maps
//
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CAtlMap, 4
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::atl_rb_tree_tag,
(ATL, BOOST_PP_NIL), CRBTree, 4
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::atl_rb_tree_tag,
(ATL, BOOST_PP_NIL), CRBMap, 4
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::atl_rb_tree_tag,
(ATL, BOOST_PP_NIL), CRBMultiMap, 4
)
// strings
//
#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::atl_string_tag,
(ATL, BOOST_PP_NIL), CSimpleStringT, (class)(bool)
)
#else
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::atl_string_tag,
(ATL, BOOST_PP_NIL), CSimpleStringT, 1
)
#endif
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::atl_string_tag,
(ATL, BOOST_PP_NIL), CStringT, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::atl_string_tag,
(ATL, BOOST_PP_NIL), CFixedStringT, (class)(int)
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CStaticString, (class)(const int)
)
#endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CComBSTR
)
// simples
//
#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CSimpleArray, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CSimpleMap, 3
)
#else
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CSimpleArray, 1
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CSimpleMap, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
(ATL, BOOST_PP_NIL), CSimpleValArray, 1
)
#endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
#endif

View File

@@ -15,6 +15,7 @@
# pragma once
#endif
#include <boost/type_traits/remove_const.hpp>
#include <boost/range/config.hpp>
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
@@ -22,6 +23,7 @@
#else
#include <boost/range/iterator.hpp>
#include <boost/range/const_iterator.hpp>
namespace boost
{
@@ -38,8 +40,16 @@ namespace range_detail
//////////////////////////////////////////////////////////////////////
template< typename C >
inline BOOST_DEDUCED_TYPENAME range_iterator<C>::type
range_begin( C& c )
inline BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type
boost_range_begin( const C& c )
{
return c.begin();
}
template< typename C >
inline BOOST_DEDUCED_TYPENAME range_iterator<
typename remove_const<C>::type >::type
boost_range_begin( C& c )
{
return c.begin();
}
@@ -49,13 +59,13 @@ namespace range_detail
//////////////////////////////////////////////////////////////////////
template< typename Iterator >
inline Iterator range_begin( const std::pair<Iterator,Iterator>& p )
inline Iterator boost_range_begin( const std::pair<Iterator,Iterator>& p )
{
return p.first;
}
template< typename Iterator >
inline Iterator range_begin( std::pair<Iterator,Iterator>& p )
inline Iterator boost_range_begin( std::pair<Iterator,Iterator>& p )
{
return p.first;
}
@@ -64,22 +74,66 @@ namespace range_detail
// array
//////////////////////////////////////////////////////////////////////
//
// May this be discarded? Or is it needed for bad compilers?
//
template< typename T, std::size_t sz >
inline const T* range_begin( const T (&array)[sz] )
inline const T* boost_range_begin( const T (&array)[sz] )
{
return array;
}
template< typename T, std::size_t sz >
inline T* range_begin( T (&array)[sz] )
inline T* boost_range_begin( T (&array)[sz] )
{
return array;
}
//////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////
#if 1 || BOOST_WORKAROUND(__MWERKS__, <= 0x3204 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
// CW up to 9.3 and borland have troubles with function ordering
inline const char* boost_range_begin( const char* s )
{
return s;
}
inline char* boost_range_begin( char* s )
{
return s;
}
inline const wchar_t* boost_range_begin( const wchar_t* s )
{
return s;
}
inline wchar_t* boost_range_begin( wchar_t* s )
{
return s;
}
#else
inline const char* boost_range_begin( const char*& s )
{
return s;
}
inline char* boost_range_begin( char*& s )
{
return s;
}
inline const wchar_t* boost_range_begin( const wchar_t*& s )
{
return s;
}
inline wchar_t* boost_range_begin( wchar_t*& s )
{
return s;
}
#endif
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
!BOOST_WORKAROUND(__GNUC__, < 3) \
/**/
@@ -88,27 +142,44 @@ namespace range_detail
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)) && \
!BOOST_WORKAROUND(__GNUC__, < 3) \
/**/
using namespace range_detail;
#endif
return range_begin( r );
return boost_range_begin( r );
}
template< class T >
inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type begin( const T& r )
inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type begin( const T& r )
{
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
!BOOST_WORKAROUND(__GNUC__, < 3) \
/**/
using namespace range_detail;
#endif
return range_begin( r );
return boost_range_begin( r );
}
#if BOOST_WORKAROUND(__MWERKS__, <= 0x3003 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
// BCB and CW are not able to overload pointer when class overloads are also available.
template<>
inline range_const_iterator<const char*>::type begin<const char*>( const char*& r )
{
return r;
}
template<>
inline range_const_iterator<const wchar_t*>::type begin<const wchar_t*>( const wchar_t*& r )
{
return r;
}
#endif
} // namespace boost
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
@@ -116,12 +187,11 @@ inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type begin( const T& r )
namespace boost
{
template< class T >
inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type
inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type
const_begin( const T& r )
{
return boost::begin( r );
return begin( r );
}
}
#endif

View File

@@ -1,29 +0,0 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen 2003-2006. 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/
//
#ifndef BOOST_RANGE_CATEGORY_HPP
#define BOOST_RANGE_CATEGORY_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/range/config.hpp>
#include <boost/range/iterator.hpp>
#include <boost/iterator/iterator_traits.hpp>
namespace boost
{
template< class T >
struct range_category : iterator_category< typename range_iterator<T>::type >
{ };
}
#endif

View File

@@ -1,156 +0,0 @@
// Boost.Range library concept checks
//
// Copyright Daniel Walker 2006. Use, modification and distribution
// are 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/
//
#ifndef BOOST_RANGE_CONCEPTS_HPP
#define BOOST_RANGE_CONCEPTS_HPP
#include <boost/concept_check.hpp>
#include <boost/iterator/iterator_concepts.hpp>
#include <boost/range/functions.hpp>
#include <boost/range/metafunctions.hpp>
/*!
* \file
* \brief Concept checks for the Boost Range library.
*
* The structures in this file may be used in conjunction with the
* Boost Concept Check library to insure that the type of a function
* parameter is compatible with a range concept. If not, a meaningful
* compile time error is generated. Checks are provided for the range
* concepts related to iterator traversal categories. For example, the
* following line checks that the type T models the ForwardRange
* concept.
*
* \code
* function_requires<ForwardRangeConcept<T> >();
* \endcode
*
* An additional concept check is required for the value access
* property of the range. For example to check for a
* ForwardReadableRange, the following code is required.
*
* \code
* function_requires<ForwardRangeConcept<T> >();
* function_requires<
* ReadableIteratorConcept<
* typename range_iterator<T>::type
* >
* >();
* \endcode
*
* \see http://www.boost.org/libs/range/doc/range.html for details
* about range concepts.
* \see http://www.boost.org/libs/iterator/doc/iterator_concepts.html
* for details about iterator concepts.
* \see http://www.boost.org/libs/concept_check/concept_check.htm for
* details about concept checks.
*/
namespace boost {
//! Check if a type T models the SinglePassRange range concept.
template<typename T>
struct SinglePassRangeConcept {
typedef typename range_value<T>::type range_value;
typedef typename range_iterator<T>::type range_iterator;
//typedef typename range_iterator<const T>::type range_const_iterator;
void constraints()
{
function_requires<
boost_concepts::SinglePassIteratorConcept<
range_iterator
>
>();
i = boost::begin(a);
i = boost::end(a);
b = boost::empty(a);
const_constraints(a);
}
void const_constraints(const T& a)
{
//ci = boost::begin(a);
//ci = boost::end(a);
}
T a;
range_iterator i;
bool b;
};
//! Check if a type T models the ForwardRange range concept.
template<typename T>
struct ForwardRangeConcept {
typedef typename range_difference<T>::type range_difference;
void constraints()
{
function_requires<
SinglePassRangeConcept<T>
>();
function_requires<
boost_concepts::ForwardTraversalConcept<
typename range_iterator<T>::type
>
>();
}
};
//! Check if a type T models the BidirectionalRange range concept.
template<typename T>
struct BidirectionalRangeConcept {
typedef typename range_reverse_iterator<T>::type range_reverse_iterator;
void constraints()
{
function_requires<
ForwardRangeConcept<T>
>();
function_requires<
boost_concepts::BidirectionalTraversalConcept<
typename range_iterator<T>::type
>
>();
i = boost::rbegin(a);
i = boost::rend(a);
const_constraints(a);
}
void const_constraints(const T& a)
{
//ci = boost::rbegin(a);
//ci = boost::rend(a);
}
T a;
range_reverse_iterator i;
};
//! Check if a type T models the RandomAccessRange range concept.
template<typename T>
struct RandomAccessRangeConcept {
typedef typename range_size<T>::type range_size;
void constraints()
{
function_requires<
BidirectionalRangeConcept<T>
>();
function_requires<
boost_concepts::RandomAccessTraversalConcept<
typename range_iterator<T>::type
>
>();
s = boost::size(a);
}
T a;
range_size s;
};
} // namespace boost
#endif // BOOST_RANGE_CONCEPTS_HPP

View File

@@ -37,7 +37,7 @@
#error "macro already defined!"
#endif
//#if BOOST_WORKAROUND( BOOST_MSVC, < 1300 ) || __MWERKS__ <= 0x3003
//#if BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) || __MWERKS__ <= 0x3003
#if _MSC_VER <= 1300 && !defined( __COMO__ ) && !defined( __GNUC__ ) && __MWERKS__ <= 0x3003
#define BOOST_RANGE_NO_ARRAY_SUPPORT 1
#endif

View File

@@ -21,7 +21,6 @@
#include <boost/range/detail/const_iterator.hpp>
#else
#include <boost/type_traits/remove_const.hpp>
#include <cstddef>
#include <utility>
@@ -47,6 +46,12 @@ namespace boost
typedef Iterator type;
};
template< typename Iterator >
struct range_const_iterator< const std::pair<Iterator,Iterator> >
{
typedef Iterator type;
};
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
@@ -57,6 +62,64 @@ namespace boost
typedef const T* type;
};
template< typename T, std::size_t sz >
struct range_const_iterator< const T[sz] >
{
typedef const T* type;
};
//////////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////////
template<>
struct range_const_iterator< char* >
{
typedef const char* type;
};
template<>
struct range_const_iterator< wchar_t* >
{
typedef const wchar_t* type;
};
template<>
struct range_const_iterator< const char* >
{
typedef const char* type;
};
template<>
struct range_const_iterator< const wchar_t* >
{
typedef const wchar_t* type;
};
template<>
struct range_const_iterator< char* const >
{
typedef const char* type;
};
template<>
struct range_const_iterator< wchar_t* const >
{
typedef const wchar_t* type;
};
template<>
struct range_const_iterator< const char* const >
{
typedef const char* type;
};
template<>
struct range_const_iterator< const wchar_t* const >
{
typedef const wchar_t* type;
};
} // namespace boost
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION

View File

@@ -15,17 +15,22 @@
# pragma once
#endif
#include <boost/range/reverse_iterator.hpp>
#include <boost/range/config.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/iterator/reverse_iterator.hpp>
namespace boost
{
//
// This interface is deprecated, use range_reverse_iterator<const T>
//
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename C >
struct range_const_reverse_iterator : range_reverse_iterator<const C>
{ };
struct range_const_reverse_iterator
{
typedef reverse_iterator<
BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type > type;
};
} // namespace boost

View File

@@ -1,33 +0,0 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen 2006. 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/
//
#ifndef BOOST_RANGE_AS_LITERAL_HPP
#define BOOST_RANGE_AS_LITERAL_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/range/detail/detail_str.hpp>
#include <boost/range/iterator_range.hpp>
namespace boost
{
template< class Range >
inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<Range>::type>
as_literal( Range& r )
{
return ::boost::make_iterator_range( ::boost::range_detail::str_begin(r),
::boost::range_detail::str_end(r) );
}
}
#endif

View File

@@ -13,7 +13,7 @@
#include <boost/config.hpp> // BOOST_MSVC
#include <boost/detail/workaround.hpp>
#include <boost/range/iterator.hpp>
#include <boost/range/result_iterator.hpp>
#include <boost/range/detail/common.hpp>
#if BOOST_WORKAROUND(BOOST_MSVC, < 1310)
# include <boost/range/value_type.hpp>
@@ -35,7 +35,7 @@ namespace boost
struct range_begin<std_container_>
{
template< typename C >
static BOOST_RANGE_DEDUCED_TYPENAME range_iterator<C>::type fun( C& c )
static BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<C>::type fun( C& c )
{
return c.begin();
};
@@ -49,7 +49,7 @@ namespace boost
struct range_begin<std_pair_>
{
template< typename P >
static BOOST_RANGE_DEDUCED_TYPENAME range_iterator<P>::type fun( const P& p )
static BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<P>::type fun( const P& p )
{
return p.first;
}
@@ -77,10 +77,51 @@ namespace boost
#endif
};
//////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////
template<>
struct range_begin<char_ptr_>
{
static char* fun( char* s )
{
return s;
}
};
template<>
struct range_begin<const_char_ptr_>
{
static const char* fun( const char* s )
{
return s;
}
};
template<>
struct range_begin<wchar_t_ptr_>
{
static wchar_t* fun( wchar_t* s )
{
return s;
}
};
template<>
struct range_begin<const_wchar_t_ptr_>
{
static const wchar_t* fun( const wchar_t* s )
{
return s;
}
};
} // namespace 'range_detail'
template< typename C >
inline BOOST_RANGE_DEDUCED_TYPENAME range_iterator<C>::type
inline BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<C>::type
begin( C& c )
{
return range_detail::range_begin< BOOST_RANGE_DEDUCED_TYPENAME range_detail::range<C>::type >::fun( c );

View File

@@ -78,35 +78,35 @@ namespace boost
template< typename C >
class range
{
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_pair_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_pair_,
boost::range_detail::std_pair_,
void >::type pair_t;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_array_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_array_,
boost::range_detail::array_,
pair_t >::type array_t;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_string_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_string_,
boost::range_detail::string_,
array_t >::type string_t;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_const_char_ptr_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_const_char_ptr_,
boost::range_detail::const_char_ptr_,
string_t >::type const_char_ptr_t;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_char_ptr_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_char_ptr_,
boost::range_detail::char_ptr_,
const_char_ptr_t >::type char_ptr_t;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_const_wchar_t_ptr_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_const_wchar_t_ptr_,
boost::range_detail::const_wchar_t_ptr_,
char_ptr_t >::type const_wchar_ptr_t;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_wchar_t_ptr_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_wchar_t_ptr_,
boost::range_detail::wchar_t_ptr_,
const_wchar_ptr_t >::type wchar_ptr_t;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_wchar_t_array_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_wchar_t_array_,
boost::range_detail::wchar_t_array_,
wchar_ptr_t >::type wchar_array_t;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_char_array_,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::range_detail::range_helper<C>::is_char_array_,
boost::range_detail::char_array_,
wchar_array_t >::type char_array_t;
public:
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< ::boost::is_void<char_array_t>::value,
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< boost::is_void<char_array_t>::value,
boost::range_detail::std_container_,
char_array_t >::type type;
}; // class 'range'
@@ -114,4 +114,3 @@ namespace boost
}
#endif

View File

@@ -56,6 +56,58 @@ namespace boost
remove_extent<T>::type* type;
};
};
template<>
struct range_const_iterator_<char_array_>
{
template< typename T >
struct pts
{
typedef const BOOST_RANGE_DEDUCED_TYPENAME
remove_extent<T>::type* type;
};
};
template<>
struct range_const_iterator_<char_ptr_>
{
template< typename S >
struct pts
{
typedef const char* type;
};
};
template<>
struct range_const_iterator_<const_char_ptr_>
{
template< typename S >
struct pts
{
typedef const char* type;
};
};
template<>
struct range_const_iterator_<wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef const wchar_t* type;
};
};
template<>
struct range_const_iterator_<const_wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef const wchar_t* type;
};
};
}
template< typename C >

View File

@@ -1,376 +0,0 @@
// 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/
//
#ifndef BOOST_RANGE_DETAIL_DETAIL_STR_HPP
#define BOOST_RANGE_DETAIL_DETAIL_STR_HPP
#include <boost/config.hpp> // BOOST_MSVC
#include <boost/range/iterator.hpp>
namespace boost
{
namespace range_detail
{
//
// iterator
//
template<>
struct range_iterator_<char_array_>
{
template< typename T >
struct pts
{
typedef BOOST_RANGE_DEDUCED_TYPENAME
remove_extent<T>::type* type;
};
};
template<>
struct range_iterator_<char_ptr_>
{
template< typename S >
struct pts
{
typedef char* type;
};
};
template<>
struct range_iterator_<const_char_ptr_>
{
template< typename S >
struct pts
{
typedef const char* type;
};
};
template<>
struct range_iterator_<wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef wchar_t* type;
};
};
template<>
struct range_iterator_<const_wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef const wchar_t* type;
};
};
//
// const iterator
//
template<>
struct range_const_iterator_<char_array_>
{
template< typename T >
struct pts
{
typedef const BOOST_RANGE_DEDUCED_TYPENAME
remove_extent<T>::type* type;
};
};
template<>
struct range_const_iterator_<char_ptr_>
{
template< typename S >
struct pts
{
typedef const char* type;
};
};
template<>
struct range_const_iterator_<const_char_ptr_>
{
template< typename S >
struct pts
{
typedef const char* type;
};
};
template<>
struct range_const_iterator_<wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef const wchar_t* type;
};
};
template<>
struct range_const_iterator_<const_wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef const wchar_t* type;
};
};
}
}
#include <boost/range/detail/begin.hpp>
#include <boost/range/detail/end.hpp>
#include <boost/range/detail/size_type>
#include <boost/range/detail/value_type>
#include <boost/range/detail/common.hpp>
namespace boost
{
namespace range_detail
{
//
// str_begin()
//
template<>
struct range_begin<char_ptr_>
{
static char* fun( char* s )
{
return s;
}
};
template<>
struct range_begin<const_char_ptr_>
{
static const char* fun( const char* s )
{
return s;
}
};
template<>
struct range_begin<wchar_t_ptr_>
{
static wchar_t* fun( wchar_t* s )
{
return s;
}
};
template<>
struct range_begin<const_wchar_t_ptr_>
{
static const wchar_t* fun( const wchar_t* s )
{
return s;
}
};
template< typename C >
inline BOOST_RANGE_DEDUCED_TYPENAME range_iterator<C>::type
str_begin( C& c )
{
return range_detail::range_begin< BOOST_RANGE_DEDUCED_TYPENAME
range_detail::range<C>::type >::fun( c );
}
//
// str_end()
//
template<>
struct range_end<char_array_>
{
template< typename T, std::size_t sz >
static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
{
return boost::range_detail::array_end( boost_range_array );
}
};
template<>
struct range_end<wchar_t_array_>
{
template< typename T, std::size_t sz >
static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
{
return boost::range_detail::array_end( boost_range_array );
}
};
template<>
struct range_end<char_ptr_>
{
static char* fun( char* s )
{
return boost::range_detail::str_end( s );
}
};
template<>
struct range_end<const_char_ptr_>
{
static const char* fun( const char* s )
{
return boost::range_detail::str_end( s );
}
};
template<>
struct range_end<wchar_t_ptr_>
{
static wchar_t* fun( wchar_t* s )
{
return boost::range_detail::str_end( s );
}
};
template<>
struct range_end<const_wchar_t_ptr_>
{
static const wchar_t* fun( const wchar_t* s )
{
return boost::range_detail::str_end( s );
}
};
template< typename C >
inline BOOST_RANGE_DEDUCED_TYPENAME range_iterator<C>::type
str_end( C& c )
{
return range_detail::range_end< BOOST_RANGE_DEDUCED_TYPENAME
range_detail::range<C>::type >::fun( c );
}
//
// size_type
//
template<>
struct range_size_type_<char_array_>
{
template< typename A >
struct pts
{
typedef std::size_t type;
};
};
template<>
struct range_size_type_<char_ptr_>
{
template< typename S >
struct pts
{
typedef std::size_t type;
};
};
template<>
struct range_size_type_<const_char_ptr_>
{
template< typename S >
struct pts
{
typedef std::size_t type;
};
};
template<>
struct range_size_type_<wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef std::size_t type;
};
};
template<>
struct range_size_type_<const_wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef std::size_t type;
};
};
//
// value_type
//
template<>
struct range_value_type_<char_array_>
{
template< typename T >
struct pts
{
typedef char type;
};
};
template<>
struct range_value_type_<char_ptr_>
{
template< typename S >
struct pts
{
typedef char type;
};
};
template<>
struct range_value_type_<const_char_ptr_>
{
template< typename S >
struct pts
{
typedef const char type;
};
};
template<>
struct range_value_type_<wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef wchar_t type;
};
};
template<>
struct range_value_type_<const_wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef const wchar_t type;
};
};
} // namespace 'range_detail'
} // namespace 'boost'
#endif

View File

@@ -18,7 +18,8 @@
# include <boost/range/detail/vc6/end.hpp>
#else
# include <boost/range/detail/implementation_help.hpp>
# include <boost/range/iterator.hpp>
# include <boost/range/detail/implementation_help.hpp>
# include <boost/range/result_iterator.hpp>
# include <boost/range/detail/common.hpp>
# if BOOST_WORKAROUND(BOOST_MSVC, < 1310)
# include <boost/range/detail/remove_extent.hpp>
@@ -39,7 +40,7 @@ namespace boost
struct range_end<std_container_>
{
template< typename C >
static BOOST_RANGE_DEDUCED_TYPENAME range_iterator<C>::type
static BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<C>::type
fun( C& c )
{
return c.end();
@@ -54,7 +55,7 @@ namespace boost
struct range_end<std_pair_>
{
template< typename P >
static BOOST_RANGE_DEDUCED_TYPENAME range_iterator<P>::type
static BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<P>::type
fun( const P& p )
{
return p.second;
@@ -82,11 +83,73 @@ namespace boost
}
#endif
};
template<>
struct range_end<char_array_>
{
template< typename T, std::size_t sz >
static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
{
return boost::range_detail::array_end( boost_range_array );
}
};
template<>
struct range_end<wchar_t_array_>
{
template< typename T, std::size_t sz >
static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
{
return boost::range_detail::array_end( boost_range_array );
}
};
//////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////
template<>
struct range_end<char_ptr_>
{
static char* fun( char* s )
{
return boost::range_detail::str_end( s );
}
};
template<>
struct range_end<const_char_ptr_>
{
static const char* fun( const char* s )
{
return boost::range_detail::str_end( s );
}
};
template<>
struct range_end<wchar_t_ptr_>
{
static wchar_t* fun( wchar_t* s )
{
return boost::range_detail::str_end( s );
}
};
template<>
struct range_end<const_wchar_t_ptr_>
{
static const wchar_t* fun( const wchar_t* s )
{
return boost::range_detail::str_end( s );
}
};
} // namespace 'range_detail'
template< typename C >
inline BOOST_RANGE_DEDUCED_TYPENAME range_iterator<C>::type
inline BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<C>::type
end( C& c )
{
return range_detail::range_end< BOOST_RANGE_DEDUCED_TYPENAME range_detail::range<C>::type >::fun( c );

View File

@@ -43,7 +43,7 @@ namespace boost
#else
inline const wchar_t* str_end( const wchar_t* s, const wchar_t* )
{
if( s == 0 || s[0] == 0 )
if( s == 0 && s[0] == 0 )
return s;
while( *++s != 0 )
;
@@ -54,21 +54,53 @@ namespace boost
template< class Char >
inline Char* str_end( Char* s )
{
return const_cast<Char*>( str_end( s, s ) );
return (Char*)str_end( s, s );
}
template< class T, std::size_t sz >
inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz] )
inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz], int )
{
return boost_range_array + sz;
}
template< class T, std::size_t sz >
inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz] )
inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz], int )
{
return boost_range_array + sz;
}
template< class T, std::size_t sz >
inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag )
{
return boost_range_array + sz - 1;
}
template< class T, std::size_t sz >
inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag )
{
return boost_range_array + sz - 1;
}
template< class T, std::size_t sz >
inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz] )
{
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same<char,T>::value || is_same<wchar_t,T>::value,
char_or_wchar_t_array_tag,
int >::type tag;
return array_end<T,sz>( boost_range_array, tag() );
}
template< class T, std::size_t sz >
inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz] )
{
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same<char,T>::value || is_same<wchar_t,T>::value,
char_or_wchar_t_array_tag,
int >::type tag;
return array_end<T,sz>( boost_range_array, tag() );
}
/////////////////////////////////////////////////////////////////////
// size() help
/////////////////////////////////////////////////////////////////////
@@ -78,17 +110,48 @@ namespace boost
{
return str_end( s ) - s;
}
template< class T, std::size_t sz >
inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz] )
inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz], int )
{
return sz;
}
template< class T, std::size_t sz >
inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz], int )
{
return sz;
}
template< class T, std::size_t sz >
inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag )
{
return sz - 1;
}
template< class T, std::size_t sz >
inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag )
{
return sz - 1;
}
template< class T, std::size_t sz >
inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz] )
{
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same<const char,T>::value || is_same<const wchar_t,T>::value ||
is_same<char,T>::value || is_same<wchar_t,T>::value,
char_or_wchar_t_array_tag,
int >::type tag;
return array_size<T,sz>( boost_range_array, tag() );
}
template< class T, std::size_t sz >
inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz] )
{
return sz;
typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same<char,T>::value || is_same<wchar_t,T>::value,
char_or_wchar_t_array_tag,
int >::type tag;
return array_size<T,sz>( boost_range_array, tag() );
}
} // namespace 'range_detail'

View File

@@ -64,10 +64,60 @@ namespace boost
};
};
template<>
struct range_iterator_<char_array_>
{
template< typename T >
struct pts
{
typedef BOOST_RANGE_DEDUCED_TYPENAME
remove_extent<T>::type* type;
};
};
template<>
struct range_iterator_<char_ptr_>
{
template< typename S >
struct pts
{
typedef char* type;
};
};
template<>
struct range_iterator_<const_char_ptr_>
{
template< typename S >
struct pts
{
typedef const char* type;
};
};
template<>
struct range_iterator_<wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef wchar_t* type;
};
};
template<>
struct range_iterator_<const_wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef const wchar_t* type;
};
};
}
template< typename C >
class range_mutable_iterator
class range_iterator
{
typedef BOOST_RANGE_DEDUCED_TYPENAME range_detail::range<C>::type c_type;
public:

View File

@@ -0,0 +1,97 @@
// 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/
//
#if !defined( BOOST_RANGE_DETAIL_MFC_CARRAY_HPP ) && defined( BOOST_RANGE_ENABLE_MCF_CARRAY )
#define BOOST_RANGE_DETAIL_MFC_CARRAY_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <afxtempl.h> // for CArray
#include <boost/range/config.hpp>
#include <boost/range/metafunctions.hpp>
namespace boost
{
template< class T, class U >
struct range_iterator< CArray<T,U> >
{
typedef T* type;
};
//
// Why is this needed?!?
//
template< class T, class U >
struct range_iterator< const CArray<T,U> >
{
typedef T* type;
};
template< class T, class U >
struct range_const_iterator< CArray<T,U> >
{
typedef const T* type;
};
template< class T, class U >
struct range_difference< CArray<T,U> >
{
typedef std::ptrdiff_t type;
};
template< class T, class U >
struct range_size< CArray<T,U> >
{
typedef int type;
};
template< class T, class U >
struct range_value< CArray<T,U> >
{
typedef T type;
};
template< class T, class U >
T* boost_range_begin( CArray<T,U>& r )
{
return r.GetData();
}
template< class T, class U >
const T* boost_range_begin( const CArray<T,U>& r )
{
return r.GetData();
}
template< class T, class U >
int boost_range_size( const CArray<T,U>& r )
{
return r.GetSize();
}
template< class T, class U >
T* boost_range_end( CArray<T,U>& r )
{
return boost_range_begin( r ) + boost_range_size( r );
}
template< class T, class U >
const T* boost_range_end( const CArray<T,U>& r )
{
return boost_range_begin( r ) + boost_range_size( r );
}
// default 'empty()' ok
} // namespace 'boost'
#endif

View File

@@ -0,0 +1,92 @@
// 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/
//
#if !defined(BOOST_RANGE_DETAIL_MFC_CSTRING_HPP) && defined(BOOST_RANGE_ENABLE_MFC)
#define BOOST_RANGE_DETAIL_MFC_CSTRING_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <afx.h> // for CString
#include <boost/range/config.hpp>
#include <boost/range/metafunctions.hpp>
namespace boost
{
template<>
struct range_iterator< CString >
{
typedef TCHAR* type;
};
//
// Why is this needed?!?
//
template<>
struct range_iterator< const CString >
{
typedef TCHAR* type;
};
template<>
struct range_const_iterator< CString >
{
typedef const TCHAR* type;
};
template<>
struct range_difference< CString >
{
typedef std::ptrdiff_t type;
};
template<>
struct range_size< CString >
{
typedef int type;
};
template<>
struct range_value< CString >
{
typedef TCHAR type;
};
TCHAR* boost_range_begin( CString& r )
{
return r.GetBuffer(0);
}
const TCHAR* boost_range_begin( const CString& r )
{
return (LPCTSTR)r;
}
int boost_range_size( const CString& r )
{
return r.GetLength();
}
TCHAR* boost_range_end( CString& r )
{
return boost_range_begin( r ) + boost_range_size( r );
}
const TCHAR* range_adl_end( const CString& r )
{
return boost_range_begin( r ) + boost_range_size( r );
}
// default 'empty()' ok
} // namespace 'boost'
#endif

View File

@@ -1,935 +0,0 @@
#ifndef BOOST_RANGE_DETAIL_MICROSOFT_HPP
#define BOOST_RANGE_DETAIL_MICROSOFT_HPP
// Boost.Range MFC/ATL Extension
//
// Copyright Shunsuke Sogame 2005-2006.
// Distributed under 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)
// config
//
#include <boost/range/iterator.hpp>
#define BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1 1
#if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
#define BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator range_mutable_iterator
#define BOOST_RANGE_DETAIL_MICROSOFT_range_begin range_begin
#define BOOST_RANGE_DETAIL_MICROSOFT_range_end range_end
#else
#define BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator range_mutable_iterator
#define BOOST_RANGE_DETAIL_MICROSOFT_range_begin range_begin
#define BOOST_RANGE_DETAIL_MICROSOFT_range_end range_end
#endif
// yet another customization way
//
#include <boost/iterator/iterator_traits.hpp> // iterator_difference
#include <boost/mpl/identity.hpp>
#include <boost/mpl/if.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/comma_if.hpp>
#include <boost/preprocessor/detail/is_unary.hpp>
#include <boost/preprocessor/list/for_each.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/tuple/eat.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/range/size_type.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/remove_cv.hpp>
#include <boost/utility/addressof.hpp>
#include <boost/utility/enable_if.hpp> // disable_if
#if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
#include <boost/range/mutable_iterator.hpp>
#else
#include <iterator> // distance
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/iterator.hpp>
#endif
namespace boost { namespace range_detail_microsoft {
// customization point
//
template< class Tag >
struct customization;
template< class T >
struct customization_tag;
struct using_type_as_tag
{ };
// Topic:
// In fact, it is unnecessary for VC++.
// VC++'s behavior seems conforming, while GCC fails without this.
template< class Iterator, class T >
struct mutable_ :
disable_if< is_const<T>, Iterator >
{ };
// helpers
//
template< class Tag, class T >
struct customization_tag_of
{
typedef typename mpl::if_< is_same<using_type_as_tag, Tag>,
T,
Tag
>::type type;
};
template< class T >
struct customization_of
{
typedef typename remove_cv<T>::type bare_t;
typedef typename customization_tag<bare_t>::type tag_t;
typedef customization<tag_t> type;
};
template< class T >
struct mutable_iterator_of
{
typedef typename remove_cv<T>::type bare_t;
typedef typename customization_of<bare_t>::type cust_t;
typedef typename cust_t::template meta<bare_t>::mutable_iterator type;
};
template< class T >
struct const_iterator_of
{
typedef typename remove_cv<T>::type bare_t;
typedef typename customization_of<bare_t>::type cust_t;
typedef typename cust_t::template meta<bare_t>::const_iterator type;
};
template< class T >
struct size_type_of
{
typedef typename range_detail_microsoft::mutable_iterator_of<T>::type miter_t;
typedef typename iterator_difference<miter_t>::type type;
};
template< class T > inline
typename mutable_iterator_of<T>::type
begin_of(T& x)
{
typedef typename customization_of<T>::type cust_t;
return cust_t().template begin<typename mutable_iterator_of<T>::type>(x);
}
template< class T > inline
typename const_iterator_of<T>::type
begin_of(T const& x)
{
typedef typename customization_of<T>::type cust_t;
return cust_t().template begin<typename const_iterator_of<T>::type>(x);
}
template< class T > inline
typename mutable_iterator_of<T>::type
end_of(T& x)
{
typedef typename customization_of<T>::type cust_t;
return cust_t().template end<typename mutable_iterator_of<T>::type>(x);
}
template< class T > inline
typename const_iterator_of<T>::type
end_of(T const& x)
{
typedef typename customization_of<T>::type cust_t;
return cust_t().template end<typename const_iterator_of<T>::type>(x);
}
#if defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
template< class T > inline
typename size_type_of<T>::type
size_of(T const& x)
{
return std::distance(boost::begin(x), boost::end(x));
}
#endif
template< class Range >
struct compatible_mutable_iterator :
BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator<Range>
{ };
} } // namespace boost::range_detail_microsoft
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open_op, ~, NamespaceList) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open_op(r, data, elem) \
namespace elem { \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close_op, ~, NamespaceList) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close_op(r, data, elem) \
} \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op(r, data, elem) \
:: elem \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(Tag, NamespaceList, Name) \
namespace boost { namespace range_detail_microsoft { \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_tag(Tag, BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
} } \
\
namespace boost { \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_mutable_iterator(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_const_iterator(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size_type(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
} \
\
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin_const(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end_const(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name) \
BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op, ~, NamespaceList) :: Name \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_tag(Tag, Fullname) \
template< > \
struct customization_tag< Fullname > : \
customization_tag_of< Tag, Fullname > \
{ }; \
/**/
// metafunctions
//
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_mutable_iterator(Fullname) \
template< > \
struct BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator< Fullname > : \
range_detail_microsoft::mutable_iterator_of< Fullname > \
{ }; \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_const_iterator(Fullname) \
template< > \
struct range_const_iterator< Fullname > : \
range_detail_microsoft::const_iterator_of< Fullname > \
{ }; \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size_type(Fullname) \
template< > \
struct range_size< Fullname > : \
range_detail_microsoft::size_type_of< Fullname > \
{ }; \
/**/
// functions
//
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin(Fullname) \
inline \
boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname& x) \
{ \
return boost::range_detail_microsoft::begin_of(x); \
} \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin_const(Fullname) \
inline \
boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname const& x) \
{ \
return boost::range_detail_microsoft::begin_of(x); \
} \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end(Fullname) \
inline \
boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname& x) \
{ \
return boost::range_detail_microsoft::end_of(x); \
} \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end_const(Fullname) \
inline \
boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname const& x) \
{ \
return boost::range_detail_microsoft::end_of(x); \
} \
/**/
#if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(Fullname) \
/**/
#else
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(Fullname) \
inline \
boost::range_detail_microsoft::size_type_of< Fullname >::type \
boost_range_size(Fullname const& x) \
{ \
return boost::range_detail_microsoft::size_of(x); \
} \
/**/
#endif
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(Tag, NamespaceList, Name, ParamSeqOrCount) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_impl( \
Tag, NamespaceList, Name, \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq(ParamSeqOrCount) \
) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq(ParamSeqOrCount) \
BOOST_PP_IIF(BOOST_PP_IS_UNARY(ParamSeqOrCount), \
ParamSeqOrCount BOOST_PP_TUPLE_EAT(3), \
BOOST_PP_REPEAT \
)(ParamSeqOrCount, BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq_op, ~) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq_op(z, n, _) \
(class) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_impl(Tag, NamespaceList, Name, ParamSeq) \
namespace boost { namespace range_detail_microsoft { \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_tag( \
Tag, \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
} } \
\
namespace boost { \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_mutable_iterator( \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_const_iterator( \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
\
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size_type( \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
} \
\
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin( \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin_const( \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end( \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end_const( \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size( \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
) \
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq) \
BOOST_PP_SEQ_FOR_EACH_I(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params_op, ~, ParamSeq) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params_op(r, data, i, elem) \
BOOST_PP_COMMA_IF(i) elem BOOST_PP_CAT(T, i) \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op, ~, NamespaceList) \
:: Name < BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(ParamSeq), T) > \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_tag(Tag, Params, Fullname) \
template< Params > \
struct customization_tag< Fullname > : \
customization_tag_of< Tag, Fullname > \
{ }; \
/**/
// metafunctions
//
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_mutable_iterator(Params, Fullname) \
template< Params > \
struct BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator< Fullname > : \
range_detail_microsoft::mutable_iterator_of< Fullname > \
{ }; \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_const_iterator(Params, Fullname) \
template< Params > \
struct range_const_iterator< Fullname > : \
range_detail_microsoft::const_iterator_of< Fullname > \
{ }; \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size_type(Params, Fullname) \
template< Params > \
struct range_size< Fullname > : \
range_detail_microsoft::size_type_of< Fullname > \
{ }; \
/**/
// functions
//
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin(Params, Fullname) \
template< Params > inline \
typename boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname& x) \
{ \
return boost::range_detail_microsoft::begin_of(x); \
} \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin_const(Params, Fullname) \
template< Params > inline \
typename boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname const& x) \
{ \
return boost::range_detail_microsoft::begin_of(x); \
} \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end(Params, Fullname) \
template< Params > inline \
typename boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname& x) \
{ \
return boost::range_detail_microsoft::end_of(x); \
} \
/**/
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end_const(Params, Fullname) \
template< Params > inline \
typename boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname const& x) \
{ \
return boost::range_detail_microsoft::end_of(x); \
} \
/**/
#if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size(Params, Fullname) \
/**/
#else
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size(Params, Fullname) \
template< Params > inline \
typename boost::range_detail_microsoft::size_type_of< Fullname >::type \
boost_range_size(Fullname const& x) \
{ \
return boost::range_detail_microsoft::size_of(x); \
} \
/**/
#endif
// list_iterator and helpers
//
#include <boost/assert.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_same.hpp>
// POSITION's header is undocumented, so is NULL.
//
struct __POSITION; // incomplete, but used as just a pointer.
typedef __POSITION *POSITION;
namespace boost { namespace range_detail_microsoft {
template<
class ListT,
class Value,
class Reference,
class Traversal
>
struct list_iterator;
template<
class ListT,
class Value,
class Reference,
class Traversal
>
struct list_iterator_super
{
typedef typename mpl::if_< is_same<use_default, Reference>,
Value&,
Reference
>::type ref_t;
typedef typename mpl::if_< is_same<use_default, Traversal>,
bidirectional_traversal_tag,
Traversal
>::type trv_t;
typedef iterator_facade<
list_iterator<ListT, Value, Reference, Traversal>,
Value,
trv_t,
ref_t
> type;
};
template<
class ListT,
class Value,
class Reference = use_default,
class Traversal = use_default
>
struct list_iterator :
list_iterator_super<ListT, Value, Reference, Traversal>::type
{
private:
typedef list_iterator self_t;
typedef typename list_iterator_super<ListT, Value, Reference, Traversal>::type super_t;
typedef typename super_t::reference ref_t;
public:
explicit list_iterator()
{ }
explicit list_iterator(ListT& lst, POSITION pos) :
m_plst(boost::addressof(lst)), m_pos(pos)
{ }
template< class, class, class, class > friend struct list_iterator;
template< class ListT_, class Value_, class Reference_, class Traversal_>
list_iterator(list_iterator<ListT_, Value_, Reference_, Traversal_> const& other) :
m_plst(other.m_plst), m_pos(other.m_pos)
{ }
private:
ListT *m_plst;
POSITION m_pos;
friend class iterator_core_access;
ref_t dereference() const
{
BOOST_ASSERT(m_pos != 0 && "out of range");
return m_plst->GetAt(m_pos);
}
// A B C D x
// Head Tail NULL(0)
//
void increment()
{
BOOST_ASSERT(m_pos != 0 && "out of range");
m_plst->GetNext(m_pos);
}
void decrement()
{
if (m_pos == 0) {
m_pos = m_plst->GetTailPosition();
return;
}
m_plst->GetPrev(m_pos);
}
bool equal(self_t const& other) const
{
BOOST_ASSERT(m_plst == other.m_plst && "iterators incompatible");
return m_pos == other.m_pos;
}
};
// customization helpers
//
struct array_functions
{
template< class Iterator, class X >
Iterator begin(X& x)
{
return x.GetData();
}
template< class Iterator, class X >
Iterator end(X& x)
{
return begin<Iterator>(x) + x.GetSize();
}
};
struct list_functions
{
template< class Iterator, class X >
Iterator begin(X& x)
{
return Iterator(x, x.GetHeadPosition());
}
template< class Iterator, class X >
Iterator end(X& x)
{
return Iterator(x, POSITION(0));
}
};
} } // namespace boost::range_detail_microsoft
// test
//
#if defined(BOOST_RANGE_DETAIL_MICROSOFT_TEST)
#include <algorithm>
#include <iterator>
#include <vector>
#include <boost/concept_check.hpp>
#include <boost/next_prior.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/concepts.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/range/difference_type.hpp>
#include <boost/range/distance.hpp>
#include <boost/range/empty.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/range/mutable_iterator.hpp>
#include <boost/range/rbegin.hpp>
#include <boost/range/rend.hpp>
#include <boost/range/value_type.hpp>
#include <boost/type_traits/is_same.hpp>
namespace boost { namespace range_detail_microsoft {
template< class Range1, class Range2 >
bool test_equals(Range1 const& rng1, Range2 const& rng2)
{
return
boost::distance(rng1) == boost::distance(rng2) &&
std::equal(boost::begin(rng1), boost::end(rng1), boost::begin(rng2))
;
}
template< class AssocContainer, class PairT >
bool test_find_key_and_mapped(AssocContainer const& ac, PairT const& pa)
{
typedef typename boost::range_const_iterator<AssocContainer>::type iter_t;
for (iter_t it = boost::const_begin(ac), last = boost::const_end(ac); it != last; ++it) {
if (it->first == pa.first && it->second == pa.second)
return true;
}
return false;
}
// test functions
//
template< class Range >
bool test_emptiness(Range& )
{
bool result = true;
Range emptyRng;
result = result && boost::empty(emptyRng);
return result;
}
template< class Range >
bool test_trivial(Range& rng)
{
bool result = true;
// convertibility check
typedef typename range_const_iterator<Range>::type citer_t;
citer_t cit = boost::begin(rng);
(void)cit; // unused
// mutability check
typedef typename range_value<Range>::type val_t;
val_t v = *boost::begin(rng);
*boost::begin(rng) = v;
result = result && *boost::begin(rng) == v;
return result;
}
template< class Range >
bool test_forward(Range& rng)
{
boost::function_requires< ForwardRangeConcept<Range> >();
bool result = (test_trivial)(rng);
typedef typename range_value<Range>::type val_t;
std::vector<val_t> saved;
std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
std::rotate(boost::begin(saved), boost::next(boost::begin(saved)), boost::end(saved));
std::rotate(boost::begin(rng), boost::next(boost::begin(rng)), boost::end(rng));
return result && (test_equals)(saved, rng);
};
template< class Range >
bool test_bidirectional(Range& rng)
{
boost::function_requires< BidirectionalRangeConcept<Range> >();
bool result = (test_forward)(rng);
typedef typename range_value<Range>::type val_t;
std::vector<val_t> saved;
std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
result = result && (test_equals)(
boost::make_iterator_range(boost::rbegin(saved), boost::rend(saved)),
boost::make_iterator_range(boost::rbegin(rng), boost::rend(rng))
);
return result;
}
template< class Range >
bool test_random_access(Range& rng)
{
boost::function_requires< RandomAccessRangeConcept<Range> >();
bool result = (test_bidirectional)(rng);
typedef typename range_value<Range>::type val_t;
std::vector<val_t> saved;
std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
std::sort(boost::begin(saved), boost::end(saved));
std::random_shuffle(boost::begin(rng), boost::end(rng));
std::sort(boost::begin(rng), boost::end(rng));
result = result && (test_equals)(rng, saved);
std::random_shuffle(boost::begin(rng), boost::end(rng));
std::stable_sort(boost::begin(rng), boost::end(rng));
result = result && (test_equals)(rng, saved);
std::random_shuffle(boost::begin(rng), boost::end(rng));
std::partial_sort(boost::begin(rng), boost::end(rng), boost::end(rng));
result = result && (test_equals)(rng, saved);
return result;
}
// initializer
//
template< class ArrayT, class SampleRange >
bool test_init_array(ArrayT& arr, SampleRange const& sample)
{
typedef typename range_const_iterator<SampleRange>::type iter_t;
typedef typename range_value<SampleRange>::type val_t;
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
val_t v = *it; // works around ATL3 CSimpleArray
arr.Add(v);
}
return (test_equals)(arr, sample);
}
template< class ListT, class SampleRange >
bool test_init_list(ListT& lst, SampleRange const& sample)
{
typedef typename range_const_iterator<SampleRange>::type iter_t;
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
lst.AddTail(*it);
}
return (test_equals)(lst, sample);
}
template< class StringT, class SampleRange >
bool test_init_string(StringT& str, SampleRange const& sample)
{
typedef typename range_const_iterator<SampleRange>::type iter_t;
typedef typename range_value<SampleRange>::type val_t;
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
str += *it;
}
return (test_equals)(str, sample);
}
template< class MapT, class SampleMap >
bool test_init_map(MapT& map, SampleMap const& sample)
{
typedef typename range_const_iterator<SampleMap>::type iter_t;
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
map.SetAt(it->first, it->second);
}
return boost::distance(map) == boost::distance(sample);
}
// metafunction test
//
template< class Range, class Iter >
struct test_mutable_iter :
boost::is_same< typename boost::BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator<Range>::type, Iter >
{ };
template< class Range, class Iter >
struct test_const_iter :
boost::is_same< typename boost::range_const_iterator<Range>::type, Iter >
{ };
} } // namespace boost::range_detail_microsoft
#endif // defined(BOOST_RANGE_DETAIL_MICROSOFT_TEST)
#endif

View File

@@ -54,7 +54,55 @@ namespace boost
};
};
template<>
struct range_size_type_<char_array_>
{
template< typename A >
struct pts
{
typedef std::size_t type;
};
};
template<>
struct range_size_type_<char_ptr_>
{
template< typename S >
struct pts
{
typedef std::size_t type;
};
};
template<>
struct range_size_type_<const_char_ptr_>
{
template< typename S >
struct pts
{
typedef std::size_t type;
};
};
template<>
struct range_size_type_<wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef std::size_t type;
};
};
template<>
struct range_size_type_<const_wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef std::size_t type;
};
};
}
template< typename C >

View File

@@ -1,38 +0,0 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen 2006. 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/
//
#ifndef BOOST_RANGE_DETAIL_STR_TYPES_HPP
#define BOOST_RANGE_DETAIL_STR_TYPES_HPP
#include <boost/range/size_type.hpp>
#include <boost/range/iterator.hpp>
namespace boost
{
template< class T >
struct range_mutable_iterator<T*>
{
typedef T* type;
};
template< class T >
struct range_const_iterator<T*>
{
typedef const T* type;
};
template< class T >
struct range_size<T*>
{
typedef std::size_t type;
};
}
#endif

View File

@@ -56,6 +56,56 @@ namespace boost
};
};
template<>
struct range_value_type_<char_array_>
{
template< typename T >
struct pts
{
typedef char type;
};
};
template<>
struct range_value_type_<char_ptr_>
{
template< typename S >
struct pts
{
typedef char type;
};
};
template<>
struct range_value_type_<const_char_ptr_>
{
template< typename S >
struct pts
{
typedef const char type;
};
};
template<>
struct range_value_type_<wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef wchar_t type;
};
};
template<>
struct range_value_type_<const_wchar_t_ptr_>
{
template< typename S >
struct pts
{
typedef const wchar_t type;
};
};
}
template< typename C >

View File

@@ -16,14 +16,130 @@
#endif
#include <boost/range/config.hpp>
#include <boost/range/iterator.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/iterator/iterator_traits.hpp>
namespace boost
{
template< class T >
struct range_difference : iterator_difference< typename range_iterator<T>::type >
{ };
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 <utility>
namespace boost
{
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename C >
struct range_difference
{
typedef BOOST_DEDUCED_TYPENAME C::difference_type type;
};
//////////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////////
template< typename Iterator >
struct range_difference< std::pair<Iterator,Iterator> >
{
typedef BOOST_DEDUCED_TYPENAME
iterator_difference<Iterator>::type type;
};
template< typename Iterator >
struct range_difference< const std::pair<Iterator,Iterator> >
{
typedef BOOST_DEDUCED_TYPENAME
iterator_difference<Iterator>::type type;
};
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
struct range_difference< T[sz] >
{
typedef std::ptrdiff_t type;
};
template< typename T, std::size_t sz >
struct range_difference< const T[sz] >
{
typedef std::ptrdiff_t type;
};
//////////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////////
template<>
struct range_difference< char* >
{
typedef std::ptrdiff_t type;
};
template<>
struct range_difference< wchar_t* >
{
typedef std::ptrdiff_t type;
};
template<>
struct range_difference< const char* >
{
typedef std::ptrdiff_t type;
};
template<>
struct range_difference< const wchar_t* >
{
typedef std::ptrdiff_t type;
};
template<>
struct range_difference< char* const >
{
typedef std::ptrdiff_t type;
};
template<>
struct range_difference< wchar_t* const >
{
typedef std::ptrdiff_t type;
};
template<>
struct range_difference< const char* const >
{
typedef std::ptrdiff_t type;
};
template<>
struct range_difference< const wchar_t* const >
{
typedef std::ptrdiff_t type;
};
} // namespace boost
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
*/
#endif

View File

@@ -1,34 +0,0 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen 2003-2006. 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/
//
#ifndef BOOST_RANGE_DISTANCE_HPP
#define BOOST_RANGE_DISTANCE_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/difference_type.hpp>
namespace boost
{
template< class T >
inline BOOST_DEDUCED_TYPENAME range_difference<T>::type
distance( const T& r )
{
return std::distance( boost::begin( r ), boost::end( r ) );
}
} // namespace 'boost'
#endif

View File

@@ -16,19 +16,52 @@
#endif
#include <boost/range/config.hpp>
//#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
//#include <boost/range/detail/empty.hpp>
//#else
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
namespace boost
{
namespace range_detail
{
template< class T >
inline bool empty( const T& r )
{
return boost::begin( r ) == boost::end( r );
}
//////////////////////////////////////////////////////////////////////
// primary template
//////////////////////////////////////////////////////////////////////
template< typename C >
inline bool empty( const C& c )
{
return boost::begin( c ) == boost::end( c );
}
//////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////
inline bool empty( const char* const& s )
{
return s == 0 || s[0] == 0;
}
inline bool empty( const wchar_t* const& s )
{
return s == 0 || s[0] == 0;
}
} // namespace 'range_detail'
template< class T >
inline bool empty( const T& r )
{
return range_detail::empty( r );
}
} // namepace 'boost'
//#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
#endif

View File

@@ -15,6 +15,7 @@
# pragma once
#endif
#include <boost/type_traits/remove_const.hpp>
#include <boost/range/config.hpp>
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
@@ -25,86 +26,161 @@
#include <boost/range/iterator.hpp>
#include <boost/range/const_iterator.hpp>
namespace boost
namespace boost
{
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
!BOOST_WORKAROUND(__GNUC__, < 3) \
/**/
/**/
namespace range_detail
{
#endif
#endif
//////////////////////////////////////////////////////////////////////
// primary template
//////////////////////////////////////////////////////////////////////
template< typename C >
inline BOOST_DEDUCED_TYPENAME range_iterator<C>::type
range_end( C& c )
inline BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type
boost_range_end( const C& c )
{
return c.end();
}
template< typename C >
inline BOOST_DEDUCED_TYPENAME range_iterator<
typename remove_const<C>::type >::type
boost_range_end( C& c )
{
return c.end();
}
//////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////
template< typename Iterator >
inline Iterator range_end( const std::pair<Iterator,Iterator>& p )
inline Iterator boost_range_end( const std::pair<Iterator,Iterator>& p )
{
return p.second;
}
template< typename Iterator >
inline Iterator range_end( std::pair<Iterator,Iterator>& p )
inline Iterator boost_range_end( std::pair<Iterator,Iterator>& p )
{
return p.second;
}
//////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
inline const T* 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 >
inline T* boost_range_end( T (&array)[sz] )
{
return range_detail::array_end<T,sz>( array );
}
template< typename T, std::size_t sz >
inline T* range_end( T (&array)[sz] )
//////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////
#if 1 || BOOST_WORKAROUND(__MWERKS__, <= 0x3204 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
// CW up to 9.3 and borland have troubles with function ordering
inline char* boost_range_end( char* s )
{
return range_detail::array_end<T,sz>( array );
return range_detail::str_end( s );
}
inline wchar_t* boost_range_end( wchar_t* s )
{
return range_detail::str_end( s );
}
inline const char* boost_range_end( const char* s )
{
return range_detail::str_end( s );
}
inline const wchar_t* boost_range_end( const wchar_t* s )
{
return range_detail::str_end( s );
}
#else
inline char* boost_range_end( char*& s )
{
return range_detail::str_end( s );
}
inline wchar_t* boost_range_end( wchar_t*& s )
{
return range_detail::str_end( s );
}
inline const char* boost_range_end( const char*& s )
{
return range_detail::str_end( s );
}
inline const wchar_t* boost_range_end( const wchar_t*& s )
{
return range_detail::str_end( s );
}
#endif
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
!BOOST_WORKAROUND(__GNUC__, < 3) \
/**/
/**/
} // namespace 'range_detail'
#endif
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)) && \
!BOOST_WORKAROUND(__GNUC__, < 3) \
/**/
using namespace range_detail;
#endif
return range_end( r );
#endif
return boost_range_end( r );
}
template< class T >
inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type end( const T& r )
inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type end( const T& r )
{
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
!BOOST_WORKAROUND(__GNUC__, < 3) \
/**/
using namespace range_detail;
#endif
return range_end( r );
#endif
return boost_range_end( r );
}
#if BOOST_WORKAROUND(__MWERKS__, <= 0x3003 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
// BCB and CW are 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'
@@ -115,12 +191,11 @@ inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type end( const T& r )
namespace boost
{
template< class T >
inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type
inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type
const_end( const T& r )
{
return boost::end( r );
return end( r );
}
}
#endif

View File

@@ -1,6 +1,6 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen 2003-2006. Use, modification and
// 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)
@@ -18,10 +18,8 @@
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/size.hpp>
#include <boost/range/distance.hpp>
#include <boost/range/empty.hpp>
#include <boost/range/rbegin.hpp>
#include <boost/range/rend.hpp>
#endif

View File

@@ -11,62 +11,118 @@
#ifndef BOOST_RANGE_ITERATOR_HPP
#define BOOST_RANGE_ITERATOR_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/range/config.hpp>
#include <boost/range/mutable_iterator.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/mpl/eval_if.hpp>
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#include <boost/range/detail/iterator.hpp>
#else
#include <boost/iterator/iterator_traits.hpp>
#include <cstddef>
#include <utility>
namespace boost
{
#if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
namespace range_detail_vc7_1
{
template< typename C, typename Sig = void(C) >
struct range_iterator
{
typedef BOOST_RANGE_DEDUCED_TYPENAME
mpl::eval_if_c< is_const<C>::value,
range_const_iterator< typename remove_const<C>::type >,
range_mutable_iterator<C> >::type type;
};
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename C, typename T >
struct range_iterator< C, void(T[]) >
{
typedef T* type;
};
}
#endif
template< typename C >
struct range_iterator
{
#if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
typedef BOOST_RANGE_DEDUCED_TYPENAME
range_detail_vc7_1::range_iterator<C>::type type;
#else
typedef BOOST_RANGE_DEDUCED_TYPENAME
mpl::eval_if_c< is_const<C>::value,
range_const_iterator< typename remove_const<C>::type >,
range_mutable_iterator<C> >::type type;
#endif
typedef BOOST_DEDUCED_TYPENAME C::iterator type;
};
//////////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////////
template< typename Iterator >
struct range_iterator< std::pair<Iterator,Iterator> >
{
typedef Iterator type;
};
template< typename Iterator >
struct range_iterator< const std::pair<Iterator,Iterator> >
{
typedef Iterator type;
};
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
struct range_iterator< T[sz] >
{
typedef T* type;
};
template< typename T, std::size_t sz >
struct range_iterator< const T[sz] >
{
typedef const T* type;
};
//////////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////////
template<>
struct range_iterator< char* >
{
typedef char* type;
};
template<>
struct range_iterator< wchar_t* >
{
typedef wchar_t* type;
};
template<>
struct range_iterator< const char* >
{
typedef const char* type;
};
template<>
struct range_iterator< const wchar_t* >
{
typedef const wchar_t* type;
};
template<>
struct range_iterator< char* const >
{
typedef char* type;
};
template<>
struct range_iterator< wchar_t* const >
{
typedef wchar_t* type;
};
template<>
struct range_iterator< const char* const >
{
typedef const char* type;
};
template<>
struct range_iterator< const wchar_t* const >
{
typedef const wchar_t* type;
};
} // namespace boost
//#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#endif

View File

@@ -23,7 +23,7 @@
#include <boost/detail/workaround.hpp>
#include <boost/range/functions.hpp>
#include <boost/range/iterator.hpp>
#include <boost/range/result_iterator.hpp>
#include <boost/range/difference_type.hpp>
#include <boost/iterator/iterator_traits.hpp>
#include <boost/assert.hpp>
@@ -36,9 +36,6 @@
#endif
#include <cstddef>
#if BOOST_WORKAROUND(BOOST_MSVC, == 1310) || BOOST_WORKAROUND(BOOST_MSVC, == 1400)
#pragma warning( disable : 4996 )
#endif
/*! \file
Defines the \c iterator_class and related functions.
@@ -60,13 +57,15 @@ namespace boost
template< class ForwardRange >
static IteratorT adl_begin( ForwardRange& r )
{
return IteratorT( boost::begin( r ) );
using boost::begin;
return IteratorT( begin( r ) );
}
template< class ForwardRange >
static IteratorT adl_end( ForwardRange& r )
{
return IteratorT( boost::end( r ) );
using boost::end;
return IteratorT( end( r ) );
}
};
@@ -75,23 +74,23 @@ namespace boost
{
typedef BOOST_DEDUCED_TYPENAME boost::range_size<Left>::type sz_type;
sz_type l_size = boost::size( l ),
r_size = boost::size( r );
sz_type l_size = size( l ),
r_size = size( r );
if( l_size != r_size )
return false;
return std::equal( boost::begin(l), boost::end(l),
boost::begin(r) );
return std::equal( begin(l), end(l),
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) );
return std::lexicographical_compare( begin(l),
end(l),
begin(r),
end(r) );
}
struct range_tag { };
@@ -143,14 +142,6 @@ namespace boost
//! This type
typedef iterator_range<IteratorT> this_type;
//! Refence type
//
// Needed because value-type is the same for
// const and non-const iterators
//
typedef BOOST_DEDUCED_TYPENAME
iterator_reference<IteratorT>::type reference;
//! const_iterator type
/*!
@@ -161,10 +152,8 @@ namespace boost
//! iterator type
typedef IteratorT iterator;
iterator_range() : m_Begin( iterator() ), m_End( iterator() )
#ifndef NDEBUG
, singular( true )
#endif
iterator_range() : m_Begin( iterator() ), m_End( iterator() ),
singular( true )
{ }
/*
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
@@ -183,57 +172,41 @@ namespace boost
//! Constructor from a pair of iterators
template< class Iterator >
iterator_range( Iterator Begin, Iterator End ) :
m_Begin(Begin), m_End(End)
#ifndef NDEBUG
, singular(false)
#endif
{}
m_Begin(Begin), m_End(End), singular(false) {}
//! Constructor from a Range
template< class Range >
iterator_range( const Range& r ) :
m_Begin( impl::adl_begin( r ) ), m_End( impl::adl_end( r ) )
#ifndef NDEBUG
, singular(false)
#endif
{}
m_Begin( impl::adl_begin( r ) ), m_End( impl::adl_end( r ) ),
singular(false) {}
//! Constructor from a Range
template< class Range >
iterator_range( Range& r ) :
m_Begin( impl::adl_begin( r ) ), m_End( impl::adl_end( r ) )
#ifndef NDEBUG
, singular(false)
#endif
{}
m_Begin( impl::adl_begin( r ) ), m_End( impl::adl_end( r ) ),
singular(false) {}
//! Constructor from a Range
template< class Range >
iterator_range( const Range& r, iterator_range_detail::const_range_tag ) :
m_Begin( impl::adl_begin( r ) ), m_End( impl::adl_end( r ) )
#ifndef NDEBUG
, singular(false)
#endif
{}
m_Begin( impl::adl_begin( r ) ), m_End( impl::adl_end( r ) ),
singular(false) {}
//! Constructor from a Range
template< class Range >
iterator_range( Range& r, iterator_range_detail::range_tag ) :
m_Begin( impl::adl_begin( r ) ), m_End( impl::adl_end( r ) )
#ifndef NDEBUG
, singular(false)
#endif
{}
m_Begin( impl::adl_begin( r ) ), m_End( impl::adl_end( r ) ),
singular(false) {}
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
this_type& operator=( const this_type& r )
{
m_Begin = r.begin();
m_End = r.end();
#ifndef NDEBUG
//
// remark: this need not necessarily be true, but it does no harm
//
singular = r.singular;
#endif
return *this;
}
#endif
@@ -243,9 +216,10 @@ namespace boost
{
m_Begin = r.begin();
m_End = r.end();
#ifndef NDEBUG
singular = r.is_singular();
#endif
//
// remark: this need not necessarily be true, but it does no harm
//
singular = r.empty();
return *this;
}
@@ -254,9 +228,7 @@ namespace boost
{
m_Begin = impl::adl_begin( r );
m_End = impl::adl_end( r );
#ifndef NDEBUG
singular = false;
#endif
return *this;
}
@@ -265,33 +237,33 @@ namespace boost
{
m_Begin = impl::adl_begin( r );
m_End = impl::adl_end( r );
#ifndef NDEBUG
singular = false;
#endif
return *this;
}
IteratorT begin() const
{
BOOST_ASSERT( !is_singular() );
return m_Begin;
}
IteratorT end() const
{
BOOST_ASSERT( !is_singular() );
return m_End;
}
size_type size() const
{
BOOST_ASSERT( !is_singular() );
return m_End - m_Begin;
if( singular )
return 0;
return std::distance( m_Begin, m_End );
}
bool empty() const
{
BOOST_ASSERT( !is_singular() );
if( singular )
return true;
return m_Begin == m_End;
}
@@ -310,8 +282,7 @@ namespace boost
bool equal( const iterator_range& r ) const
{
BOOST_ASSERT( !is_singular() );
return m_Begin == r.m_Begin && m_End == r.m_End;
return singular == r.singular && m_Begin == r.m_Begin && m_End == r.m_End;
}
@@ -319,96 +290,64 @@ namespace boost
bool operator==( const iterator_range& r ) const
{
BOOST_ASSERT( !is_singular() );
return iterator_range_detail::equal( *this, r );
}
bool operator!=( const iterator_range& r ) const
{
BOOST_ASSERT( !is_singular() );
return !operator==(r);
}
bool operator<( const iterator_range& r ) const
{
BOOST_ASSERT( !is_singular() );
return iterator_range_detail::less_than( *this, r );
return iterator_range_detail::less_than( *this, r );
}
#endif
public: // convenience
reference front() const
value_type& front() const
{
BOOST_ASSERT( !empty() );
return *m_Begin;
}
reference back() const
value_type& back() const
{
BOOST_ASSERT( !empty() );
IteratorT last( m_End );
return *--last;
}
reference operator[]( size_type at ) const
value_type& operator[]( size_type sz ) const
{
BOOST_ASSERT( at < size() );
return m_Begin[at];
//BOOST_STATIC_ASSERT( is_random_access );
BOOST_ASSERT( sz < size() );
return m_Begin[sz];
}
//
// When storing transform iterators, operator[]()
// fails because it returns by reference. Therefore
// operator()() is provided for these cases.
//
value_type operator()( size_type at ) const
{
BOOST_ASSERT( at < size() );
return m_Begin[at];
}
iterator_range& advance_begin( difference_type n )
{
BOOST_ASSERT( !is_singular() );
std::advance( m_Begin, n );
return *this;
}
iterator_range& advance_end( difference_type n )
{
BOOST_ASSERT( !is_singular() );
std::advance( m_End, n );
return *this;
}
private:
// begin and end iterators
IteratorT m_Begin;
IteratorT m_End;
#ifndef NDEBUG
bool singular;
#endif
#ifndef NDEBUG
public:
bool is_singular() const
{
return singular;
}
#endif
protected:
//
// Allow subclasses an easy way to access the
// base type
//
typedef iterator_range iterator_range_;
};
// iterator range free-standing operators ---------------------------//
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
#else
template< class Iterator >
inline bool empty( const iterator_range<Iterator>& r )
{
//
// this will preserve the well-defined empty() even
// though 'r' is singular.
//
return r.empty();
}
#endif
#ifndef BOOST_OLD_IOSTREAMS
//! iterator_range output operator
@@ -421,10 +360,7 @@ namespace boost
std::basic_ostream<Elem, Traits>& Os,
const iterator_range<IteratorT>& r )
{
std::copy( r.begin(), r.end(),
std::ostream_iterator< BOOST_DEDUCED_TYPENAME
iterator_value<IteratorT>::type,
Elem, Traits>(Os) );
std::copy( r.begin(), r.end(), std::ostream_iterator<Elem>(Os));
return Os;
}
@@ -539,11 +475,11 @@ namespace boost
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
template< typename Range >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<Range>::type >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type >
make_iterator_range( Range& r )
{
return iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<Range>::type >
( boost::begin( r ), boost::end( r ) );
return iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type >
( begin( r ), end( r ) );
}
#else
@@ -561,10 +497,10 @@ namespace boost
}
template< class ForwardRange >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator<ForwardRange>::type >
make_iterator_range( const ForwardRange& r )
{
return iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type >
return iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator<ForwardRange>::type >
( r, iterator_range_detail::const_range_tag() );
}
@@ -573,21 +509,17 @@ namespace boost
namespace iterator_range_detail
{
template< class Range >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<Range>::type >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type >
make_range_impl( Range& r,
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end )
{
//
// Not worth the effort
//
//if( advance_begin == 0 && advance_end == 0 )
// return make_iterator_range( r );
//
if( advance_begin == 0 && advance_end == 0 )
return make_iterator_range( r );
BOOST_DEDUCED_TYPENAME range_iterator<Range>::type
new_begin = boost::begin( r ),
new_end = boost::end( r );
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 );
@@ -597,7 +529,7 @@ namespace boost
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
template< class Range >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<Range>::type >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<Range>::type >
make_iterator_range( Range& r,
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end )
@@ -619,7 +551,7 @@ namespace boost
}
template< class Range >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<const Range>::type >
inline iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator<Range>::type >
make_iterator_range( const Range& r,
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_begin,
BOOST_DEDUCED_TYPENAME range_difference<Range>::type advance_end )
@@ -641,7 +573,7 @@ namespace boost
template< typename SeqT, typename Range >
inline SeqT copy_range( const Range& r )
{
return SeqT( boost::begin( r ), boost::end( r ) );
return SeqT( begin( r ), end( r ) );
}
} // namespace 'boost'
@@ -649,4 +581,3 @@ namespace boost
#undef BOOST_OLD_IOSTREAMS
#endif

View File

@@ -16,15 +16,13 @@
#endif
#include <boost/range/iterator.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/range/value_type.hpp>
#include <boost/range/size_type.hpp>
#include <boost/range/difference_type.hpp>
#include <boost/range/result_iterator.hpp>
#include <boost/range/reverse_iterator.hpp>
#include <boost/range/const_reverse_iterator.hpp>
#include <boost/range/reverse_result_iterator.hpp>
#include <boost/range/value_type.hpp>
#include <boost/range/size_type.hpp>
#include <boost/range/difference_type.hpp>
#include <boost/range/category.hpp>
#include <boost/range/reference.hpp>
#include <boost/range/pointer.hpp>
#endif

View File

@@ -1,984 +0,0 @@
#ifndef BOOST_RANGE_MFC_HPP
#define BOOST_RANGE_MFC_HPP
// Boost.Range MFC Extension
//
// Copyright Shunsuke Sogame 2005-2006.
// Distributed under 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)
// config
//
#include <afx.h> // _MFC_VER
#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
#if (_MFC_VER < 0x0700) // dubious
#define BOOST_RANGE_MFC_NO_CPAIR
#endif
#endif
#if !defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
#if (_MFC_VER < 0x0700) // dubious
#define BOOST_RANGE_MFC_HAS_LEGACY_STRING
#endif
#endif
// A const collection of old MFC doesn't return const reference.
//
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
#if (_MFC_VER < 0x0700) // dubious
#define BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF
#endif
#endif
// forward declarations
//
template< class Type, class ArgType >
class CArray;
template< class Type, class ArgType >
class CList;
template< class Key, class ArgKey, class Mapped, class ArgMapped >
class CMap;
template< class BaseClass, class PtrType >
class CTypedPtrArray;
template< class BaseClass, class PtrType >
class CTypedPtrList;
template< class BaseClass, class KeyPtrType, class MappedPtrType >
class CTypedPtrMap;
// extended customizations
//
#include <cstddef> // ptrdiff_t
#include <utility> // pair
#include <boost/assert.hpp>
#include <boost/mpl/if.hpp>
#include <boost/range/atl.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/range/detail/microsoft.hpp>
#include <boost/range/end.hpp>
#include <boost/iterator/iterator_adaptor.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/iterator/transform_iterator.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/remove_pointer.hpp>
#include <boost/utility/addressof.hpp>
#include <afx.h> // legacy CString
#include <afxcoll.h> // CXXXArray, CXXXList, CMapXXXToXXX
#include <tchar.h>
namespace boost { namespace range_detail_microsoft {
// mfc_ptr_array_iterator
//
// 'void **' is not convertible to 'void const **',
// so we define...
//
template< class ArrayT, class PtrType >
struct mfc_ptr_array_iterator;
template< class ArrayT, class PtrType >
struct mfc_ptr_array_iterator_super
{
typedef iterator_adaptor<
mfc_ptr_array_iterator<ArrayT, PtrType>,
std::ptrdiff_t, // Base!
PtrType, // Value
random_access_traversal_tag,
use_default,
std::ptrdiff_t // Difference
> type;
};
template< class ArrayT, class PtrType >
struct mfc_ptr_array_iterator :
mfc_ptr_array_iterator_super<ArrayT, PtrType>::type
{
private:
typedef mfc_ptr_array_iterator self_t;
typedef typename mfc_ptr_array_iterator_super<ArrayT, PtrType>::type super_t;
typedef typename super_t::reference ref_t;
public:
explicit mfc_ptr_array_iterator()
{ }
explicit mfc_ptr_array_iterator(ArrayT& arr, INT_PTR index) :
super_t(index), m_parr(boost::addressof(arr))
{ }
template< class, class > friend struct mfc_ptr_array_iterator;
template< class ArrayT_, class PtrType_ >
mfc_ptr_array_iterator(mfc_ptr_array_iterator<ArrayT_, PtrType_> const& other) :
super_t(other.base()), m_parr(other.m_parr)
{ }
private:
ArrayT *m_parr;
friend class iterator_core_access;
ref_t dereference() const
{
BOOST_ASSERT(0 <= this->base() && this->base() < m_parr->GetSize() && "out of range");
return *( m_parr->GetData() + this->base() );
}
bool equal(self_t const& other) const
{
BOOST_ASSERT(m_parr == other.m_parr && "iterators incompatible");
return this->base() == other.base();
}
};
struct mfc_ptr_array_functions
{
template< class Iterator, class X >
Iterator begin(X& x)
{
return Iterator(x, 0);
}
template< class Iterator, class X >
Iterator end(X& x)
{
return Iterator(x, x.GetSize());
}
};
// arrays
//
template< >
struct customization< ::CByteArray > :
array_functions
{
template< class X >
struct meta
{
typedef BYTE val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
template< >
struct customization< ::CDWordArray > :
array_functions
{
template< class X >
struct meta
{
typedef DWORD val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
template< >
struct customization< ::CObArray > :
mfc_ptr_array_functions
{
template< class X >
struct meta
{
typedef mfc_ptr_array_iterator<X, CObject *> mutable_iterator;
typedef mfc_ptr_array_iterator<X const, CObject const *> const_iterator;
};
};
template< >
struct customization< ::CPtrArray > :
mfc_ptr_array_functions
{
template< class X >
struct meta
{
typedef mfc_ptr_array_iterator<X, void *> mutable_iterator;
typedef mfc_ptr_array_iterator<X const, void const *> const_iterator;
};
};
template< >
struct customization< ::CStringArray > :
array_functions
{
template< class X >
struct meta
{
typedef ::CString val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
template< >
struct customization< ::CUIntArray > :
array_functions
{
template< class X >
struct meta
{
typedef UINT val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
template< >
struct customization< ::CWordArray > :
array_functions
{
template< class X >
struct meta
{
typedef WORD val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
// lists
//
template< >
struct customization< ::CObList > :
list_functions
{
template< class X >
struct meta
{
typedef list_iterator<X, ::CObject *> mutable_iterator;
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
typedef list_iterator<X const, ::CObject const *> const_iterator;
#else
typedef list_iterator<X const, ::CObject const * const, ::CObject const * const> const_iterator;
#endif
};
};
template< >
struct customization< ::CPtrList > :
list_functions
{
template< class X >
struct meta
{
typedef list_iterator<X, void *> mutable_iterator;
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
typedef list_iterator<X const, void const *> const_iterator;
#else
typedef list_iterator<X const, void const * const, void const * const> const_iterator;
#endif
};
};
template< >
struct customization< ::CStringList > :
list_functions
{
template< class X >
struct meta
{
typedef ::CString val_t;
typedef list_iterator<X, val_t> mutable_iterator;
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
typedef list_iterator<X const, val_t const> const_iterator;
#else
typedef list_iterator<X const, val_t const, val_t const> const_iterator;
#endif
};
};
// mfc_map_iterator
//
template< class MapT, class KeyT, class MappedT >
struct mfc_map_iterator;
template< class MapT, class KeyT, class MappedT >
struct mfc_map_iterator_super
{
typedef iterator_facade<
mfc_map_iterator<MapT, KeyT, MappedT>,
std::pair<KeyT, MappedT>,
forward_traversal_tag,
std::pair<KeyT, MappedT> const
> type;
};
template< class MapT, class KeyT, class MappedT >
struct mfc_map_iterator :
mfc_map_iterator_super<MapT, KeyT, MappedT>::type
{
private:
typedef mfc_map_iterator self_t;
typedef typename mfc_map_iterator_super<MapT, KeyT, MappedT>::type super_t;
typedef typename super_t::reference ref_t;
public:
explicit mfc_map_iterator()
{ }
explicit mfc_map_iterator(MapT const& map, POSITION pos) :
m_pmap(boost::addressof(map)), m_posNext(pos)
{
increment();
}
explicit mfc_map_iterator(MapT const& map) :
m_pmap(&map), m_pos(0) // end iterator
{ }
template< class, class, class > friend struct mfc_map_iterator;
template< class MapT_, class KeyT_, class MappedT_>
mfc_map_iterator(mfc_map_iterator<MapT_, KeyT_, MappedT_> const& other) :
m_pmap(other.m_pmap),
m_pos(other.m_pos), m_posNext(other.m_posNext),
m_key(other.m_key), m_mapped(other.m_mapped)
{ }
private:
MapT const *m_pmap;
POSITION m_pos, m_posNext;
KeyT m_key; MappedT m_mapped;
friend class iterator_core_access;
ref_t dereference() const
{
BOOST_ASSERT(m_pos != 0 && "out of range");
return std::make_pair(m_key, m_mapped);
}
void increment()
{
BOOST_ASSERT(m_pos != 0 && "out of range");
if (m_posNext == 0) {
m_pos = 0;
return;
}
m_pos = m_posNext;
m_pmap->GetNextAssoc(m_posNext, m_key, m_mapped);
}
bool equal(self_t const& other) const
{
BOOST_ASSERT(m_pmap == other.m_pmap && "iterators incompatible");
return m_pos == other.m_pos;
}
};
struct mfc_map_functions
{
template< class Iterator, class X >
Iterator begin(X& x)
{
return Iterator(x, x.GetStartPosition());
}
template< class Iterator, class X >
Iterator end(X& x)
{
return Iterator(x);
}
};
#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
// mfc_cpair_map_iterator
//
// used by ::CMap and ::CMapStringToString
//
template< class MapT, class PairT >
struct mfc_cpair_map_iterator;
template< class MapT, class PairT >
struct mfc_pget_map_iterator_super
{
typedef iterator_facade<
mfc_cpair_map_iterator<MapT, PairT>,
PairT,
forward_traversal_tag
> type;
};
template< class MapT, class PairT >
struct mfc_cpair_map_iterator :
mfc_pget_map_iterator_super<MapT, PairT>::type
{
private:
typedef mfc_cpair_map_iterator self_t;
typedef typename mfc_pget_map_iterator_super<MapT, PairT>::type super_t;
typedef typename super_t::reference ref_t;
public:
explicit mfc_cpair_map_iterator()
{ }
explicit mfc_cpair_map_iterator(MapT& map, PairT *pp) :
m_pmap(boost::addressof(map)), m_pp(pp)
{ }
template< class, class > friend struct mfc_cpair_map_iterator;
template< class MapT_, class PairT_>
mfc_cpair_map_iterator(mfc_cpair_map_iterator<MapT_, PairT_> const& other) :
m_pmap(other.m_pmap), m_pp(other.m_pp)
{ }
private:
MapT *m_pmap;
PairT *m_pp;
friend class iterator_core_access;
ref_t dereference() const
{
BOOST_ASSERT(m_pp != 0 && "out of range");
return *m_pp;
}
void increment()
{
BOOST_ASSERT(m_pp != 0 && "out of range");
m_pp = m_pmap->PGetNextAssoc(m_pp);
}
bool equal(self_t const& other) const
{
BOOST_ASSERT(m_pmap == other.m_pmap && "iterators incompatible");
return m_pp == other.m_pp;
}
};
struct mfc_cpair_map_functions
{
template< class Iterator, class X >
Iterator begin(X& x)
{
// Workaround:
// Assertion fails if empty.
// MFC document is wrong.
#if !defined(NDEBUG)
if (x.GetCount() == 0)
return Iterator(x, 0);
#endif
return Iterator(x, x.PGetFirstAssoc());
}
template< class Iterator, class X >
Iterator end(X& x)
{
return Iterator(x, 0);
}
};
#endif // !defined(BOOST_RANGE_MFC_NO_CPAIR)
// maps
//
template< >
struct customization< ::CMapPtrToWord > :
mfc_map_functions
{
template< class X >
struct meta
{
typedef void *key_t;
typedef WORD mapped_t;
typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
typedef mutable_iterator const_iterator;
};
};
template< >
struct customization< ::CMapPtrToPtr > :
mfc_map_functions
{
template< class X >
struct meta
{
typedef void *key_t;
typedef void *mapped_t;
typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
typedef mutable_iterator const_iterator;
};
};
template< >
struct customization< ::CMapStringToOb > :
mfc_map_functions
{
template< class X >
struct meta
{
typedef ::CString key_t;
typedef ::CObject *mapped_t;
typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
typedef mutable_iterator const_iterator;
};
};
template< >
struct customization< ::CMapStringToPtr > :
mfc_map_functions
{
template< class X >
struct meta
{
typedef ::CString key_t;
typedef void *mapped_t;
typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
typedef mutable_iterator const_iterator;
};
};
template< >
struct customization< ::CMapStringToString > :
#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
mfc_cpair_map_functions
#else
mfc_map_functions
#endif
{
template< class X >
struct meta
{
#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
typedef typename X::CPair pair_t;
typedef mfc_cpair_map_iterator<X, pair_t> mutable_iterator;
typedef mfc_cpair_map_iterator<X const, pair_t const> const_iterator;
#else
typedef ::CString key_t;
typedef ::CString mapped_t;
typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
typedef mutable_iterator const_iterator;
#endif
};
};
template< >
struct customization< ::CMapWordToOb > :
mfc_map_functions
{
template< class X >
struct meta
{
typedef WORD key_t;
typedef ::CObject *mapped_t;
typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
typedef mutable_iterator const_iterator;
};
};
template< >
struct customization< ::CMapWordToPtr > :
mfc_map_functions
{
template< class X >
struct meta
{
typedef WORD key_t;
typedef void *mapped_t;
typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
typedef mutable_iterator const_iterator;
};
};
// templates
//
template< class Type, class ArgType >
struct customization< ::CArray<Type, ArgType> > :
array_functions
{
template< class X >
struct meta
{
typedef Type val_t;
typedef val_t *mutable_iterator;
typedef val_t const *const_iterator;
};
};
template< class Type, class ArgType >
struct customization< ::CList<Type, ArgType> > :
list_functions
{
template< class X >
struct meta
{
typedef Type val_t;
typedef list_iterator<X, val_t> mutable_iterator;
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
typedef list_iterator<X const, val_t const> const_iterator;
#else
typedef list_iterator<X const, val_t const, val_t const> const_iterator;
#endif
};
};
template< class Key, class ArgKey, class Mapped, class ArgMapped >
struct customization< ::CMap<Key, ArgKey, Mapped, ArgMapped> > :
#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
mfc_cpair_map_functions
#else
mfc_map_functions
#endif
{
template< class X >
struct meta
{
#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
typedef typename X::CPair pair_t;
typedef mfc_cpair_map_iterator<X, pair_t> mutable_iterator;
typedef mfc_cpair_map_iterator<X const, pair_t const> const_iterator;
#else
typedef Key key_t;
typedef Mapped mapped_t;
typedef mfc_map_iterator<X, key_t, mapped_t> mutable_iterator;
typedef mutable_iterator const_iterator;
#endif
};
};
template< class BaseClass, class PtrType >
struct customization< ::CTypedPtrArray<BaseClass, PtrType> >
{
template< class X >
struct fun
{
typedef typename remove_pointer<PtrType>::type val_t;
typedef typename mpl::if_< is_const<X>,
val_t const,
val_t
>::type val_t_;
typedef val_t_ * const result_type;
template< class PtrType_ >
result_type operator()(PtrType_ p) const
{
return static_cast<result_type>(p);
}
};
template< class X >
struct meta
{
typedef typename compatible_mutable_iterator<BaseClass>::type miter_t;
typedef typename range_const_iterator<BaseClass>::type citer_t;
typedef transform_iterator<fun<X>, miter_t> mutable_iterator;
typedef transform_iterator<fun<X const>, citer_t> const_iterator;
};
template< class Iterator, class X >
Iterator begin(X& x)
{
return Iterator(boost::begin<BaseClass>(x), fun<X>());
}
template< class Iterator, class X >
Iterator end(X& x)
{
return Iterator(boost::end<BaseClass>(x), fun<X>());
}
};
template< class BaseClass, class PtrType >
struct customization< ::CTypedPtrList<BaseClass, PtrType> > :
list_functions
{
template< class X >
struct meta
{
typedef typename remove_pointer<PtrType>::type val_t;
// not l-value
typedef list_iterator<X, val_t * const, val_t * const> mutable_iterator;
typedef list_iterator<X const, val_t const * const, val_t const * const> const_iterator;
};
};
template< class BaseClass, class KeyPtrType, class MappedPtrType >
struct customization< ::CTypedPtrMap<BaseClass, KeyPtrType, MappedPtrType> > :
mfc_map_functions
{
template< class X >
struct meta
{
typedef mfc_map_iterator<X, KeyPtrType, MappedPtrType> mutable_iterator;
typedef mutable_iterator const_iterator;
};
};
// strings
//
#if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
template< >
struct customization< ::CString >
{
template< class X >
struct meta
{
// LPTSTR/LPCTSTR is not always defined in <tchar.h>.
typedef TCHAR *mutable_iterator;
typedef TCHAR const *const_iterator;
};
template< class Iterator, class X >
typename mutable_<Iterator, X>::type begin(X& x)
{
return x.GetBuffer(0);
}
template< class Iterator, class X >
Iterator begin(X const& x)
{
return x;
}
template< class Iterator, class X >
Iterator end(X& x)
{
return begin<Iterator>(x) + x.GetLength();
}
};
#endif // defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
} } // namespace boost::range_detail_microsoft
// range customizations
//
// arrays
//
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CByteArray
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CDWordArray
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CStringArray
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CUIntArray
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CWordArray
)
// lists
//
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CObList
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CPtrList
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CStringList
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CObArray
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CPtrArray
)
// maps
//
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CMapPtrToWord
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CMapPtrToPtr
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CMapStringToOb
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CMapStringToPtr
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CMapStringToString
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CMapWordToOb
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CMapWordToPtr
)
// templates
//
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CArray, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CList, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CMap, 4
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CTypedPtrArray, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CTypedPtrList, 2
)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CTypedPtrMap, 3
)
// strings
//
#if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
boost::range_detail_microsoft::using_type_as_tag,
BOOST_PP_NIL, CString
)
#endif
#endif

View File

@@ -1,64 +0,0 @@
// 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/
//
#ifndef BOOST_RANGE_MUTABLE_ITERATOR_HPP
#define BOOST_RANGE_MUTABLE_ITERATOR_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/range/config.hpp>
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#include <boost/range/detail/iterator.hpp>
#else
#include <boost/iterator/iterator_traits.hpp>
#include <cstddef>
#include <utility>
namespace boost
{
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename C >
struct range_mutable_iterator
{
typedef BOOST_DEDUCED_TYPENAME C::iterator type;
};
//////////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////////
template< typename Iterator >
struct range_mutable_iterator< std::pair<Iterator,Iterator> >
{
typedef Iterator type;
};
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
struct range_mutable_iterator< T[sz] >
{
typedef T* type;
};
} // namespace boost
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#endif

View File

@@ -1,29 +0,0 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen 2003-2006. 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/
//
#ifndef BOOST_RANGE_POINTER_TYPE_HPP
#define BOOST_RANGE_POINTER_TYPE_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/range/config.hpp>
#include <boost/range/iterator.hpp>
#include <boost/iterator/iterator_traits.hpp>
namespace boost
{
template< class T >
struct range_pointer : iterator_pointer< typename range_iterator<T>::type >
{ };
}
#endif

View File

@@ -16,7 +16,9 @@
#endif
#include <boost/range/end.hpp>
#include <boost/range/reverse_result_iterator.hpp>
#include <boost/range/reverse_iterator.hpp>
#include <boost/range/const_reverse_iterator.hpp>
namespace boost
{
@@ -24,42 +26,43 @@ namespace boost
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
template< class C >
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type
inline BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type
rbegin( C& c )
{
return BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type( boost::end( c ) );
return BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type( end( c ) );
}
#else
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 )
{
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<
typename remove_const<C>::type >::type
iter_type;
return iter_type( boost::end( c ) );
return iter_type( end( c ) );
}
template< class C >
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<const C>::type
inline BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
rbegin( const C& c )
{
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<const C>::type
typedef BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
iter_type;
return iter_type( boost::end( c ) );
return iter_type( end( c ) );
}
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
template< class T >
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<const T>::type
inline BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<T>::type
const_rbegin( const T& r )
{
return boost::rbegin( r );
return rbegin( r );
}
} // namespace 'boost'
#endif

View File

@@ -1,29 +0,0 @@
// 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/
//
#ifndef BOOST_RANGE_REFERENCE_TYPE_HPP
#define BOOST_RANGE_REFERENCE_TYPE_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/range/config.hpp>
#include <boost/range/iterator.hpp>
#include <boost/iterator/iterator_traits.hpp>
namespace boost
{
template< class T >
struct range_reference : iterator_reference< typename range_iterator<T>::type >
{ };
}
#endif

View File

@@ -16,50 +16,53 @@
#endif
#include <boost/range/begin.hpp>
#include <boost/range/reverse_result_iterator.hpp>
#include <boost/range/reverse_iterator.hpp>
#include <boost/range/const_reverse_iterator.hpp>
namespace boost
{
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
template< class C >
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type
inline BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type
rend( C& c )
{
return BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type( boost::begin( c ) );
return BOOST_DEDUCED_TYPENAME range_reverse_result_iterator<C>::type( begin( c ) );
}
#else
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 )
{
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<C>::type
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<
typename remove_const<C>::type >::type
iter_type;
return iter_type( boost::begin( c ) );
return iter_type( begin( c ) );
}
template< class C >
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<const C>::type
inline BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
rend( const C& c )
{
typedef BOOST_DEDUCED_TYPENAME range_reverse_iterator<const C>::type
typedef BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<C>::type
iter_type;
return iter_type( boost::begin( c ) );
return iter_type( begin( c ) );
}
#endif
template< class T >
inline BOOST_DEDUCED_TYPENAME range_reverse_iterator<const T>::type
inline BOOST_DEDUCED_TYPENAME range_const_reverse_iterator<T>::type
const_rend( const T& r )
{
return boost::rend( r );
return rend( r );
}
} // namespace 'boost'
#endif

View File

@@ -15,19 +15,29 @@
# pragma once
#endif
#include <boost/range/config.hpp>
#include <boost/range/iterator.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/mpl/if.hpp>
namespace boost
{
//
// This interface is deprecated, use range_iterator<T>
//
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename C >
struct range_result_iterator : range_iterator<C>
{ };
struct range_result_iterator
{
typedef BOOST_RANGE_DEDUCED_TYPENAME
mpl::if_< BOOST_DEDUCED_TYPENAME is_const<C>::type,
BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type,
BOOST_DEDUCED_TYPENAME range_iterator<C>::type >::type type;
};
} // namespace boost
//#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#endif

View File

@@ -15,17 +15,22 @@
# pragma once
#endif
#include <boost/range/reverse_iterator.hpp>
#include <boost/range/config.hpp>
#include <boost/range/result_iterator.hpp>
#include <boost/iterator/reverse_iterator.hpp>
namespace boost
{
//
// This interface is deprecated, use range_reverse_iterator<T>
//
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename C >
struct range_reverse_result_iterator : range_reverse_iterator<C>
{ };
struct range_reverse_result_iterator
{
typedef reverse_iterator<
BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<C>::type > type;
};
} // namespace boost

View File

@@ -15,19 +15,109 @@
# pragma once
#endif
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/config.hpp>
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
#include <boost/range/detail/size.hpp>
#else
#include <boost/range/detail/implementation_help.hpp>
#include <boost/range/size_type.hpp>
#include <cstddef>
#include <iterator>
#include <utility>
namespace boost
{
template< class T >
inline BOOST_DEDUCED_TYPENAME range_size<T>::type size( const T& r )
{
return boost::end( r ) - boost::begin( r );
}
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
namespace range_detail
{
#endif
//////////////////////////////////////////////////////////////////////
// primary template
//////////////////////////////////////////////////////////////////////
template< typename C >
inline BOOST_DEDUCED_TYPENAME C::size_type
boost_range_size( const C& c )
{
return c.size();
}
//////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////
template< typename Iterator >
inline std::size_t boost_range_size( const std::pair<Iterator,Iterator>& p )
{
return std::distance( p.first, p.second );
}
//////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
inline std::size_t boost_range_size( const T (&array)[sz] )
{
return range_detail::array_size<T,sz>( array );
}
template< typename T, std::size_t sz >
inline std::size_t boost_range_size( T (&array)[sz] )
{
return boost::range_detail::array_size<T,sz>( array );
}
//////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////
inline std::size_t boost_range_size( const char* const& s )
{
return boost::range_detail::str_size( s );
}
inline std::size_t boost_range_size( const wchar_t* const& s )
{
return boost::range_detail::str_size( s );
}
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
} // namespace 'range_detail'
#endif
template< class T >
inline BOOST_DEDUCED_TYPENAME range_size<T>::type size( const T& r )
{
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
using namespace range_detail;
#endif
return boost_range_size( r );
}
#if BOOST_WORKAROUND(__MWERKS__, <= 0x3003 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
// BCB and CW are not able to overload pointer when class overloads are also available.
inline range_size<const char*>::type size( const char* r ) {
return range_detail::str_size( r );
}
inline range_size<char*>::type size( char* r ) {
return range_detail::str_size( r );
}
inline range_size<const wchar_t*>::type size( const wchar_t* r ) {
return range_detail::str_size( r );
}
inline range_size<wchar_t*>::type size( wchar_t* r ) {
return range_detail::str_size( r );
}
#endif
} // namespace 'boost'
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
#endif

View File

@@ -16,60 +16,158 @@
#endif
#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
#include <boost/range/detail/size_type.hpp>
#else
#include <boost/type_traits/remove_const.hpp>
#include <cstddef>
#include <utility>
namespace boost
{
namespace detail
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename C >
struct range_size
{
typedef BOOST_DEDUCED_TYPENAME C::size_type type;
};
//////////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename Iterator >
struct range_size< std::pair<Iterator,Iterator> >
{
typedef std::size_t type;
};
template< typename C >
struct range_size
{
typedef BOOST_DEDUCED_TYPENAME C::size_type type;
};
//////////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////////
template< typename Iterator >
struct range_size< std::pair<Iterator,Iterator> >
{
typedef std::size_t type;
};
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
struct range_size< T[sz] >
{
typedef std::size_t type;
};
}
template< typename Iterator >
struct range_size< const std::pair<Iterator,Iterator> >
{
typedef std::size_t type;
};
template< class T >
struct range_size :
detail::range_size<T>
{ };
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
struct range_size< T[sz] >
{
typedef std::size_t type;
};
template< typename T, std::size_t sz >
struct range_size< const T[sz] >
{
typedef std::size_t type;
};
//////////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////////
template<>
struct range_size< char* >
{
typedef std::size_t type;
};
template<>
struct range_size< wchar_t* >
{
typedef std::size_t type;
};
template<>
struct range_size< const char* >
{
typedef std::size_t type;
};
template<>
struct range_size< const wchar_t* >
{
typedef std::size_t type;
};
template<>
struct range_size< char* const >
{
typedef std::size_t type;
};
template<>
struct range_size< wchar_t* const >
{
typedef std::size_t type;
};
template<>
struct range_size< const char* const >
{
typedef std::size_t type;
};
template<>
struct range_size< const wchar_t* const >
{
typedef std::size_t type;
};
template< class T >
struct range_size<const T > : range_size<T>
{ };
} // namespace boost
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION

View File

@@ -11,13 +11,10 @@
#ifndef BOOST_RANGE_SUB_RANGE_HPP
#define BOOST_RANGE_SUB_RANGE_HPP
#if BOOST_WORKAROUND(BOOST_MSVC, == 1310) || BOOST_WORKAROUND(BOOST_MSVC, == 1400)
#pragma warning( disable : 4996 )
#endif
#include <boost/range/config.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/range/value_type.hpp>
#include <boost/range/result_iterator.hpp>
#include <boost/range/size_type.hpp>
#include <boost/range/difference_type.hpp>
#include <boost/assert.hpp>
@@ -26,29 +23,37 @@ namespace boost
{
template< class ForwardRange >
class sub_range : public iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type >
class sub_range : public iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<ForwardRange>::type >
{
typedef BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type iterator_t;
typedef BOOST_DEDUCED_TYPENAME range_result_iterator<ForwardRange>::type iterator_t;
typedef iterator_range< iterator_t > base;
typedef BOOST_DEDUCED_TYPENAME base::impl impl;
public:
typedef BOOST_DEDUCED_TYPENAME range_value<ForwardRange>::type value_type;
typedef BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type iterator;
typedef BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type const_iterator;
typedef BOOST_DEDUCED_TYPENAME range_result_iterator<ForwardRange>::type iterator;
typedef BOOST_DEDUCED_TYPENAME range_const_iterator<ForwardRange>::type const_iterator;
typedef BOOST_DEDUCED_TYPENAME range_difference<ForwardRange>::type difference_type;
typedef BOOST_DEDUCED_TYPENAME range_size<ForwardRange>::type size_type;
public:
sub_range() : base()
{ }
/*
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
typedef sub_range<ForwardRange> this_type;
#if BOOST_WORKAROUND(BOOST_MSVC, == 1310) || BOOST_WORKAROUND(BOOST_MSVC, == 1400)
sub_range( const sub_range& r )
: base( static_cast<const base&>( r ) )
{ }
#endif
sub_range( this_type r ) :
: base( r )
{ }
this_type& operator=( this_type r )
{
base::operator=( r );
return *this;
}
#endif
*/
template< class ForwardRange2 >
sub_range( ForwardRange2& r ) :
@@ -86,12 +91,6 @@ namespace boost
{
base::operator=( r );
return *this;
}
sub_range& operator=( const sub_range& r )
{
base::operator=( static_cast<const base&>(r) );
return *this;
}
public:
@@ -161,4 +160,3 @@ namespace boost
} // namespace 'boost'
#endif

View File

@@ -18,17 +18,129 @@
#include <boost/range/config.hpp>
#include <boost/range/iterator.hpp>
//#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
//#include <boost/range/detail/value_type.hpp>
//#else
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#include <boost/range/detail/value_type.hpp>
#else
#include <boost/iterator/iterator_traits.hpp>
namespace boost
{
template< class T >
struct range_value : iterator_value< typename range_iterator<T>::type >
{ };
template< class T >
struct range_value
{
typedef BOOST_DEDUCED_TYPENAME iterator_value<
BOOST_DEDUCED_TYPENAME range_iterator<T>::type >::type
type;
};
}
/*
#include <cstddef>
#include <utility>
namespace boost
{
//////////////////////////////////////////////////////////////////////////
// default
//////////////////////////////////////////////////////////////////////////
template< typename C >
struct range_value
{
typedef BOOST_DEDUCED_TYPENAME C::value_type type;
};
//////////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////////
template< typename Iterator >
struct range_value< std::pair<Iterator,Iterator> >
{
typedef BOOST_DEDUCED_TYPENAME
iterator_value<Iterator>::type type;
};
template< typename Iterator >
struct range_value< const std::pair<Iterator,Iterator> >
{
typedef BOOST_DEDUCED_TYPENAME
iterator_value<Iterator>::type type;
};
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
struct range_value< T[sz] >
{
typedef T type;
};
template< typename T, std::size_t sz >
struct range_value< const T[sz] >
{
typedef const T type;
};
//////////////////////////////////////////////////////////////////////////
// string
//////////////////////////////////////////////////////////////////////////
template<>
struct range_value< char* >
{
typedef char type;
};
template<>
struct range_value< wchar_t* >
{
typedef wchar_t type;
};
template<>
struct range_value< const char* >
{
typedef const char type;
};
template<>
struct range_value< const wchar_t* >
{
typedef const wchar_t type;
};
template<>
struct range_value< char* const >
{
typedef char type;
};
template<>
struct range_value< wchar_t* const >
{
typedef wchar_t type;
};
template<>
struct range_value< const char* const >
{
typedef const char type;
};
template<>
struct range_value< const wchar_t* const >
{
typedef const wchar_t type;
};
} // namespace boost
*/
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#endif

View File

@@ -51,9 +51,7 @@
<li> <a href="doc/style.html">Terminology and style guidelines </a>
<li><a href="doc/headers.html">Headers</a> </li>
<li><a href="doc/examples.html">Examples</a>
<li><a href="doc/mfc_atl.html">MFC/ATL mapping (courtesy of Shunsuke
Sogame)</a></li>
<li><a href="doc/examples.html">Examples</a>
<li><a href="doc/portability.html">Portability</a>
<li><a href="doc/faq.html">FAQ</a>
<li><a href="doc/history_ack.html">History and acknowledgment</a>

41
test/Jamfile Executable file
View File

@@ -0,0 +1,41 @@
# 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/
#
subproject libs/range/test ;
import testing ;
rule range-test ( name : includes * )
{
return [
run $(name).cpp
<lib>../../test/build/boost_unit_test_framework
:
:
: <include>$(BOOST_ROOT)
$(includes)
] ;
}
test-suite range :
[ range-test array ]
[ range-test iterator_pair ]
[ range-test std_container ]
[ range-test string ]
[ range-test iterator_range ]
[ range-test sub_range ]
[ range-test partial_workaround ]
[ range-test algorithm_example ]
[ range-test reversible_range ]
[ range-test const_ranges ]
[ range-test extension_mechanism ]
# [ range-test mfc : <include>$(VC71_ROOT)/atlmfc/include ]
;

View File

@@ -11,7 +11,7 @@
rule range-test ( name : includes * )
{
return [
run $(name).cpp /boost/test//boost_unit_test_framework/<link>static
run $(name).cpp /boost/test//boost_unit_test_framework
:
:
: $(includes)
@@ -29,7 +29,6 @@ test-suite range :
[ range-test algorithm_example ]
[ range-test reversible_range ]
[ range-test const_ranges ]
[ range-test extension_mechanism ]
# [ range-test mfc : <include>$(VC71_ROOT)/atlmfc/include ]
[ range-test mfc : <include>$(VC71_ROOT)/atlmfc/include ]
;

View File

@@ -17,7 +17,6 @@
#include <boost/range/functions.hpp>
#include <boost/range/metafunctions.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/test/test_tools.hpp>
#include <iostream>
#include <algorithm>
@@ -37,7 +36,7 @@ namespace
}
template< typename Range, typename T >
inline typename boost::range_iterator<Range>::type
inline typename boost::range_const_iterator<Range>::type
find( const Range& c, const T& value )
{
return std::find( boost::begin( c ), boost::end( c ), value );
@@ -47,7 +46,7 @@ namespace
// replace first value and return its index
//
template< class Range, class T >
inline typename boost::range_difference<Range>::type
inline typename boost::range_size<Range>::type
my_generic_replace( Range& c, const T& value, const T& replacement )
{
typename boost::range_iterator<Range>::type found = find( c, value );
@@ -71,8 +70,12 @@ void check_algorithm()
typedef std::vector<int>::iterator iterator;
std::pair<iterator,iterator> my_view( boost::begin( my_vector ),
boost::begin( my_vector ) + N );
char str_val[] = "a string";
char* str = str_val;
BOOST_CHECK_EQUAL( my_generic_replace( my_vector, 4, 2 ), 3u );
BOOST_CHECK_EQUAL( my_generic_replace( my_view, 4, 2 ), N );
BOOST_CHECK_EQUAL( my_generic_replace( str, 'a', 'b' ), 0u );
}

View File

@@ -42,16 +42,16 @@ void check_array()
BOOST_STATIC_ASSERT(( is_same< range_const_iterator<array_t>::type, const int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_difference<array_t>::type, std::ptrdiff_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<array_t>::type, std::size_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<array_t>::type, int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const array_t>::type, const int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<array_t>::type, int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const array_t>::type, const int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_value<const array_t>::type, const int >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const array_t>::type, const int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_const_iterator<const array_t>::type, const int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_difference<const array_t>::type, std::ptrdiff_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<const array_t>::type, std::size_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const array_t>::type, const int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const array_t>::type, const int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const array_t>::type, const int* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const array_t>::type, const int* >::value ));
#endif
BOOST_CHECK_EQUAL( begin( my_array ), my_array );
@@ -62,8 +62,6 @@ void check_array()
BOOST_CHECK_EQUAL( end( ca ), ca + size( ca ) );
BOOST_CHECK_EQUAL( empty( ca ),false );
const char A[] = "\0A";
BOOST_CHECK_EQUAL( boost::size(A), 3u );
}
using boost::unit_test::test_suite;

View File

@@ -1,623 +0,0 @@
// Boost.Range ATL Extension
//
// Copyright Shunsuke Sogame 2005-2006.
// Distributed under 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)
// #include <pstade/vodka/drink.hpp>
#include <boost/test/test_tools.hpp>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define BOOST_LIB_NAME boost_test_exec_monitor
#include <boost/config/auto_link.hpp>
#define BOOST_RANGE_DETAIL_MICROSOFT_TEST
#include <boost/range/atl.hpp> // can be placed first
#include <map>
#include <string>
#include <boost/concept_check.hpp>
#include <boost/mpl/if.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/distance.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/foreach.hpp>
#include <atlbase.h> // for ATL3 CSimpleArray/CSimpleValArray
#if !(_ATL_VER < 0x0700)
#include <atlcoll.h>
#include <cstringt.h>
#include <atlsimpstr.h>
#include <atlstr.h>
#endif
namespace brdm = boost::range_detail_microsoft;
#if !(_ATL_VER < 0x0700)
template< class ArrayT, class SampleRange >
bool test_init_auto_ptr_array(ArrayT& arr, SampleRange& sample)
{
typedef typename boost::range_iterator<SampleRange>::type iter_t;
for (iter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) {
arr.Add(*it); // moves ownership
}
return boost::distance(arr) == boost::distance(sample);
}
template< class ListT, class SampleRange >
bool test_init_auto_ptr_list(ListT& lst, SampleRange& sample)
{
typedef typename boost::range_iterator<SampleRange>::type iter_t;
typedef typename boost::range_value<SampleRange>::type val_t;
for (iter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) {
lst.AddTail(*it); // moves ownership
}
return boost::distance(lst) == boost::distance(sample);
}
// Workaround:
// CRBTree provides no easy access function, but yes, it is the range!
//
template< class AtlMapT, class KeyT, class MappedT >
bool test_atl_map_has(AtlMapT& map, const KeyT& k, const MappedT m)
{
typedef typename boost::range_iterator<AtlMapT>::type iter_t;
for (iter_t it = boost::begin(map), last = boost::end(map); it != last; ++it) {
if (it->m_key == k && it->m_value == m)
return true;
}
return false;
}
template< class AtlMapT, class MapT >
bool test_atl_map(AtlMapT& map, const MapT& sample)
{
typedef typename boost::range_iterator<AtlMapT>::type iter_t;
typedef typename boost::range_const_iterator<MapT>::type siter_t;
bool result = true;
result = result && (boost::distance(map) == boost::distance(sample));
if (!result)
return false;
{
for (iter_t it = boost::begin(map), last = boost::end(map); it != last; ++it) {
result = result && brdm::test_find_key_and_mapped(sample, std::make_pair(it->m_key, it->m_value));
}
}
{
for (siter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) {
result = result && (test_atl_map_has)(map, it->first, it->second);
}
}
return result;
}
template< class MapT, class SampleMap >
bool test_init_atl_multimap(MapT& map, const SampleMap& sample)
{
typedef typename boost::range_const_iterator<SampleMap>::type iter_t;
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
map.Insert(it->first, it->second);
}
return boost::distance(map) == boost::distance(sample);
}
// arrays
//
template< class Range >
void test_CAtlArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ATL::CAtlArray<val_t> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, val_t *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, val_t const*>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class ValT, class Range >
void test_CAutoPtrArray(Range& sample)
{
typedef ValT val_t;
typedef ATL::CAutoPtrArray<val_t> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, boost::indirect_iterator< ATL::CAutoPtr<val_t> *> >::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, boost::indirect_iterator< ATL::CAutoPtr<val_t> const*> >::value ));
rng_t rng;
BOOST_CHECK( ::test_init_auto_ptr_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class I, class Range >
void test_CInterfaceArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ATL::CInterfaceArray<I> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, ATL::CComQIPtr<I> * >::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, ATL::CComQIPtr<I> const* >::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
// lists
//
template< class Range >
void test_CAtlList(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ATL::CAtlList<val_t> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator<rng_t, val_t> >::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, val_t const> >::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_list(rng, sample) );
BOOST_CHECK( brdm::test_bidirectional(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class ValT, class Range >
void test_CAutoPtrList(Range& sample)
{
typedef ValT val_t;
typedef ATL::CAutoPtrList<val_t> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, boost::indirect_iterator< brdm::list_iterator<rng_t, ATL::CAutoPtr<val_t> > > >::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, boost::indirect_iterator< brdm::list_iterator<rng_t const, ATL::CAutoPtr<val_t> const> > >::value ));
rng_t rng;
BOOST_CHECK( ::test_init_auto_ptr_list(rng, sample) );
BOOST_CHECK( brdm::test_bidirectional(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class ValT, class Range >
void test_CHeapPtrList(const Range& sample)
{
typedef ValT val_t;
typedef ATL::CHeapPtrList<val_t> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, boost::indirect_iterator< brdm::list_iterator<rng_t, ATL::CHeapPtr<val_t> > > >::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, boost::indirect_iterator< brdm::list_iterator<rng_t const, ATL::CHeapPtr<val_t> const> > >::value ));
rng_t rng;
BOOST_CHECK( ::test_init_auto_ptr_list(rng, sample) );
BOOST_CHECK( brdm::test_bidirectional(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class I, class Range >
void test_CInterfaceList(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ATL::CInterfaceList<I> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator<rng_t, ATL::CComQIPtr<I> > >::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, ATL::CComQIPtr<I> const> >::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_list(rng, sample) );
BOOST_CHECK( brdm::test_bidirectional(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
// strings
//
template< class Range >
void test_CSimpleStringT(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef typename boost::mpl::if_< boost::is_same<val_t, char>,
ATL::CAtlStringA,
ATL::CAtlStringW
>::type derived_t;
typedef ATL::CSimpleStringT<val_t> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, typename rng_t::PXSTR>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, typename rng_t::PCXSTR>::value ));
derived_t drng;
rng_t& rng = drng;
BOOST_CHECK( brdm::test_init_string(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
// BOOST_CHECK( brdm::test_emptiness(rng) ); no default constructible
}
template< int n, class Range >
void test_CFixedStringT(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef typename boost::mpl::if_< boost::is_same<val_t, char>,
ATL::CAtlStringA,
ATL::CAtlStringW
>::type base_t;
typedef ATL::CFixedStringT<base_t, n> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, typename rng_t::PXSTR>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, typename rng_t::PCXSTR>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_string(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CStringT(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef typename boost::mpl::if_< boost::is_same<val_t, char>,
ATL::CAtlStringA, // == CStringT<char, X>
ATL::CAtlStringW // == CStringT<wchar_t, X>
>::type rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, typename rng_t::PXSTR>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, typename rng_t::PCXSTR>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_string(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CStaticString(const Range& sample)
{
#if !defined(BOOST_RANGE_ATL_NO_TEST_UNDOCUMENTED_RANGE)
{
typedef ATL::CStaticString<char, 20> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, char const *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, char const *>::value ));
rng_t rng("hello static string");
BOOST_CHECK( *(boost::begin(rng)+4) == 'o' );
BOOST_CHECK( *(boost::end(rng)-3) == 'i' );
}
{
typedef ATL::CStaticString<wchar_t, 40> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, wchar_t const *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, wchar_t const *>::value ));
rng_t rng(L"hello static string");
BOOST_CHECK( *(boost::begin(rng)+4) == L'o' );
BOOST_CHECK( *(boost::end(rng)-3) == L'i' );
}
#endif
(void)sample; // unused
}
#endif // !(_ATL_VER < 0x0700)
template< class Range >
void test_CComBSTR(const Range& sample)
{
typedef ATL::CComBSTR rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, OLECHAR *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, OLECHAR const*>::value ));
rng_t rng(OLESTR("hello CComBSTR range!"));
BOOST_CHECK( brdm::test_equals(rng, std::string("hello CComBSTR range!")) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
(void)sample; // unused
}
// simples
//
template< class Range >
void test_CSimpleArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ATL::CSimpleArray<val_t> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, val_t *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, val_t const*>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CSimpleMap(const Range& sample)
{
#if !defined(BOOST_RANGE_ATL_NO_TEST_UNDOCUMENTED_RANGE)
typedef ATL::CSimpleMap<int, double> rng_t;
rng_t rng;
rng.Add(3, 3.0);
rng.Add(4, 2.0);
BOOST_CHECK( boost::begin(rng)->get<0>() == 3.0 );
BOOST_CHECK( (boost::end(rng)-1)->get<1>() == 2.0 );
#endif
(void)sample; // unused
}
template< class Range >
void test_CSimpleValArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ATL::CSimpleArray<val_t> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, val_t *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, val_t const*>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
// maps
//
template< class MapT >
void test_CAtlMap(const MapT& sample)
{
typedef typename MapT::key_type k_t;
typedef typename MapT::mapped_type m_t;
typedef ATL::CAtlMap<k_t, m_t> rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
BOOST_CHECK( ::test_atl_map(rng, sample) );
}
template< class MapT >
void test_CRBTree(const MapT& sample)
{
typedef typename MapT::key_type k_t;
typedef typename MapT::mapped_type m_t;
typedef ATL::CRBMap<k_t, m_t> derived_t;
typedef ATL::CRBTree<k_t, m_t> rng_t;
derived_t drng;
rng_t& rng = drng;
boost::function_requires< boost::BidirectionalRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(drng, sample) );
BOOST_CHECK( ::test_atl_map(rng, sample) );
}
template< class MapT >
void test_CRBMap(const MapT& sample)
{
typedef typename MapT::key_type k_t;
typedef typename MapT::mapped_type m_t;
typedef ATL::CRBMap<k_t, m_t> rng_t;
rng_t rng;
boost::function_requires< boost::BidirectionalRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
BOOST_CHECK( ::test_atl_map(rng, sample) );
}
template< class MapT >
void test_CRBMultiMap(const MapT& sample)
{
typedef typename MapT::key_type k_t;
typedef typename MapT::mapped_type m_t;
typedef ATL::CRBMultiMap<k_t, m_t> rng_t;
rng_t rng;
boost::function_requires< boost::BidirectionalRangeConcept<rng_t> >();
BOOST_CHECK( ::test_init_atl_multimap(rng, sample) );
BOOST_CHECK( ::test_atl_map(rng, sample) );
}
// main test
//
void test_atl()
{
// ordinary ranges
//
{
std::string sample("rebecca judy and mary whiteberry chat monchy");
#if !(_ATL_VER < 0x0700)
::test_CAtlArray(sample);
::test_CAtlList(sample);
::test_CSimpleStringT(sample);
::test_CFixedStringT<44>(sample);
::test_CStringT(sample);
::test_CStaticString(sample);
#endif
::test_CComBSTR(sample);
::test_CSimpleArray(sample);
::test_CSimpleMap(sample);
::test_CSimpleValArray(sample);
}
{
std::wstring sample(L"rebecca judy and mary whiteberry chat monchy");
#if !(_ATL_VER < 0x0700)
::test_CAtlArray(sample);
::test_CAtlList(sample);
::test_CSimpleStringT(sample);
::test_CFixedStringT<44>(sample);
::test_CStringT(sample);
::test_CStaticString(sample);
#endif
::test_CComBSTR(sample);
::test_CSimpleArray(sample);
::test_CSimpleMap(sample);
::test_CSimpleValArray(sample);
}
// pointer ranges
//
#if !(_ATL_VER < 0x0700)
{
typedef ATL::CAutoPtr<int> ptr_t;
ptr_t
ptr0(new int(3)), ptr1(new int(4)), ptr2(new int(5)), ptr3(new int(4)),
ptr4(new int(1)), ptr5(new int(2)), ptr6(new int(4)), ptr7(new int(0));
ptr_t ptrs[8] = {
ptr0, ptr1, ptr2, ptr3, ptr4, ptr5, ptr6, ptr7
};
boost::iterator_range< ptr_t * > workaround(ptrs, ptrs+8);
::test_CAutoPtrArray<int>(workaround);
}
{
typedef ATL::CAutoPtr<int> ptr_t;
ptr_t
ptr0(new int(3)), ptr1(new int(4)), ptr2(new int(5)), ptr3(new int(4)),
ptr4(new int(1)), ptr5(new int(2)), ptr6(new int(4)), ptr7(new int(0));
ptr_t ptrs[8] = {
ptr0, ptr1, ptr2, ptr3, ptr4, ptr5, ptr6, ptr7
};
boost::iterator_range< ptr_t * > workaround(ptrs, ptrs+8);
::test_CAutoPtrList<int>(workaround);
}
{
typedef ATL::CHeapPtr<int> ptr_t;
ptr_t ptrs[5]; {
ptrs[0].AllocateBytes(sizeof(int));
ptrs[1].AllocateBytes(sizeof(int));
ptrs[2].AllocateBytes(sizeof(int));
ptrs[3].AllocateBytes(sizeof(int));
ptrs[4].AllocateBytes(sizeof(int));
}
boost::iterator_range< ptr_t * > workaround(ptrs, ptrs+5);
::test_CHeapPtrList<int>(workaround);
}
{
typedef ATL::CComQIPtr<IDispatch> ptr_t;
ptr_t ptrs[8];
boost::iterator_range< ptr_t * > workaround(ptrs, ptrs+8);
::test_CInterfaceArray<IDispatch>(workaround);
::test_CInterfaceList<IDispatch>(workaround);
}
#endif
// maps
//
{
#if !(_ATL_VER < 0x0700)
std::map<int, std::string> sample; {
sample[0] = "hello";
sample[1] = "range";
sample[2] = "atl";
sample[3] = "mfc";
sample[4] = "collections";
}
::test_CAtlMap(sample);
::test_CRBTree(sample);
::test_CRBMap(sample);
::test_CRBMultiMap(sample);
#endif
}
} // test_atl
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;
test_suite *
init_unit_test_suite(int argc, char* argv[])
{
test_suite *test = BOOST_TEST_SUITE("ATL Range Test Suite");
test->add(BOOST_TEST_CASE(&test_atl));
(void)argc, (void)argv; // unused
return test;
}

View File

@@ -25,70 +25,74 @@
// Generic range algorithm
//
template< class Rng >
typename boost::range_iterator<Rng>::type foo_algo( Rng& r )
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);
//
// 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;
//
// 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;
data_t vec;
void push_back( int i )
{ vec.push_back(i); }
};
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 range_begin( X& x )
{
return x.vec.begin();
}
//
// 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::const_iterator 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::iterator range_end( X& x )
{
return x.vec.end();
}
inline X::const_iterator 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::X x;
x.push_back(3);
const Foo::X x2;
foo_algo( x );
foo_algo( x2 );
foo_algo( x );
foo_algo( x2 );
}
using boost::unit_test::test_suite;

View File

@@ -15,7 +15,6 @@
# pragma warn -8057 // unused argument argc/argv in Boost.Test
#endif
#include <boost/range/concepts.hpp>
#include <boost/range/functions.hpp>
#include <boost/range/metafunctions.hpp>
#include <boost/static_assert.hpp>
@@ -47,20 +46,18 @@ void check_iterator_pair()
BOOST_STATIC_ASSERT(( is_same< range_difference<pair_t>::type,
detail::iterator_traits<pair_t::first_type>::difference_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<pair_t>::type, std::size_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<pair_t>::type, pair_t::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const_pair_t>::type, const_pair_t::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<pair_t>::type, pair_t::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const_pair_t>::type, const_pair_t::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_value<const_pair_tt>::type,
detail::iterator_traits<const_pair_t::first_type>::value_type>::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value ));
//
// This behavior is not supported with v2.
//BOOST_STATIC_ASSERT(( is_same< range_const_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_const_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_difference<const_pair_tt>::type,
detail::iterator_traits<const_pair_tt::first_type>::difference_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<const_pair_tt>::type, std::size_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const_pair_tt>::type, const_pair_tt::first_type >::value ));
BOOST_CHECK( begin( pair ) == pair.first );
BOOST_CHECK( end( pair ) == pair.second );

View File

@@ -1,6 +1,6 @@
// Boost.Range library
//
// Copyright Thorsten Ottosen & Larry Evans 2003-2005. Use, modification and
// 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)
@@ -8,7 +8,6 @@
// For more information, see http://www.boost.org/libs/range/
//
//#include <boost/range/as_array.hpp>
#include <boost/detail/workaround.hpp>
@@ -17,9 +16,9 @@
# pragma warn -8057 // unused argument argc/argv in Boost.Test
#endif
#include <boost/range/iterator_range.hpp>
#include <boost/range/functions.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/test/test_tools.hpp>
#include <boost/test/unit_test.hpp>
#include <iostream>
@@ -28,8 +27,6 @@
using namespace boost;
using namespace std;
void check_reference_type();
void check_iterator_range()
{
@@ -66,12 +63,6 @@ void check_iterator_range()
BOOST_CHECK_EQUAL( distance( r.begin(), r.end() ),
distance( begin( r2 ), end( r2 ) ) );
cout << r << r2;
#ifndef BOOST_NO_STD_WSTRING
wcout << make_iterator_range( wstring( L"a wide string" ) )
<< make_iterator_range( L"another wide string" );
#endif
string res = copy_range<string>( r );
BOOST_CHECK( equal( res.begin(), res.end(), r.begin() ) );
@@ -80,12 +71,12 @@ void check_iterator_range()
BOOST_CHECK( rr.equal( r ) );
rr = make_iterator_range( str.begin(), str.begin() + 5 );
BOOST_CHECK( rr == as_literal("hello") );
BOOST_CHECK( rr != as_literal("hell") );
BOOST_CHECK( rr < as_literal("hello dude") );
BOOST_CHECK( as_literal("hello") == rr );
BOOST_CHECK( as_literal("hell") != rr );
BOOST_CHECK( ! (as_literal("hello dude") < rr ) );
BOOST_CHECK( rr == "hello" );
BOOST_CHECK( rr != "hell" );
BOOST_CHECK( rr < "hello dude" );
BOOST_CHECK( "hello" == rr );
BOOST_CHECK( "hell" != rr );
BOOST_CHECK( ! ("hello dude" < rr ) );
irange rrr = rr;
BOOST_CHECK( rrr == rr );
BOOST_CHECK( !( rrr != rr ) );
@@ -95,14 +86,11 @@ void check_iterator_range()
BOOST_CHECK_EQUAL( cr.front(), 'h' );
BOOST_CHECK_EQUAL( cr.back(), 'd' );
BOOST_CHECK_EQUAL( cr[1], 'e' );
BOOST_CHECK_EQUAL( cr(1), 'e' );
rrr = make_iterator_range( str, 1, -1 );
BOOST_CHECK( rrr == as_literal("ello worl") );
BOOST_CHECK( rrr == "ello worl" );
rrr = make_iterator_range( rrr, -1, 1 );
BOOST_CHECK( rrr == str );
check_reference_type();
}
@@ -117,34 +105,3 @@ test_suite* init_unit_test_suite( int argc, char* argv[] )
return test;
}
//
//
// Check that constness is propgated correct from
// the iterator types.
//
// Test contributed by Larry Evans.
//
template< class Container >
int test_iter_range( Container& a_cont )
{
typedef BOOST_DEDUCED_TYPENAME range_iterator<Container>::type citer_type;
typedef iterator_range<citer_type> riter_type;
riter_type a_riter( make_iterator_range( a_cont ) );
a_riter.front();
a_riter.back();
int i = a_riter[0];
return i;
}
void check_reference_type()
{
typedef vector<int> veci_type;
veci_type a_vec;
a_vec.push_back( 999 );
test_iter_range<veci_type>(a_vec);
test_iter_range<veci_type const>(a_vec);
}

View File

@@ -1,743 +1,86 @@
// Boost.Range MFC Extension
// 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/
//
// Copyright Shunsuke Sogame 2005-2006.
// Distributed under 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)
#define _MSL_USING_NAMESPACE 1
#include <afx.h> // must be here
#include <boost/detail/workaround.hpp>
// #include <pstade/vodka/drink.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
#define BOOST_RANGE_ENABLE_MFC
#define BOOST_RANGE_ENABLE_MCF_CARRAY
/*
#define WIN32
#define _WINDOWS
#define _MBCS
#define _AFXDLL
#define _ATL_DLL
*/
///Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_MBCS" /D "_AFXDLL" /D "_ATL_DLL" /Gm /EHsc /RTC1
// /MDd /Zc:wchar_t /Yu"stdafx.h" /Fp"Debug/Foo.pch" /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP
#include <boost/range.hpp>
#include <boost/range/detail/mfc/carray.hpp>
#include <boost/range/detail/mfc/cstring.hpp>
#include <boost/test/test_tools.hpp>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define BOOST_LIB_NAME boost_test_exec_monitor
#include <boost/config/auto_link.hpp>
#define BOOST_RANGE_DETAIL_MICROSOFT_TEST
#include <boost/range/mfc.hpp> // can be placed first
#include <boost/config.hpp>
#include <map>
#include <boost/concept_check.hpp>
// #include <boost/foreach.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/concepts.hpp>
#include <boost/range/end.hpp>
#include <boost/static_assert.hpp>
#include <boost/algorithm/string.hpp>
#include <afx.h>
#include <afxcoll.h>
#include <afxtempl.h>
#if !(_ATL_VER < 0x0700)
#include <cstringt.h>
#include <atlsimpstr.h>
#include <atlstr.h>
#endif
namespace brdm = boost::range_detail_microsoft;
// helpers
//
template< class MfcMapT, class MapT >
bool test_mfc_map(MfcMapT& map, const MapT& sample)
void check_mfc()
{
typedef typename boost::range_iterator<MfcMapT>::type iter_t;
typedef typename boost::range_const_iterator<MapT>::type siter_t;
bool result = true;
result = result && (boost::distance(map) == boost::distance(sample));
if (!result)
return false;
{
for (iter_t it = boost::begin(map), last = boost::end(map); it != last; ++it) {
result = result && brdm::test_find_key_and_mapped(sample, *it);
}
}
{
for (siter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) {
result = result && (map[it->first] == it->second);
}
}
return result;
}
template< class MfcMapT, class MapT >
bool test_mfc_cpair_map(MfcMapT& map, const MapT& sample)
{
typedef typename boost::range_iterator<MfcMapT>::type iter_t;
typedef typename boost::range_const_iterator<MapT>::type siter_t;
bool result = true;
result = result && (boost::distance(map) == boost::distance(sample));
if (!result)
return false;
{
for (iter_t it = boost::begin(map), last = boost::end(map); it != last; ++it) {
result = result && brdm::test_find_key_and_mapped(sample, std::make_pair(it->key, it->value));
}
}
{
for (siter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) {
result = result && (map[it->first] == it->second);
}
}
return result;
}
// arrays
//
template< class Range >
void test_CByteArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CByteArray rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, BYTE *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, BYTE const*>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CDWordArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CDWordArray rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, DWORD *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, DWORD const*>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CObArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CObArray rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, brdm::mfc_ptr_array_iterator<rng_t, ::CObject *> >::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, brdm::mfc_ptr_array_iterator<const rng_t, const ::CObject *> >::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CPtrArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CPtrArray rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, brdm::mfc_ptr_array_iterator<rng_t, void *> >::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, brdm::mfc_ptr_array_iterator<const rng_t, const void *> >::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CStringArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CStringArray rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, ::CString *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, ::CString const *>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CUIntArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CUIntArray rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, UINT *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, UINT const *>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CWordArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CWordArray rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, WORD *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, WORD const *>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
// lists
//
template< class Range >
void test_CObList(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CObList rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator<rng_t, ::CObject *> >::value ));
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, ::CObject const *> >::value ));
#else
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, ::CObject const * const, ::CObject const * const> >::value ));
#endif
rng_t rng;
BOOST_CHECK( brdm::test_init_list(rng, sample) );
BOOST_CHECK( brdm::test_bidirectional(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CPtrList(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CPtrList rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator<rng_t, void *> >::value ));
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, void const *> >::value ));
#else
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, void const * const, void const * const> >::value ));
#endif
rng_t rng;
BOOST_CHECK( brdm::test_init_list(rng, sample) );
BOOST_CHECK( brdm::test_bidirectional(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CStringList(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CStringList rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator<rng_t, ::CString> >::value ));
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, ::CString const> >::value ));
#else
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, ::CString const, ::CString const> >::value ));
#endif
rng_t rng;
BOOST_CHECK( brdm::test_init_list(rng, sample) );
BOOST_CHECK( brdm::test_bidirectional(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
// maps
//
template< class MapT >
void test_CMapPtrToWord(const MapT& sample)
{
typedef ::CMapPtrToWord rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
BOOST_CHECK( ::test_mfc_map(rng, sample) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class MapT >
void test_CMapPtrToPtr(const MapT& sample)
{
typedef ::CMapPtrToPtr rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
BOOST_CHECK( ::test_mfc_map(rng, sample) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class MapT >
void test_CMapStringToOb(const MapT& sample)
{
typedef ::CMapStringToOb rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
BOOST_CHECK( ::test_mfc_map(rng, sample) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class MapT >
void test_CMapStringToPtr(const MapT& sample)
{
typedef ::CMapStringToPtr rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
BOOST_CHECK( ::test_mfc_map(rng, sample) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class MapT >
void test_CMapStringToString(const MapT& sample)
{
typedef ::CMapStringToString rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
BOOST_CHECK( ::test_mfc_cpair_map(rng, sample) );
#endif
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class MapT >
void test_CMapWordToOb(const MapT& sample)
{
typedef ::CMapWordToOb rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
BOOST_CHECK( ::test_mfc_map(rng, sample) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class MapT >
void test_CMapWordToPtr(const MapT& sample)
{
typedef ::CMapWordToPtr rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
BOOST_CHECK( ::test_mfc_map(rng, sample) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
// templates
//
template< class Range >
void test_CArray(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CArray<val_t, const val_t&> rng_t; // An old MFC needs the second template argument.
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, val_t *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, val_t const*>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_array(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class Range >
void test_CList(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CList<val_t, const val_t&> rng_t;
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator<rng_t, val_t> >::value ));
#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF)
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, val_t const> >::value ));
#else
BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator<rng_t const, val_t const, val_t const> >::value ));
#endif
rng_t rng;
BOOST_CHECK( brdm::test_init_list(rng, sample) );
BOOST_CHECK( brdm::test_bidirectional(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
template< class MapT >
void test_CMap(const MapT& sample)
{
typedef typename MapT::key_type k_t;
typedef typename MapT::mapped_type m_t;
typedef ::CMap<k_t, const k_t&, m_t, const m_t&> rng_t;
rng_t rng;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
BOOST_CHECK( brdm::test_init_map(rng, sample) );
#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
BOOST_CHECK( ::test_mfc_cpair_map(rng, sample) );
#endif
BOOST_CHECK( brdm::test_emptiness(rng) );
}
void test_CTypedPtrArray()
{
typedef ::CTypedPtrArray< ::CPtrArray, int * > rng_t;
boost::function_requires< boost::RandomAccessRangeConcept<rng_t> >();
rng_t rng;
int o1, o2, o3, o4, o5;
int *data[] = { &o1, &o2, &o3, &o4, &o5 };
BOOST_CHECK( brdm::test_init_array(rng, boost::make_iterator_range(data, data+5)) );
BOOST_CHECK( *(boost::begin(rng) + 2) == &o3 );
BOOST_CHECK( *(boost::end(rng) - 1) == &o5 );
// BOOST_CHECK( brdm::test_random_access(rng) ); this range is not mutable
BOOST_CHECK( brdm::test_emptiness(rng) );
}
void test_CTypedPtrList()
{
typedef ::CTypedPtrList< ::CObList, ::CObList * > rng_t;
boost::function_requires< boost::BidirectionalRangeConcept<rng_t> >();
rng_t rng;
::CObList o1, o2, o3, o4, o5;
::CObList *data[] = { &o1, &o2, &o3, &o4, &o5 };
BOOST_CHECK( brdm::test_init_list(rng, data) );
boost::range_iterator<rng_t>::type it = boost::begin(rng);
std::advance(it, 1);
BOOST_CHECK( *it == &o2 );
std::advance(it, 2);
BOOST_CHECK( *it == &o4 );
// BOOST_CHECK( brdm::test_bidirectional(rng) ); this range is not mutable
BOOST_CHECK( brdm::test_emptiness(rng) );
}
void test_CTypedPtrMap()
{
typedef ::CTypedPtrMap< ::CMapStringToPtr, ::CString, int *> rng_t;
boost::function_requires< boost::ForwardRangeConcept<rng_t> >();
rng_t rng;
::CString o0(_T('a')), o1(_T('c')), o2(_T('f')), o3(_T('q')), o4(_T('g'));
int d0, d1, d2, d3, d4;
std::map< ::CString, int * > data;
data[o0] = &d0, data[o1] = &d1, data[o2] = &d2, data[o3] = &d3, data[o4] = &d4;
BOOST_CHECK( brdm::test_init_map(rng, data) );
BOOST_CHECK( ::test_mfc_map(rng, data) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
// strings
//
#if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
template< class Range >
void test_CString(const Range& sample)
{
typedef typename boost::range_value<Range>::type val_t;
typedef ::CString rng_t; // An old MFC needs the second template argument.
BOOST_STATIC_ASSERT(( brdm::test_mutable_iter<rng_t, TCHAR *>::value ));
BOOST_STATIC_ASSERT(( brdm::test_const_iter <rng_t, TCHAR const*>::value ));
rng_t rng;
BOOST_CHECK( brdm::test_init_string(rng, sample) );
BOOST_CHECK( brdm::test_random_access(rng) );
BOOST_CHECK( brdm::test_emptiness(rng) );
}
#endif
struct CPerson
{
void hello_range() { };
};
void test_mfc()
{
#if 0
// overview
//
{
CTypedPtrArray<CPtrArray, CList<CString> *> myArray;
// ...
BOOST_FOREACH (CList<CString> *theList, myArray)
{
BOOST_FOREACH (CString& str, *theList)
{
boost::to_upper(str);
std::sort(boost::begin(str), boost::end(str));
// ...
}
}
}
#endif
// arrays
//
{
BYTE data[] = { 4,5,1,3,5,12,3,1,3,1,6,1,3,60,1,1,5,1,3,1,10 };
::test_CByteArray(boost::make_iterator_range(data, data+22));
}
{
DWORD data[] = { 4,5,1,3,5,12,3,1,3,1,6,1,3,60,1,1,5,1,3,1,10 };
test_CDWordArray(boost::make_iterator_range(data, data+22));
}
{
::CObArray o1, o2, o3, o4, o5;
::CObject *data[] = { &o1, &o2, &o3, &o4, &o5 };
::test_CObArray(boost::make_iterator_range(data, data+5));
}
{
::CPtrArray o1, o2, o3, o4, o5;
void *data[] = { &o1, &o2, &o3, &o4, &o5 };
::test_CPtrArray(boost::make_iterator_range(data, data+5));
}
{
::CString data[] = {
::CString(_T('0')), ::CString(_T('1')), ::CString(_T('2')), ::CString(_T('3')),
::CString(_T('4')), ::CString(_T('5')), ::CString(_T('6')), ::CString(_T('7'))
};
::test_CStringArray(boost::make_iterator_range(data, data+8));
}
{
::CUIntArray rng;
UINT data[] = { 4,5,1,3,5,12,3,1,3,1,6,1,3,60,1,1,5,1,3,1,10 };
::test_CUIntArray(boost::make_iterator_range(data, data+22));
}
{
::CWordArray rng;
WORD data[] = { 4,5,1,3,5,12,3,1,3,1,6,1,3,60,1,1,5,1,3,1,10 };
::test_CWordArray(boost::make_iterator_range(data, data+22));
}
CString s = "hello world";
BOOST_CHECK( boost::begin( s ) + boost::size( s ) == boost::end( s ) );
BOOST_CHECK( boost::size( s ) == boost::size( "hello world" ) );
BOOST_CHECK( !boost::empty( s ) );
const CString cs( s );
BOOST_CHECK( boost::begin( cs ) + boost::size( cs ) == boost::end( cs ) );
BOOST_CHECK( boost::size( cs ) == boost::size( "hello world" ) );
BOOST_CHECK( !boost::empty( cs ) );
// lists
//
{
::CObList rng;
::CObList o1, o2, o3, o4, o5;
::CObject *data[] = { &o1, &o2, &o3, &o4, &o5 };
CArray<int,int> a;
BOOST_CHECK( boost::empty( a ) );
a.Add( 5 );
a.Add( 10 );
BOOST_CHECK( boost::begin( a ) + boost::size( a ) == boost::end( a ) );
BOOST_CHECK( boost::size( a ) == 2 );
BOOST_CHECK( !boost::empty( a ) );
const CArray<int,int>& ca = a;
BOOST_CHECK( boost::begin( ca ) + boost::size( ca ) == boost::end( ca ) );
BOOST_CHECK( boost::size( ca ) == 2 );
BOOST_CHECK( !boost::empty( ca ) );
}
::test_CObList(boost::make_iterator_range(data, data+5));
}
{
::CPtrList rng;
::CPtrList o1, o2, o3, o4, o5;
void *data[] = { &o1, &o2, &o3, &o4, &o5 };
::test_CPtrList(boost::make_iterator_range(data, data+5));
}
{
::CString data[] = {
::CString(_T('0')), ::CString(_T('1')), ::CString(_T('2')), ::CString(_T('3')),
::CString(_T('4')), ::CString(_T('5')), ::CString(_T('6')), ::CString(_T('7'))
};
::test_CStringList(boost::make_iterator_range(data, data+8));
}
// maps
//
{
std::map<void *, WORD> data;
int o0, o1, o2, o3, o4;
data[&o0] = 15, data[&o1] = 14, data[&o2] = 3, data[&o3] = 6, data[&o4] = 1;
::test_CMapPtrToWord(data);
}
{
std::map<void *, void*> data;
int o0, o1, o2, o3, o4;
data[&o0] = &o3, data[&o1] = &o2, data[&o2] = &o1, data[&o3] = &o0, data[&o4] = &o4;
::test_CMapPtrToPtr(data);
}
{
std::map< ::CString, CObject * > data;
CObArray o0, o1, o2, o3, o4;
data[ ::CString('0') ] = &o0, data[ ::CString('1') ] = &o1, data[ ::CString('2') ] = &o2,
data[ ::CString('3') ] = &o3, data[ ::CString('4') ] = &o4;
::test_CMapStringToOb(data);
}
{
std::map< ::CString, void * > data;
CObArray o0, o1, o2, o3, o4;
data[ ::CString('0') ] = &o0, data[ ::CString('1') ] = &o1, data[ ::CString('2') ] = &o2,
data[ ::CString('3') ] = &o3, data[ ::CString('4') ] = &o4;
::test_CMapStringToPtr(data);
}
{
std::map< ::CString, ::CString > data;
CString o0('a'), o1('b'), o2('c'), o3('d'), o4('e');
data[ ::CString('0') ] = o0, data[ ::CString('1') ] = o1, data[ ::CString('2') ] = o2,
data[ ::CString('3') ] = o3, data[ ::CString('4') ] = o4;
::test_CMapStringToString(data);
}
{
std::map< WORD, CObject * > data;
::CDWordArray o0, o1, o2, o3, o4;
data[21] = &o3, data[52] = &o2, data[12] = &o1, data[76] = &o0, data[54] = &o4;
::test_CMapWordToOb(data);
}
{
std::map< WORD, void * > data;
::CDWordArray o0, o1, o2, o3, o4;
data[21] = &o3, data[52] = &o2, data[12] = &o1, data[76] = &o0, data[54] = &o4;
::test_CMapWordToPtr(data);
}
// templates
//
{
std::string data("0987654321qwertyuiop");
::test_CArray(data);
::test_CList(data);
}
{
std::wstring data(L"asdfghjklzxcvbnm");
::test_CArray(data);
::test_CList(data);
}
{
std::map< int, std::string > data;
data[0] = "abcde", data[1] = "ajfie", data[2] = "lij", data[3] = "abc", data[4] = "ioiu";
::test_CMap(data);
}
// typed
//
{
::test_CTypedPtrArray();
::test_CTypedPtrList();
::test_CTypedPtrMap();
}
// strings
//
#if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING)
{
std::string data("123456789 abcdefghijklmn");
::test_CString(data);
}
#endif
} // test_mfc
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;
test_suite *
init_unit_test_suite(int argc, char* argv[])
test_suite* init_unit_test_suite( int argc, char* argv[] )
{
test_suite *test = BOOST_TEST_SUITE("MFC Range Test Suite");
test->add(BOOST_TEST_CASE(&test_mfc));
test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" );
test->add( BOOST_TEST_CASE( &check_mfc ) );
(void)argc, (void)argv; // unused
return test;
}

View File

@@ -17,15 +17,18 @@
#endif
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
//#define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION 1
#include <boost/range/iterator.hpp>
#include <boost/range/const_iterator.hpp>
#include <boost/range/size_type.hpp>
#include <boost/range/value_type.hpp>
#include <boost/range/difference_type.hpp>
#include <boost/range/result_iterator.hpp>
#include <boost/range/functions.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/size.hpp>
#include <boost/range/empty.hpp>
#include <boost/range/detail/sfinae.hpp>
#include <boost/static_assert.hpp>
@@ -87,13 +90,6 @@ void check_partial_workaround()
}
#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
void check_partial_workaround()
{
}
#endif
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;
@@ -106,3 +102,18 @@ test_suite* init_unit_test_suite( int argc, char* argv[] )
return test;
}
#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;
test_suite* init_unit_test_suite( int, char** )
{
test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" );
return test;
}
#endif

View File

@@ -23,7 +23,6 @@
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
#include <boost/test/test_tools.hpp>
#include <boost/test/unit_test.hpp>
#include <vector>
#include <algorithm>
@@ -32,7 +31,7 @@ using namespace std;
void check_iterator()
{
typedef vector<int> vec_t;
typedef vector<char> vec_t;
typedef vec_t::iterator iterator;
typedef pair<iterator,iterator> pair_t;
typedef range_reverse_iterator<pair_t>::type rev_iterator;
@@ -41,8 +40,15 @@ void check_iterator()
vec_t vec;
pair_t p = make_pair( vec.begin(), vec.end() );
rev_pair_t rp = make_pair( rbegin( p ), rend( p ) );
int a[] = {1,2,3,4,5,6,7,8,9,10};
const int ca[] = {1,2,3,4,5,6,7,8,9,10,11,12};
char* str = "mutable";
const char* cstr = "not mutable";
char a[] = "mutable";
const char ca[] = "not mutable";
wchar_t* wstr = L"mutable";
const wchar_t* cwstr= L"not mutable";
wchar_t wa[] = L"mutable";
const wchar_t cwa[]= L"not mutable";
BOOST_CHECK( rbegin( vec ) == range_reverse_iterator<vec_t>::type( vec.end() ) );
BOOST_CHECK( rend( vec ) == range_reverse_iterator<vec_t>::type( vec.begin() ) );
BOOST_CHECK( std::distance( rbegin( vec ), rend( vec ) ) == std::distance( begin( vec ), end( vec ) ) );
@@ -52,16 +58,33 @@ void check_iterator()
BOOST_CHECK( std::distance( rbegin( p ), rend( p ) ) == std::distance( begin( rp ), end( rp ) ) );
BOOST_CHECK( std::distance( begin( p ), end( p ) ) == std::distance( rbegin( rp ), rend( rp ) ) );
BOOST_CHECK_EQUAL( &*begin( str ), &*( rend( str ) - 1 ) );
BOOST_CHECK_EQUAL( &*( end( str ) - 1 ), &*rbegin( str ) );
BOOST_CHECK_EQUAL( &*begin( cstr ), &*( rend( cstr ) - 1 ) );
BOOST_CHECK_EQUAL( &*( end( cstr ) - 1 ), &*rbegin( cstr ) );
BOOST_CHECK_EQUAL( &*begin( a ), &*( rend( a ) - 1 ) );
BOOST_CHECK_EQUAL( &*( end( a ) - 1 ), &*rbegin( a ) );
BOOST_CHECK_EQUAL( &*begin( ca ), &*( rend( ca ) - 1 ) );
BOOST_CHECK_EQUAL( &*( end( ca ) - 1 ), &*rbegin( ca ) );
BOOST_CHECK_EQUAL( &*begin( wstr ), &*( rend( wstr ) - 1 ) );
BOOST_CHECK_EQUAL( &*( end( wstr ) - 1 ), &*rbegin( wstr ) );
BOOST_CHECK_EQUAL( &*begin( cwstr ), &*( rend( cwstr ) - 1 ) );
BOOST_CHECK_EQUAL( &*( end( cwstr ) - 1 ), &*rbegin( cwstr ) );
BOOST_CHECK_EQUAL( &*begin( wa ), &*( rend( wa ) - 1 ) );
BOOST_CHECK_EQUAL( &*( end( wa ) - 1 ), &*rbegin( wa ) );
BOOST_CHECK_EQUAL( &*begin( cwa ), &*( rend( cwa ) - 1 ) );
BOOST_CHECK_EQUAL( &*( end( cwa ) - 1 ), &*rbegin( cwa ) );
}
#include <boost/test/unit_test.hpp>
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" );

View File

@@ -35,13 +35,15 @@ void check_std_container()
BOOST_STATIC_ASSERT(( is_same< range_value<vec_t>::type, vec_t::value_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<vec_t>::type, vec_t::iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const vec_t>::type, vec_t::const_iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_const_iterator<vec_t>::type, vec_t::const_iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_difference<vec_t>::type, vec_t::difference_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<vec_t>::type, vec_t::size_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<vec_t>::type, vec_t::iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const vec_t>::type, vec_t::const_iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<vec_t>::type, vec_t::iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const vec_t>::type, vec_t::const_iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_value<const vec_t>::type, vec_t::value_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const vec_t>::type, vec_t::iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_const_iterator<const vec_t>::type, vec_t::const_iterator >::value ));
BOOST_STATIC_ASSERT(( is_same< range_difference<const vec_t>::type, vec_t::difference_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<const vec_t>::type, vec_t::size_type >::value ));

View File

@@ -17,10 +17,7 @@
# pragma warn -8057 // unused argument argc/argv in Boost.Test
#endif
#include <boost/range/as_array.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/range/functions.hpp>
#include <boost/range/metafunctions.hpp>
#include <boost/range.hpp>
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
#include <boost/test/test_tools.hpp>
@@ -29,66 +26,36 @@
#include <fstream>
#include <algorithm>
template< class T >
inline BOOST_DEDUCED_TYPENAME boost::range_iterator<T>::type
str_begin( T& r )
{
return boost::begin( boost::as_literal(r) );
}
template< class T >
inline BOOST_DEDUCED_TYPENAME boost::range_iterator<T>::type
str_end( T& r )
{
return boost::end( boost::as_literal(r) );
}
template< class T >
inline BOOST_DEDUCED_TYPENAME boost::range_size<T>::type
str_size( const T& r )
{
return boost::size( boost::as_literal(r) );
}
template< class T >
inline bool
str_empty( T& r )
{
return boost::empty( boost::as_literal(r) );
}
template< typename Container, typename T >
BOOST_DEDUCED_TYPENAME boost::range_iterator<Container>::type
find( Container& c, T value )
{
return std::find( str_begin(c), str_end(c),
value );
return std::find( boost::begin( c ), boost::end( c ), value );
}
template< typename Container, typename T >
BOOST_DEDUCED_TYPENAME boost::range_iterator<const Container>::type
BOOST_DEDUCED_TYPENAME boost::range_const_iterator<Container>::type
find( const Container& c, T value )
{
return std::find( str_begin(c), str_end(c),
value );
return std::find( boost::begin( c ), boost::end( c ), value );
}
template< typename Container, typename T >
BOOST_DEDUCED_TYPENAME boost::range_iterator<Container>::type
find_mutable( Container& c, T value )
{
str_size( c );
return std::find( str_begin(c), str_end(c),
value );
{
boost::size( c );
boost::end( c );
return std::find( boost::begin( c ), boost::end( c ), value );
}
template< typename Container, typename T >
BOOST_DEDUCED_TYPENAME boost::range_iterator<const Container>::type
BOOST_DEDUCED_TYPENAME boost::range_const_iterator<Container>::type
find_const( const Container& c, T value )
{
str_size( c );
return std::find( str_begin(c), str_end(c),
value );
boost::size( c );
boost::end( c );
return std::find( boost::begin( c ), boost::end( c ), value );
}
@@ -105,66 +72,62 @@ void check_char()
{
typedef char* char_iterator_t;
typedef char char_array_t[10];
const char* char_s = "a string";
char my_string[] = "another string";
const char my_const_string[] = "another string";
const unsigned my_string_length = 14;
char* char_s2 = "a string";
const char* char_s = "a string";
char my_string[] = "another string";
const unsigned my_string_length = 14;
char* char_s2 = "a string";
BOOST_STATIC_ASSERT(( is_same< range_value<char_iterator_t>::type,
detail::iterator_traits<char_iterator_t>::value_type>::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<char_iterator_t>::type, char_iterator_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_const_iterator<char_iterator_t>::type, const char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_difference<char_iterator_t>::type,
::std::ptrdiff_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<char_iterator_t>::type, std::size_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<char_iterator_t>::type, char_iterator_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const char*>::type, const char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<char_iterator_t>::type, char_iterator_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const char*>::type, const char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_value<char_array_t>::type,
char>::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<char_array_t>::type, char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const char_array_t>::type, const char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_const_iterator<char_array_t>::type, const char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_difference<char_array_t>::type,
::std::ptrdiff_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<char_array_t>::type, std::size_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<char_array_t>::type, char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const char_array_t>::type, const char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<char_array_t>::type, char* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const char_array_t>::type, const char* >::value ));
BOOST_CHECK_EQUAL( str_begin( char_s ), char_s );
std::size_t sz = str_size(char_s);
const char* str_end1 = str_begin( char_s ) + sz;
BOOST_CHECK_EQUAL( str_end( char_s ), str_end1 );
BOOST_CHECK_EQUAL( str_empty( char_s ), (char_s == 0 || char_s[0] == char()) );
BOOST_CHECK_EQUAL( begin( char_s ), char_s );
std::size_t sz = size( char_s );
const char* end1 = begin( char_s ) + sz;
BOOST_CHECK_EQUAL( end( char_s ), end1 );
BOOST_CHECK_EQUAL( empty( char_s ), (char_s == 0 || char_s[0] == char()) );
BOOST_CHECK_EQUAL( sz, std::char_traits<char>::length( char_s ) );
/*
BOOST_CHECK_EQUAL( str_begin( char_s2 ), char_s2 );
BOOST_CHECK_EQUAL( begin( char_s2 ), char_s2 );
std::size_t sz2 = size( char_s2 );
const char* str_end12 = str_begin( char_s2 ) + sz;
BOOST_CHECK_EQUAL( str_end( char_s2 ), str_end12 );
const char* end12 = begin( char_s2 ) + sz;
BOOST_CHECK_EQUAL( end( char_s2 ), end12 );
BOOST_CHECK_EQUAL( empty( char_s2 ), (char_s2 == 0 || char_s2[0] == char()) );
BOOST_CHECK_EQUAL( sz2, std::char_traits<char>::length( char_s2 ) );
*/
BOOST_CHECK_EQUAL( str_begin( my_string ), my_string );
range_iterator<char_array_t>::type str_end2 = str_begin( my_string ) + str_size(my_string);
range_iterator<char_array_t>::type str_end3 = str_end(my_string);
BOOST_CHECK_EQUAL( str_end3, str_end2 );
BOOST_CHECK_EQUAL( str_empty( my_string ), (my_string == 0 || my_string[0] == char()) );
BOOST_CHECK_EQUAL( str_size( my_string ), my_string_length );
BOOST_CHECK_EQUAL( str_size( my_string ), std::char_traits<char>::length( my_string ) );
BOOST_CHECK_EQUAL( begin( my_string ), my_string );
range_iterator<char_array_t>::type end2 = begin( my_string ) + size( my_string );
range_iterator<char_array_t>::type end3 = end( my_string );
BOOST_CHECK_EQUAL( end3, end2 );
BOOST_CHECK_EQUAL( empty( my_string ), (my_string == 0 || my_string[0] == char()) );
BOOST_CHECK_EQUAL( size( my_string ), my_string_length );
BOOST_CHECK_EQUAL( size( my_string ), std::char_traits<char>::length( my_string ) );
char to_search = 'n';
BOOST_CHECK( find_mutable( char_s, to_search ) != str_end( char_s ) );
BOOST_CHECK( find_const( char_s, to_search ) != str_end(char_s) );
BOOST_CHECK( find_mutable( char_s, to_search ) != end( char_s ) );
BOOST_CHECK( find_const( char_s, to_search ) != end( char_s ) );
BOOST_CHECK( find_mutable( my_string, to_search ) != str_end(my_string) );
BOOST_CHECK( find_const( my_string, to_search ) != str_end(my_string) );
BOOST_CHECK( find_mutable( my_string, to_search ) != end( my_string ) );
BOOST_CHECK( find_const( my_string, to_search ) != end( my_string ) );
BOOST_CHECK( find_mutable( char_s2, to_search ) != str_end(char_s) );
BOOST_CHECK( find_const( char_s2, to_search ) != str_end(char_s2) );
BOOST_CHECK( find_const( as_array( my_string ), to_search ) != str_end(my_string) );
BOOST_CHECK( find_const( as_array( my_const_string ), to_search ) != str_end(my_string) );
BOOST_CHECK( find_mutable( char_s2, to_search ) != end( char_s2 ) );
BOOST_CHECK( find_const( char_s2, to_search ) != end( char_s2 ) );
}
@@ -185,31 +148,31 @@ void check_string()
BOOST_STATIC_ASSERT(( is_same< range_value<wchar_iterator_t>::type,
detail::iterator_traits<wchar_iterator_t>::value_type>::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<wchar_iterator_t>::type, wchar_iterator_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const wchar_t*>::type, const wchar_t* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_const_iterator<wchar_iterator_t>::type, const wchar_t* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_difference<wchar_iterator_t>::type,
detail::iterator_traits<wchar_iterator_t>::difference_type >::value ));
BOOST_STATIC_ASSERT(( is_same< range_size<wchar_iterator_t>::type, std::size_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<wchar_iterator_t>::type, wchar_iterator_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_iterator<const wchar_t*>::type, const wchar_t* >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<wchar_iterator_t>::type, wchar_iterator_t >::value ));
BOOST_STATIC_ASSERT(( is_same< range_result_iterator<const wchar_t*>::type, const wchar_t* >::value ));
std::size_t sz = str_size( char_ws );
BOOST_CHECK_EQUAL( str_begin( char_ws ), char_ws );
BOOST_CHECK_EQUAL( str_end(char_ws), (str_begin( char_ws ) + sz) );
BOOST_CHECK_EQUAL( str_empty( char_ws ), (char_ws == 0 || char_ws[0] == wchar_t()) );
std::size_t sz = size( char_ws );
BOOST_CHECK_EQUAL( begin( char_ws ), char_ws );
BOOST_CHECK_EQUAL( end( char_ws ), (begin( char_ws ) + sz) );
BOOST_CHECK_EQUAL( empty( char_ws ), (char_ws == 0 || char_ws[0] == wchar_t()) );
BOOST_CHECK_EQUAL( sz, std::char_traits<wchar_t>::length( char_ws ) );
/*
std::size_t sz2 = size( char_ws2 );
BOOST_CHECK_EQUAL( str_begin( char_ws2 ), char_ws2 );
BOOST_CHECK_EQUAL( str_end( char_ws2 ), (begin( char_ws2 ) + sz2) );
BOOST_CHECK_EQUAL( begin( char_ws2 ), char_ws2 );
BOOST_CHECK_EQUAL( end( char_ws2 ), (begin( char_ws2 ) + sz2) );
BOOST_CHECK_EQUAL( empty( char_ws2 ), (char_ws2 == 0 || char_ws2[0] == wchar_t()) );
BOOST_CHECK_EQUAL( sz2, std::char_traits<wchar_t>::length( char_ws2 ) );
*/
wchar_t to_search = L'n';
BOOST_CHECK( find( char_ws, to_search ) != str_end(char_ws) );
BOOST_CHECK( find( char_ws, to_search ) != end( char_ws ) );
#if BOOST_WORKAROUND(_MSC_VER, BOOST_TESTED_AT(1300))
BOOST_CHECK( find( my_wstring, to_search ) != str_end(my_wstring) );
BOOST_CHECK( find( my_wstring, to_search ) != end( my_wstring ) );
#endif
#endif
@@ -218,6 +181,7 @@ void check_string()
}
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;

View File

@@ -17,7 +17,6 @@
#endif
#include <boost/range/sub_range.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/test/test_tools.hpp>
#include <iostream>
#include <string>
@@ -91,32 +90,28 @@ void check_sub_range()
s.empty();
r.size();
s.size();
irange singular_irange;
BOOST_CHECK( singular_irange.empty() );
BOOST_CHECK( singular_irange.size() == 0 );
srange singular_srange;
BOOST_CHECK( singular_srange.empty() );
BOOST_CHECK( singular_srange.size() == 0 );
//
// As of range v2 not legal anymore.
//
//irange singular_irange;
//BOOST_CHECK( singular_irange.empty() );
//BOOST_CHECK( singular_irange.size() == 0 );
//
//srange singular_srange;
//BOOST_CHECK( singular_srange.empty() );
//BOOST_CHECK( singular_srange.size() == 0 );
//
//BOOST_CHECK( empty( singular_irange ) );
//BOOST_CHECK( empty( singular_srange ) );
//
BOOST_CHECK( empty( singular_irange ) );
BOOST_CHECK( empty( singular_srange ) );
srange rr = make_iterator_range( str );
BOOST_CHECK( rr.equal( r ) );
rr = make_iterator_range( str.begin(), str.begin() + 5 );
BOOST_CHECK( rr == as_literal("hello") );
BOOST_CHECK( rr != as_literal("hell") );
BOOST_CHECK( rr < as_literal("hello dude") );
BOOST_CHECK( as_literal("hello") == rr );
BOOST_CHECK( as_literal("hell") != rr );
BOOST_CHECK( ! (as_literal("hello dude") < rr ) );
BOOST_CHECK( rr == "hello" );
BOOST_CHECK( rr != "hell" );
BOOST_CHECK( rr < "hello dude" );
BOOST_CHECK( "hello" == rr );
BOOST_CHECK( "hell" != rr );
BOOST_CHECK( ! ("hello dude" < rr ) );
irange rrr = rr;
BOOST_CHECK( rrr == rr );
@@ -127,16 +122,15 @@ void check_sub_range()
BOOST_CHECK_EQUAL( cr.front(), 'h' );
BOOST_CHECK_EQUAL( cr.back(), 'd' );
BOOST_CHECK_EQUAL( cr[1], 'e' );
BOOST_CHECK_EQUAL( cr(1), 'e' );
rrr = make_iterator_range( str, 1, -1 );
BOOST_CHECK( rrr == as_literal("ello worl") );
BOOST_CHECK( rrr == "ello worl" );
rrr = make_iterator_range( rrr, -1, 1 );
BOOST_CHECK( rrr == str );
rrr.front() = 'H';
rrr.back() = 'D';
rrr[1] = 'E';
BOOST_CHECK( rrr == as_literal("HEllo worlD") );
BOOST_CHECK( rrr == "HEllo worlD" );
}
#include <boost/test/unit_test.hpp>