mirror of
https://github.com/boostorg/utility.git
synced 2025-05-09 15:04:00 +00:00
added Category parameter and made a few more edits with regards to type requirements
[SVN r9239]
This commit is contained in:
parent
393e79c1fd
commit
c21f6d1cbf
@ -42,12 +42,12 @@ reference indirect_iterator::operator*() const {
|
|||||||
<pre>
|
<pre>
|
||||||
namespace boost {
|
namespace boost {
|
||||||
template <class BaseIterator,
|
template <class BaseIterator,
|
||||||
class Value, class Reference, class Pointer>
|
class Value, class Reference, class Pointer, class Category>
|
||||||
struct indirect_iterator_generator;
|
struct indirect_iterator_generator;
|
||||||
|
|
||||||
template <class BaseIterator,
|
template <class BaseIterator,
|
||||||
class Value, class Pointer, class Reference,
|
class Value, class Pointer, class Reference,
|
||||||
class ConstPointer, class ConstReference>
|
class ConstPointer, class ConstReference, class Category>b
|
||||||
struct indirect_iterator_pair_generator;
|
struct indirect_iterator_pair_generator;
|
||||||
|
|
||||||
template <class BaseIterator>
|
template <class BaseIterator>
|
||||||
@ -127,10 +127,9 @@ int main(int, char*[])
|
|||||||
<td><tt>BaseIterator</tt>
|
<td><tt>BaseIterator</tt>
|
||||||
|
|
||||||
<td>The iterator type being wrapped. The <tt>value_type</tt>
|
<td>The iterator type being wrapped. The <tt>value_type</tt>
|
||||||
of the base iterator should itself be dereferenceable.
|
of the base iterator should itself be dereferenceable.
|
||||||
Also, if the default <tt>Value</tt> template
|
The return type of the <tt>operator*</tt> for the
|
||||||
parameter is used, the <tt>value_type</tt> must provide
|
<tt>value_type</tt> should match the <tt>Reference</tt> type.
|
||||||
a specialization of <tt>iterator_traits</tt>.
|
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><tt>Value</tt>
|
<td><tt>Value</tt>
|
||||||
@ -138,7 +137,10 @@ int main(int, char*[])
|
|||||||
<td>The <tt>value_type</tt> of the resulting iterator, unless const. If
|
<td>The <tt>value_type</tt> of the resulting iterator, unless const. If
|
||||||
Value is <tt>const X</tt>, a conforming compiler makes the
|
Value is <tt>const X</tt>, a conforming compiler makes the
|
||||||
<tt>value_type</tt> <tt><i>non-</i>const X</tt><a href=
|
<tt>value_type</tt> <tt><i>non-</i>const X</tt><a href=
|
||||||
"iterator_adaptors.htm#1">[1]</a>.<br>
|
"iterator_adaptors.htm#1">[1]</a>. Note that if the default
|
||||||
|
is used for <tt>Value</tt>, then there must be a valid specialization
|
||||||
|
of <tt>iterator_traits</tt> for the value type of the base iterator.
|
||||||
|
<br>
|
||||||
<b>Default:</b> <tt>std::iterator_traits<<br>
|
<b>Default:</b> <tt>std::iterator_traits<<br>
|
||||||
std::iterator_traits<BaseIterator>::value_type
|
std::iterator_traits<BaseIterator>::value_type
|
||||||
>::value_type</tt><a href="#2">[2]</a>
|
>::value_type</tt><a href="#2">[2]</a>
|
||||||
@ -156,17 +158,24 @@ int main(int, char*[])
|
|||||||
<td>The <tt>pointer</tt> type of the resulting iterator, and in
|
<td>The <tt>pointer</tt> type of the resulting iterator, and in
|
||||||
particular, the result type of <tt>operator->()</tt>.<br>
|
particular, the result type of <tt>operator->()</tt>.<br>
|
||||||
<b>Default:</b> <tt>Value*</tt>
|
<b>Default:</b> <tt>Value*</tt>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><tt>Category</tt>
|
||||||
|
<td>The <tt>iterator_category</tt> type for the resulting iterator.<br>
|
||||||
|
<b>Default:</b>
|
||||||
|
<tt>std::iterator_traits<BaseIterator>::iterator_category</tt>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3>Concept Model</h3>
|
<h3>Concept Model</h3>
|
||||||
The indirect iterator will model whichever <a href=
|
The indirect iterator will model whichever <a href=
|
||||||
"http://www.sgi.com/tech/stl/Iterators.html">standard iterator concept
|
"http://www.sgi.com/tech/stl/Iterators.html">standard iterator
|
||||||
category</a> is modeled by the base iterator. Thus, if the base iterator is
|
concept category</a> is modeled by the base iterator. Thus, if the
|
||||||
a model of <a href=
|
base iterator is a model of <a href=
|
||||||
"http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access
|
"http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
|
||||||
Iterator</a> then so is the resulting indirect iterator. If the base
|
Access Iterator</a> then so is the resulting indirect iterator. If
|
||||||
iterator models a more restrictive concept, the resulting indirect iterator
|
the base iterator models a more restrictive concept, the resulting
|
||||||
will model the same concept.
|
indirect iterator will model the same concept <a href="#3">[3]</a>.
|
||||||
|
|
||||||
<h3>Members</h3>
|
<h3>Members</h3>
|
||||||
The indirect iterator type implements the member functions and operators
|
The indirect iterator type implements the member functions and operators
|
||||||
@ -256,14 +265,20 @@ b,c,d,e,f,g,h,
|
|||||||
|
|
||||||
<td>The iterator type being wrapped. The <tt>value_type</tt> of the
|
<td>The iterator type being wrapped. The <tt>value_type</tt> of the
|
||||||
base iterator should itself be dereferenceable.
|
base iterator should itself be dereferenceable.
|
||||||
Also, if the default <tt>Value</tt> template
|
The return type of the <tt>operator*</tt> for the
|
||||||
parameter is used, the <tt>value_type</tt> must provide
|
<tt>value_type</tt> should match the <tt>Reference</tt> type.
|
||||||
a specialization of <tt>iterator_traits</tt>.
|
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><tt>Value</tt>
|
<td><tt>Value</tt>
|
||||||
|
|
||||||
<td>The <tt>value_type</tt> of the resulting iterators<br>
|
<td>The <tt>value_type</tt> of the resulting iterators.
|
||||||
|
If Value is <tt>const X</tt>, a conforming compiler makes the
|
||||||
|
<tt>value_type</tt> <tt><i>non-</i>const X</tt><a href=
|
||||||
|
"iterator_adaptors.htm#1">[1]</a>. Note that if the default
|
||||||
|
is used for <tt>Value</tt>, then there must be a valid
|
||||||
|
specialization of <tt>iterator_traits</tt> for the value type
|
||||||
|
of the base iterator.<br>
|
||||||
|
|
||||||
<b>Default:</b> <tt>std::iterator_traits<<br>
|
<b>Default:</b> <tt>std::iterator_traits<<br>
|
||||||
std::iterator_traits<BaseIterator>::value_type
|
std::iterator_traits<BaseIterator>::value_type
|
||||||
>::value_type</tt><a href="#2">[2]</a>
|
>::value_type</tt><a href="#2">[2]</a>
|
||||||
@ -296,17 +311,26 @@ b,c,d,e,f,g,h,
|
|||||||
<td>The <tt>pointer</tt> type of the resulting <tt>const_iterator</tt>,
|
<td>The <tt>pointer</tt> type of the resulting <tt>const_iterator</tt>,
|
||||||
and in particular, the result type of its <tt>operator->()</tt>.<br>
|
and in particular, the result type of its <tt>operator->()</tt>.<br>
|
||||||
<b>Default:</b> <tt>const Value*</tt>
|
<b>Default:</b> <tt>const Value*</tt>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><tt>Category</tt>
|
||||||
|
<td>The <tt>iterator_category</tt> type for the resulting iterator.<br>
|
||||||
|
<b>Default:</b>
|
||||||
|
<tt>std::iterator_traits<BaseIterator>::iterator_category</tt>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3>Concept Model</h3>
|
<h3>Concept Model</h3>
|
||||||
|
|
||||||
The indirect iterators will model whichever <a href=
|
The indirect iterators will model whichever <a href=
|
||||||
"http://www.sgi.com/tech/stl/Iterators.html">standard iterator concept
|
"http://www.sgi.com/tech/stl/Iterators.html">standard iterator
|
||||||
category</a> is modeled by the base iterator. Thus, if the base iterator is
|
concept category</a> is modeled by the base iterator. Thus, if the
|
||||||
a model of <a href=
|
base iterator is a model of <a href=
|
||||||
"http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access
|
"http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
|
||||||
Iterator</a> then so are the resulting indirect iterators. If the base
|
Access Iterator</a> then so are the resulting indirect
|
||||||
iterator models a more restrictive concept, the resulting indirect
|
iterators. If the base iterator models a more restrictive concept,
|
||||||
iterators will model the same concept.
|
the resulting indirect iterators will model the same concept <a
|
||||||
|
href="#3">[3]</a>.
|
||||||
|
|
||||||
|
|
||||||
<h3>Members</h3>
|
<h3>Members</h3>
|
||||||
The resulting <tt>iterator</tt> and <tt>const_iterator</tt> types implement
|
The resulting <tt>iterator</tt> and <tt>const_iterator</tt> types implement
|
||||||
@ -379,6 +403,22 @@ a,b,c,d,e,f,g,
|
|||||||
<tt>Value</tt> and will need to specify this type explicitly.
|
<tt>Value</tt> and will need to specify this type explicitly.
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
<p><a name="3">[3]</a>There is a caveat to which concept the
|
||||||
|
indirect iterator can model. If the return type of the
|
||||||
|
<tt>operator*</tt> for the base iterator's value type is not a
|
||||||
|
true reference, then strickly speaking, the indirect iterator can
|
||||||
|
not be a model of <a href=
|
||||||
|
"http://www.sgi.com/tech/stl/ForwardIterator.html">Forward
|
||||||
|
Iterator</a> or any of the concepts that refine it. In this case
|
||||||
|
the <tt>Category</tt> for the indirect iterator should be
|
||||||
|
specified as <tt>std::input_iterator_tag</tt>. However, even in
|
||||||
|
this case, if the base iterator is a random access iterator, the
|
||||||
|
resulting indirect iterator will still satisfy most of the
|
||||||
|
requirements for <a href=
|
||||||
|
"http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
|
||||||
|
Access Iterator</a>.
|
||||||
|
|
||||||
|
|
||||||
<p>Revised
|
<p>Revised
|
||||||
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->10
|
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->10
|
||||||
Feb 2001<!--webbot bot="Timestamp" endspan i-checksum="14373" -->
|
Feb 2001<!--webbot bot="Timestamp" endspan i-checksum="14373" -->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user