2004-07-30 01:30:27 +00:00
|
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
|
|
|
|
|
|
|
<html>
|
|
|
|
<head>
|
2004-08-10 09:56:55 +00:00
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
|
|
|
<title>Boost.Range Utilities </title>
|
|
|
|
<link rel="stylesheet" href="style.css" type="text/css">
|
2004-07-30 01:30:27 +00:00
|
|
|
</head>
|
|
|
|
|
2004-08-10 09:56:55 +00:00
|
|
|
<body>
|
|
|
|
<table border="0" >
|
|
|
|
<tr>
|
2004-10-05 15:45:52 +00:00
|
|
|
<td ><img src="../../../boost.png" border="0" ></td>
|
2004-08-10 09:56:55 +00:00
|
|
|
<td ><h1 align="center">Boost.Range</h1></td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
|
|
|
|
<h2>Utilities</h2>
|
|
|
|
<p>
|
|
|
|
Having an abstraction that encapsulates a pair of iterators is very useful. The
|
|
|
|
standard library uses <code>std::pair</code> in some circumstances, but that
|
|
|
|
class is cumbersome to use because we need to specify two template arguments,
|
|
|
|
and for all range algorithm purposes we must enforce the two template arguments
|
|
|
|
to be the same. Moreover, <code>std::pair<iterator,iterator></code> is hardly
|
|
|
|
self-documenting whereas more domain specific class names are. Therefore these
|
|
|
|
two classes are provided:
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
<li>
|
2008-05-11 13:49:20 +00:00
|
|
|
Class <a href="#iter_range"><code>iterator_range</code></a>
|
2004-08-10 09:56:55 +00:00
|
|
|
<li>
|
2008-05-11 13:49:20 +00:00
|
|
|
Class <a href="#sub_range"><code>sub_range</code></a>
|
2004-08-10 09:56:55 +00:00
|
|
|
</ul>
|
|
|
|
|
2008-01-12 12:38:57 +00:00
|
|
|
The <code>iterator_range</code> class is templated on a <a
|
|
|
|
href="../../iterator/doc/new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators">Forward
|
2004-08-10 09:56:55 +00:00
|
|
|
Traversal Iterator</a> and should be used whenever fairly general code is needed.
|
2008-01-12 12:38:57 +00:00
|
|
|
The <code>sub_range</code> class is templated on a <a
|
|
|
|
href="range.html#forward_range">Forward Range</a> and it is less general,
|
|
|
|
but a bit easier to use since its template
|
2004-08-12 10:58:13 +00:00
|
|
|
argument is easier to specify. The biggest difference is, however, that a
|
|
|
|
<code>sub_range</code> can propagate constness because it knows what a
|
|
|
|
corresponding <code>const_iterator</code> is. </p>
|
|
|
|
|
|
|
|
<p>
|
|
|
|
Both classes can be used as ranges since they implement the <a
|
|
|
|
href="boost_range.html#minimal_interface">minimal interface</a>
|
|
|
|
required for this to work automatically.
|
2004-08-10 09:56:55 +00:00
|
|
|
</p>
|
|
|
|
|
|
|
|
<hr>
|
|
|
|
<a name=iter_range></a> <h1>Class <code>iterator_range</code></h1>
|
2004-08-12 10:58:13 +00:00
|
|
|
<p>
|
2004-08-10 09:56:55 +00:00
|
|
|
The intention of the <code>iterator_range</code> class is to encapsulate two
|
|
|
|
iterators so they fulfill the <a
|
2004-08-16 22:47:16 +00:00
|
|
|
href="range.html#forward_range">Forward Range</a> concept. A few other
|
2004-08-24 15:58:01 +00:00
|
|
|
functions are also provided for convenience.
|
2004-08-12 10:58:13 +00:00
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
If the template argument is not a model of Forward Traversal Iterator, one can
|
|
|
|
still use a subset of the interface. In particular, <code>size()</code> requires
|
2007-11-09 10:27:42 +00:00
|
|
|
Random Access Iterators whereas <code>empty()</code> only requires Single
|
2004-08-12 10:58:13 +00:00
|
|
|
Pass Iterators.
|
|
|
|
</p>
|
2004-08-10 09:56:55 +00:00
|
|
|
|
2004-08-24 15:58:01 +00:00
|
|
|
<p>
|
|
|
|
Recall that many default constructed iterators
|
|
|
|
are <i>singular</i> and hence can only be assigned, but not compared or
|
2007-11-09 10:27:42 +00:00
|
|
|
incremented or anything. Likewise, if one creates a default constructed
|
|
|
|
<code>iterator_range</code>, then one have to be careful about not doing
|
|
|
|
anything besides copying. </p>
|
2004-08-24 15:58:01 +00:00
|
|
|
|
2004-08-10 09:56:55 +00:00
|
|
|
<h3>Synopsis</h3>
|
|
|
|
|
|
|
|
<pre>
|
2004-08-12 10:58:13 +00:00
|
|
|
<span class=keyword>namespace </span><span class=identifier>boost</span>
|
|
|
|
<span class=special>{
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator </span><span class=special>>
|
|
|
|
</span><span class=keyword>class </span><span class=identifier>iterator_range
|
|
|
|
</span><span class=special>{
|
|
|
|
</span><span class=keyword>public</span><span class=special>: </span><span class=comment>// Forward Range types
|
2007-11-17 20:22:20 +00:00
|
|
|
</span><span class=keyword>typedef </span><span class=identifier>ForwardTraversalIterator </span><span class=identifier>iterator</span><span class=special>;
|
|
|
|
</span><span class=keyword>typedef </span><span class=identifier>ForwardTraversalIterator </span><span class=identifier>const_iterator</span><span class=special>;</span>
|
|
|
|
<span class=keyword>typedef </span><span class=identifier>iterator_difference</span><span class=special><</span><span class=identifier>iterator</span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>difference_type</span><span class=special>;</span>
|
|
|
|
|
2008-06-24 15:39:28 +00:00
|
|
|
<span class=keyword>public</span><span class=special>: </span><span class=comment>// construction, assignment
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator2 </span><span class=special>>
|
|
|
|
</span><span class=identifier>iterator_range</span><span class=special>( </span><span class=identifier>ForwardTraversalIterator2 </span><span class=identifier>Begin</span><span class=special>, </span><span class=identifier>ForwardTraversalIterator2 </span><span class=identifier>End </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=identifier>iterator_range</span><span class=special>( </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=identifier>iterator_range</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=identifier>iterator_range</span><span class=special>& </span><span class=keyword>operator</span><span class=special>=( </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=identifier>iterator_range</span><span class=special>& </span><span class=keyword>operator</span><span class=special>=( </span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>public</span><span class=special>: </span><span class=comment>// Forward Range functions
|
2007-11-17 20:22:20 +00:00
|
|
|
</span><span class=identifier>iterator </span><span class=identifier>begin</span><span class=special>() </span><span class=keyword>const</span><span class=special>;
|
|
|
|
</span><span class=identifier>iterator </span><span class=identifier>end</span><span class=special>() </span><span class=keyword>const</span><span class=special>;
|
|
|
|
</span><span class=identifier>difference_type </span><span class=identifier>size</span><span class=special>() </span><span class=keyword>const</span><span class=special>;
|
|
|
|
</span><span class=keyword>bool </span><span class=identifier>empty</span><span class=special>() </span><span class=keyword>const</span><span class=special>;
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>public</span><span class=special>: </span><span class=comment>// convenience
|
2007-11-17 20:22:20 +00:00
|
|
|
</span><span class=keyword>operator </span><a href="#unspecified_bool"><span class=identifier>unspecified_bool_type</span></a><span class=special>() </span><span class=keyword>const</span><span class=special>;
|
|
|
|
</span> <span class=keyword>bool</span> <span
|
2004-09-10 21:37:53 +00:00
|
|
|
class=identifier><a href="#equal">equal</a></span><span
|
2008-06-24 15:39:28 +00:00
|
|
|
class=special>( </span><span class=keyword>const</span> <span class=identifier>iterator_range</span><span class=special>& ) </span><span
|
2004-09-10 21:37:53 +00:00
|
|
|
class=keyword>const;</span>
|
2007-11-17 20:22:20 +00:00
|
|
|
<span class=identifier>reference </span><span class=identifier>front</span><span class=special>() </span><span class=keyword>const</span><span class=special>;</span>
|
|
|
|
<span class=identifier>reference </span><span class=identifier>back</span><span class=special>() </span><span class=keyword>const</span><span class=special>;</span>
|
|
|
|
<span class=identifier>iterator_range</span><span class=special>&</span> <span class=identifier>advance_begin</span><span class=special>(</span> <span class=identifier>difference_type</span> <span class=identifier>n</span> <span class=special>);</span>
|
|
|
|
<span class=identifier>iterator_range</span><span class=special>&</span> <span class=identifier>advance_end</span><span class=special>(</span> <span class=identifier>difference_type</span> <span class=identifier>n</span> <span class=special>);</span>
|
2005-02-05 21:33:29 +00:00
|
|
|
<span class=comment>// for Random Access Range only: </span>
|
2007-11-17 20:22:20 +00:00
|
|
|
<span class=identifier>reference </span><span class=keyword>operator</span><span class=special>[]( </span><span class=identifier>difference_type </span><span class=identifier>at </span><span class=special>) </span><span class=keyword>const</span><span class=special>;</span>
|
|
|
|
<span class=identifier>value_type</span> <span class=keyword>operator</span><span class=special>()( </span><span class=identifier>difference_type </span><span class=identifier>at </span><span class=special>) </span><span class=keyword>const</span><span class=special>;</span>
|
2008-06-24 15:39:28 +00:00
|
|
|
<span class=special>};
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=comment>// stream output
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>T</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>Traits </span><span class=special>>
|
|
|
|
</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>basic_ostream</span><span class=special><</span><span class=identifier>T</span><span class=special>,</span><span class=identifier>Traits</span><span class=special>>&
|
|
|
|
</span><span class=keyword>operator</span><span class=special><<( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>basic_ostream</span><span class=special><</span><span class=identifier>T</span><span class=special>,</span><span class=identifier>Traits</span><span class=special>>& </span><span class=identifier>Os</span><span class=special>,
|
2004-09-10 21:37:53 +00:00
|
|
|
</span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>r </span><span class=special>);
|
2004-08-12 10:58:13 +00:00
|
|
|
|
2004-09-10 21:37:53 +00:00
|
|
|
</span><span class=comment>// <a href="#comparison">comparison</a>
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator2 </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special>==( </span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator2</span><span class=special>>& </span><span class=identifier>r </span><span class=special>);
|
2004-09-10 21:37:53 +00:00
|
|
|
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special>==( </span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
|
|
|
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special>==( </span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>r </span><span class=special>);
|
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator2 </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special>!=( </span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator2</span><span class=special>>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-09-10 21:37:53 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special>!=( </span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
|
|
|
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special>!=( </span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>r </span><span class=special>);
|
|
|
|
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator2 </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special><( </span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator2</span><span class=special>>& </span><span class=identifier>r </span><span class=special>);
|
|
|
|
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special><( </span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
|
|
|
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=keyword>bool </span><span class=keyword>operator</span><span class=special><( </span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>l</span><span class=special>,
|
|
|
|
</span><span class=keyword>const </span><span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>ForwardTraversalIterator</span><span class=special>>& </span><span class=identifier>r </span><span class=special>);</span>
|
|
|
|
|
2008-06-24 15:39:28 +00:00
|
|
|
<span class=comment>// external construction
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator </span><span class=special>>
|
|
|
|
</span><span class=identifier>iterator_range</span><span class=special>< </span><span class=identifier>ForwardTraversalIterator </span><span class=special>>
|
|
|
|
</span><span class=identifier>make_iterator_range</span><span class=special>( </span><span class=identifier>ForwardTraversalIterator </span><span class=identifier>Begin</span><span class=special>,
|
|
|
|
</span><span class=identifier>ForwardTraversalIterator </span><span class=identifier>End </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
2007-11-17 20:22:20 +00:00
|
|
|
</span><span class=identifier>iterator_range</span><span class=special>< </span><span class=keyword>typename </span><span class=identifier>range_iterator</span><span class=special><</span><span class=identifier>ForwardRange</span><span class=special>>::</span><span class=identifier>type </span><span class=special>>
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=identifier>make_iterator_range</span><span class=special>( </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
2007-11-17 20:22:20 +00:00
|
|
|
</span><span class=identifier>iterator_range</span><span class=special>< </span><span class=keyword>typename </span><span class=identifier>range_iterator</span><span class=special><</span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>>::</span><span class=identifier>type </span><span class=special>>
|
2004-08-12 10:58:13 +00:00
|
|
|
</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>& </span><span class=identifier>r </span><span class=special>);
|
2005-02-05 21:33:29 +00:00
|
|
|
</span>
|
|
|
|
<span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>Range </span><span class=special>></span>
|
|
|
|
<span class=identifier>iterator_range</span><span class=special>< </span><span class=keyword>typename </span><span class=identifier>range_iterator</span><span class=special><</span><span class=identifier>Range</span><span class=special>>::</span><span class=identifier>type </span><span class=special>></span>
|
|
|
|
<span class=identifier><a href="#make_iterator_range">make_iterator_range</a></span><span class=special>(</span><span class=identifier> Range</span><span class=special>& </span><span class=identifier>r</span><span class=special>,
|
|
|
|
</span><span class=keyword>typename </span><span class=identifier>range_difference</span><span class=special><</span><span class=identifier>Range</span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>advance_begin</span><span class=special>,
|
|
|
|
</span><span class=keyword>typename </span><span class=identifier>range_difference</span><span class=special><</span><span class=identifier>Range</span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>advance_end </span><span class=special>);
|
|
|
|
</span>
|
|
|
|
<span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>Range </span><span class=special>></span>
|
2007-11-17 20:22:20 +00:00
|
|
|
<span class=identifier>iterator_range</span><span class=special>< </span><span class=keyword>typename </span><span class=identifier>range_iterator</span><span class=special><</span><span class=keyword>const </span><span class=identifier>Range</span><span class=special>>::</span><span class=identifier>type </span><span class=special>></span>
|
2005-02-05 21:33:29 +00:00
|
|
|
<span class=identifier>make_iterator_range</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>Range</span><span class=special>& </span><span class=identifier>r</span><span class=special>,
|
|
|
|
</span><span class=keyword>typename </span><span class=identifier>range_difference</span><span class=special><</span><span class=identifier>Range</span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>advance_begin</span><span class=special>,
|
|
|
|
</span><span class=keyword>typename </span><span class=identifier>range_difference</span><span class=special><</span><span class=identifier>Range</span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>advance_end </span><span class=special>);</span>
|
|
|
|
|
2008-06-24 15:39:28 +00:00
|
|
|
<span class=comment>// convenience
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>Sequence</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
|
|
|
</span><span class=identifier>Sequence </span><a href="#copy_range"><span
|
|
|
|
class=identifier>copy_range</span></a><span class=special>( </span><span
|
|
|
|
class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2005-03-14 23:20:00 +00:00
|
|
|
</span>
|
2004-08-12 10:58:13 +00:00
|
|
|
<span class=special>} </span><span class=comment>// namespace 'boost'</span>
|
2004-08-10 09:56:55 +00:00
|
|
|
</pre>
|
2004-07-30 01:30:27 +00:00
|
|
|
|
|
|
|
<p>
|
2004-08-12 10:58:13 +00:00
|
|
|
If an instance of
|
2004-08-10 09:56:55 +00:00
|
|
|
<code>iterator_range</code> is constructed by a client with two iterators, the
|
|
|
|
client must ensure that the two iterators delimit a valid closed-open range
|
2004-07-30 01:30:27 +00:00
|
|
|
<code>[begin,end)</code>.
|
|
|
|
</p>
|
2004-08-12 10:58:13 +00:00
|
|
|
|
|
|
|
<p>
|
|
|
|
It is worth noticing that the templated constructors and assignment operators
|
|
|
|
allow conversion from <code>iterator_range<iterator></code> to
|
|
|
|
<code>iterator_range<const_iterator></code>. Similarly, since the comparison
|
|
|
|
operators have two template arguments, we can compare ranges whenever the
|
|
|
|
iterators are comparable; for example when we are dealing with const and
|
|
|
|
non-const iterators from the same container. </p>
|
2004-08-10 09:56:55 +00:00
|
|
|
|
|
|
|
<h3>Details member functions</h3>
|
|
|
|
|
2004-09-10 21:37:53 +00:00
|
|
|
<p>
|
2004-08-12 10:58:13 +00:00
|
|
|
<a name="unspecified_bool"></a>
|
|
|
|
<code>operator unspecified_bool_type() const; </code>
|
2004-08-10 09:56:55 +00:00
|
|
|
<blockquote>
|
2004-09-10 21:37:53 +00:00
|
|
|
<i>Returns</i> <code>!empty();</code>
|
|
|
|
</blockquote>
|
|
|
|
</p>
|
2004-08-10 09:56:55 +00:00
|
|
|
|
2004-09-10 21:37:53 +00:00
|
|
|
<p>
|
|
|
|
<a name="equal"></a>
|
2008-06-24 15:39:28 +00:00
|
|
|
<code>bool equal( iterator_range& r ) const;</code>
|
2004-09-10 21:37:53 +00:00
|
|
|
<blockquote>
|
2008-06-24 15:39:28 +00:00
|
|
|
<i>Returns</i> <code>begin() == r.begin() && end() == r.end();</code>
|
2004-09-10 21:37:53 +00:00
|
|
|
</blockquote>
|
|
|
|
</p>
|
|
|
|
|
2004-08-10 09:56:55 +00:00
|
|
|
<h3>Details functions</h3>
|
|
|
|
|
2004-09-10 21:37:53 +00:00
|
|
|
<p>
|
|
|
|
<a name="comparison"></a>
|
2008-06-24 15:39:28 +00:00
|
|
|
<code>bool operator==( const ForwardRange1& l, const ForwardRange2& r );</code>
|
2004-09-10 21:37:53 +00:00
|
|
|
<blockquote>
|
|
|
|
<i>Returns</i> <code>size(l) != size(r) ? false : std::equal( begin(l), end(l), begin(r) );</code> </blockquote> </p>
|
2008-06-24 15:39:28 +00:00
|
|
|
<code>bool operator!=( const ForwardRange1& l, const ForwardRange2& r );</code>
|
2004-09-10 21:37:53 +00:00
|
|
|
<blockquote>
|
|
|
|
<i>Returns</i> <code>!( l == r );</code>
|
|
|
|
</blockquote>
|
2008-06-24 15:39:28 +00:00
|
|
|
<code>bool operator<( const ForwardRange1& l, const ForwardRange2& r );</code>
|
2004-09-10 21:37:53 +00:00
|
|
|
<blockquote>
|
|
|
|
<i>Returns</i> <code>std::lexicographical_compare( begin(l), end(l), begin(r), end(r) );</code> </blockquote>
|
2005-02-05 21:33:29 +00:00
|
|
|
|
|
|
|
<p>
|
|
|
|
<a name="make_iterator_range"></a>
|
|
|
|
<pre>
|
2008-06-24 15:39:28 +00:00
|
|
|
iterator_range make_iterator_range( Range& r,
|
2005-02-05 21:33:29 +00:00
|
|
|
typename range_difference<Range>::type advance_begin,
|
|
|
|
typename range_difference<Range>::type advance_end );
|
|
|
|
</pre>
|
|
|
|
<blockquote>
|
|
|
|
<i>Effects</i>:
|
|
|
|
<pre>
|
|
|
|
iterator new_begin = begin( r ),
|
|
|
|
iterator new_end = end( r );
|
|
|
|
std::advance( new_begin, advance_begin );
|
|
|
|
std::advance( new_end, advance_end );
|
|
|
|
return make_iterator_range( new_begin, new_end );
|
|
|
|
</pre>
|
|
|
|
</blockquote>
|
2004-09-10 21:37:53 +00:00
|
|
|
<p>
|
2004-08-12 10:58:13 +00:00
|
|
|
<a name="copy_range"></a>
|
2008-06-24 15:39:28 +00:00
|
|
|
<code>Sequence copy_range( const ForwardRange& r );</code>
|
2004-09-11 22:01:30 +00:00
|
|
|
<blockquote>
|
|
|
|
<i>Returns</i> <code>Sequence( begin(r), end(r) );</code>
|
2004-08-10 09:56:55 +00:00
|
|
|
</blockquote>
|
2004-09-10 21:37:53 +00:00
|
|
|
</p>
|
|
|
|
|
2004-08-10 09:56:55 +00:00
|
|
|
<hr> <a name=sub_range></a>
|
|
|
|
<h1>Class <code>sub_range</code></h1>
|
|
|
|
|
|
|
|
The <code>sub_range</code> class inherits all its functionality
|
|
|
|
from the <a href="#iter_range"><code>iterator_range</code></a> class.
|
2004-07-30 01:30:27 +00:00
|
|
|
The <code>sub_range</code> class is often easier to use because
|
2004-08-10 09:56:55 +00:00
|
|
|
one must specify the <a href="range.html#forward_range">Forward Range</a>
|
2004-08-12 10:58:13 +00:00
|
|
|
template argument instead of an iterator. Moreover, the <code>sub_range</code>
|
|
|
|
class can propagate constness since it knows what a corresponding
|
|
|
|
<code>const_iterator</code> is.
|
|
|
|
|
2004-07-30 01:30:27 +00:00
|
|
|
<h3>Synopsis</h3>
|
|
|
|
|
|
|
|
<pre>
|
2004-08-12 10:58:13 +00:00
|
|
|
<span class=keyword>namespace </span><span class=identifier>boost</span>
|
|
|
|
<span class=special>{
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange </span><span class=special>>
|
2007-11-17 20:22:20 +00:00
|
|
|
</span><span class=keyword>class </span><span class=identifier>sub_range </span><span class=special>: </span><span class=keyword>public </span><span class=identifier>iterator_range</span><span class=special>< </span><span class=keyword>typename </span><span class=identifier>range_iterator</span><span class=special><</span><span class=identifier>ForwardRange</span><span class=special>>::</span><span class=identifier>type </span><span class=special>>
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=special>{
|
|
|
|
</span><span class=keyword>public</span><span class=special>: </span>
|
2008-06-24 15:39:28 +00:00
|
|
|
<span class=keyword>typedef </span><span class=keyword>typename </span><span class=identifier>range_iterator</span><span class=special><</span><span class=identifier>ForwardRange</span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>iterator</span><span class=special>;</span>
|
2007-11-17 20:22:20 +00:00
|
|
|
<span class=keyword>typedef </span><span class=keyword>typename </span><span class=identifier>range_iterator</span><span class=special><</span><span class=keyword>const </span><span class=identifier>ForwardRange</span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>const_iterator</span><span class=special>;</span>
|
|
|
|
<span class=keyword>typedef </span><span class=keyword>typename </span><span class=identifier>iterator_difference</span><span class=special><</span><span class=identifier>iterator</span><span class=special>>::</span><span class=identifier>type </span><span class=identifier>difference_type</span><span class=special>;</span>
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2007-11-17 20:22:20 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
<span class=keyword>public</span><span class=special>: </span><span class=comment>// construction, assignment
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardTraversalIterator </span><span class=special>>
|
|
|
|
</span><span class=identifier>sub_range</span><span class=special>( </span><span class=identifier>ForwardTraversalIterator </span><span class=identifier>Begin</span><span class=special>, </span><span class=identifier>ForwardTraversalIterator </span><span class=identifier>End </span><span class=special>);
|
|
|
|
|
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange2 </span><span class=special>>
|
|
|
|
</span><span class=identifier>sub_range</span><span class=special>( </span><span class=identifier>ForwardRange2</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange2 </span><span class=special>>
|
2007-10-27 15:58:22 +00:00
|
|
|
</span><span class=identifier>sub_range</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>ForwardRange2</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange2 </span><span class=special>>
|
|
|
|
</span><span class=identifier>sub_range</span><span class=special>& </span><span class=keyword>operator</span><span class=special>=( </span><span class=identifier>ForwardRange2</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>ForwardRange2 </span><span class=special>>
|
|
|
|
</span><span class=identifier>sub_range</span><span class=special>& </span><span class=keyword>operator</span><span class=special>=( </span><span class=keyword>const </span><span class=identifier>ForwardRange2</span><span class=special>& </span><span class=identifier>r </span><span class=special>);
|
|
|
|
</span>
|
2005-02-05 21:33:29 +00:00
|
|
|
<span class=keyword>public</span><span class=special>: </span><span class=comment>// Forward Range functions
|
|
|
|
</span><span class=identifier>iterator </span><span class=identifier>begin</span><span class=special>();
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=identifier>const_iterator </span><span class=identifier>begin</span><span class=special>() </span><span class=keyword>const</span><span class=special>;
|
|
|
|
</span><span class=identifier>iterator </span><span class=identifier>end</span><span class=special>();
|
|
|
|
</span><span class=identifier>const_iterator </span><span class=identifier>end</span><span class=special>() </span><span class=keyword>const</span><span class=special>;</span>
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2005-02-05 21:33:29 +00:00
|
|
|
<span class=keyword>public</span><span class=special>: </span><span class=comment>// convenience
|
|
|
|
</span> <span class=identifier>value_type</span><span class=special>& </span><span class=identifier>front</span><span class=special>();</span>
|
|
|
|
<span class=keyword>const </span><span class=identifier>value_type</span><span class=special>& </span><span class=identifier>front</span><span class=special>() </span><span class=keyword>const</span><span class=special>;</span>
|
|
|
|
<span class=identifier>value_type</span><span class=special>& </span><span class=identifier>back</span><span class=special>();</span>
|
|
|
|
<span class=keyword>const </span><span class=identifier>value_type</span><span class=special>& </span><span class=identifier>back</span><span class=special>() </span><span class=keyword>const</span><span class=special>;</span>
|
|
|
|
<span class=comment>// for Random Access Range only: </span>
|
2007-11-17 20:22:20 +00:00
|
|
|
<span class=identifier>value_type</span><span class=special>& </span><span class=keyword>operator</span><span class=special>[]( </span><span class=identifier>difference_type </span><span class=identifier>at </span><span class=special>);</span>
|
|
|
|
<span class=keyword>const </span><span class=identifier>value_type</span><span class=special>& </span><span class=keyword>operator</span><span class=special>[]( </span><span class=identifier>difference_type </span><span class=identifier>at </span><span class=special>) </span><span class=keyword>const</span><span class=special>;</span>
|
2005-02-05 21:33:29 +00:00
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
<span class=keyword>public</span><span class=special>:
|
2008-05-11 13:49:20 +00:00
|
|
|
</span><span class=comment>// rest of interface inherited from <a href="#iter_range"><code>iterator_range</code></a>
|
2004-08-12 10:58:13 +00:00
|
|
|
</span><span class=special>};
|
|
|
|
</span>
|
|
|
|
<span class=special>} </span><span class=comment>// namespace 'boost'</span>
|
|
|
|
</pre>
|
2004-08-10 09:56:55 +00:00
|
|
|
|
|
|
|
<p>
|
2004-08-12 10:58:13 +00:00
|
|
|
The class should be trivial to use as seen below.
|
|
|
|
Imagine that we have an algorithm that searches for a sub-string in a string.
|
|
|
|
The
|
|
|
|
result is an <code>iterator_range</code>, that delimits the match. We need to
|
|
|
|
store the result
|
|
|
|
from this algorithm. Here is an example of how we can do it with and without
|
|
|
|
<code>sub_range</code>
|
2004-08-10 09:56:55 +00:00
|
|
|
<pre>
|
2007-11-17 20:22:20 +00:00
|
|
|
<span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>str</span><span class=special>(</span><span class=string>"hello"</span><span class=special>);</span>
|
|
|
|
<span class=identifier>iterator_range</span><span class=special><</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>::</span><span class=identifier>iterator</span><span class=special>></span> <span class=identifier>ir</span> <span class=special>=</span> <span class=identifier>find_first</span><span class=special>(</span> <span class=identifier>str</span><span class=special>,</span> <span class=identifier>as_literal</span><span class=special>(</span><span class=string>"ll"</span><span class=special>)</span> <span class=special>);</span>
|
|
|
|
<span class=identifier>sub_range</span><span class=special><</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>></span> <span class=identifier>sub</span> <span class=special>=</span> <span class=identifier>find_first</span><span class=special>(</span> <span class=identifier>str</span><span class=special>,</span> <span class=identifier>as_literal</span><span class=special>(</span><span class=string>"ll"</span><span class=special>)</span> <span class=special>);</span>
|
2004-08-12 10:58:13 +00:00
|
|
|
</pre>
|
|
|
|
</p>
|
2004-07-30 01:30:27 +00:00
|
|
|
|
2008-02-06 23:12:21 +00:00
|
|
|
<hr>
|
|
|
|
<p>
|
|
|
|
© <a name="Copyright" id="Copyright">Copyright</a> Thorsten Ottosen 2008.
|
|
|
|
</p>
|
|
|
|
|
|
|
|
<p>
|
|
|
|
Distributed under the Boost Software License, Version 1.0. (See
|
|
|
|
accompanying file LICENSE_1_0.txt or copy
|
|
|
|
at <a href=
|
|
|
|
"http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)
|
|
|
|
</p>
|
2004-07-30 01:30:27 +00:00
|
|
|
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
<br>
|
|
|
|
|
2004-08-12 10:58:13 +00:00
|
|
|
|
2004-08-10 09:56:55 +00:00
|
|
|
</body>
|
2004-07-30 01:30:27 +00:00
|
|
|
</html>
|
|
|
|
|