forked from boostorg/iterator
		
	
		
			
				
	
	
		
			336 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			336 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<?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.3.1: http://docutils.sourceforge.net/" />
 | 
						|
<title>Iterator Adaptor</title>
 | 
						|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
 | 
						|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
 | 
						|
<meta name="date" content="2003-09-14" />
 | 
						|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved" />
 | 
						|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
<div class="document" id="iterator-adaptor">
 | 
						|
<h1 class="title">Iterator Adaptor</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>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
 | 
						|
<tr><th class="docinfo-name">Contact:</th>
 | 
						|
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
 | 
						|
<tr><th class="docinfo-name">Organization:</th>
 | 
						|
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
 | 
						|
Lab</a>, University of Hanover <a class="last reference" href="http://www.ive.uni-hannover.de">Institute for Transport
 | 
						|
Railway Operation and Construction</a></td></tr>
 | 
						|
<tr><th class="docinfo-name">Date:</th>
 | 
						|
<td>2003-09-14</td></tr>
 | 
						|
<tr><th class="docinfo-name">Copyright:</th>
 | 
						|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved</td></tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">abstract:</th><td class="field-body"></td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<p>The <tt class="literal"><span class="pre">iterator_adaptor</span></tt> is a base class template derived from an
 | 
						|
instantiation of <tt class="literal"><span class="pre">iterator_facade</span></tt>. The core interface functions
 | 
						|
expected by <tt class="literal"><span class="pre">iterator_facade</span></tt> are implemented in terms of the
 | 
						|
<tt class="literal"><span class="pre">iterator_adaptor</span></tt>'s <tt class="literal"><span class="pre">Base</span></tt> template parameter. A class derived
 | 
						|
from <tt class="literal"><span class="pre">iterator_adaptor</span></tt> typically redefines some of the core
 | 
						|
interface functions to adapt the behavior of the <tt class="literal"><span class="pre">Base</span></tt> type.
 | 
						|
Whether the derived class models any of the standard iterator concepts
 | 
						|
depends on the operations supported by the <tt class="literal"><span class="pre">Base</span></tt> type and which
 | 
						|
core interface functions of <tt class="literal"><span class="pre">iterator_facade</span></tt> are redefined in the
 | 
						|
<tt class="literal"><span class="pre">Derived</span></tt> class.</p>
 | 
						|
<div class="contents topic" id="table-of-contents">
 | 
						|
<p class="topic-title"><a name="table-of-contents">Table of Contents</a></p>
 | 
						|
<ul class="simple">
 | 
						|
<li><a class="reference" href="#introduction" id="id3" name="id3">Introduction</a></li>
 | 
						|
<li><a class="reference" href="#reference" id="id4" name="id4">Reference</a><ul>
 | 
						|
<li><a class="reference" href="#iterator-adaptor-requirements" id="id5" name="id5"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> requirements</a></li>
 | 
						|
<li><a class="reference" href="#iterator-adaptor-public-operations" id="id6" name="id6"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> public operations</a></li>
 | 
						|
<li><a class="reference" href="#iterator-adaptor-protected-member-functions" id="id7" name="id7"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> protected member functions</a></li>
 | 
						|
<li><a class="reference" href="#iterator-adaptor-private-member-functions" id="id8" name="id8"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> private member functions</a></li>
 | 
						|
</ul>
 | 
						|
</li>
 | 
						|
</ul>
 | 
						|
</div>
 | 
						|
<div class="section" id="introduction">
 | 
						|
<h1><a class="toc-backref" href="#id3" name="introduction">Introduction</a></h1>
 | 
						|
<p>The <tt class="literal"><span class="pre">iterator_adaptor</span></tt> class template adapts some <tt class="literal"><span class="pre">Base</span></tt> <a class="footnote-reference" href="#base" id="id1" name="id1"><sup>1</sup></a>
 | 
						|
type to create a new iterator.  Instantiations of <tt class="literal"><span class="pre">iterator_adaptor</span></tt>
 | 
						|
are derived from a corresponding instantiation of <tt class="literal"><span class="pre">iterator_facade</span></tt>
 | 
						|
and implement the core behaviors in terms of the <tt class="literal"><span class="pre">Base</span></tt> type. In
 | 
						|
essence, <tt class="literal"><span class="pre">iterator_adaptor</span></tt> merely forwards all operations to an
 | 
						|
instance of the <tt class="literal"><span class="pre">Base</span></tt> type, which it stores as a member.</p>
 | 
						|
<table class="footnote" frame="void" id="base" rules="none">
 | 
						|
<colgroup><col class="label" /><col /></colgroup>
 | 
						|
<tbody valign="top">
 | 
						|
<tr><td class="label"><a class="fn-backref" href="#id1" name="base">[1]</a></td><td>The term "Base" here does not refer to a base class and is
 | 
						|
not meant to imply the use of derivation. We have followed the lead
 | 
						|
of the standard library, which provides a base() function to access
 | 
						|
the underlying iterator object of a <tt class="literal"><span class="pre">reverse_iterator</span></tt> adaptor.</td></tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<p>The user of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> creates a class derived from an
 | 
						|
instantiation of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> and then selectively
 | 
						|
redefines some of the core member functions described in the table
 | 
						|
above. The <tt class="literal"><span class="pre">Base</span></tt> type need not meet the full requirements for an
 | 
						|
iterator. It need only support the operations used by the core
 | 
						|
interface functions of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> that have not been
 | 
						|
redefined in the user's derived class.</p>
 | 
						|
<p>Several of the template parameters of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> default to
 | 
						|
<tt class="literal"><span class="pre">use_default</span></tt>. This allows the user to make use of a default
 | 
						|
parameter even when the user wants to specify a parameter later in the
 | 
						|
parameter list.  Also, the defaults for the corresponding associated
 | 
						|
types are fairly complicated, so metaprogramming is required to
 | 
						|
compute them, and <tt class="literal"><span class="pre">use_default</span></tt> can help to simplify the
 | 
						|
implementation.  Finally, <tt class="literal"><span class="pre">use_default</span></tt> is not left unspecified
 | 
						|
because specification helps to highlight that the <tt class="literal"><span class="pre">Reference</span></tt>
 | 
						|
template parameter may not always be identical to the iterator's
 | 
						|
<tt class="literal"><span class="pre">reference</span></tt> type, and will keep users making mistakes based on that
 | 
						|
assumption.</p>
 | 
						|
</div>
 | 
						|
<div class="section" id="reference">
 | 
						|
<h1><a class="toc-backref" href="#id4" name="reference">Reference</a></h1>
 | 
						|
<pre class="literal-block">
 | 
						|
template <
 | 
						|
    class Derived
 | 
						|
  , class Base
 | 
						|
  , class Value      = use_default
 | 
						|
  , class Category   = use_default
 | 
						|
  , class Reference  = use_default
 | 
						|
  , class Difference = use_default
 | 
						|
>
 | 
						|
class iterator_adaptor 
 | 
						|
  : public iterator_facade<Derived, /* see <a class="reference" href=":">details</a> ...*/>
 | 
						|
{
 | 
						|
    friend class iterator_core_access;
 | 
						|
 public:
 | 
						|
    iterator_adaptor();
 | 
						|
    explicit iterator_adaptor(Base iter);
 | 
						|
    Base base() const;
 | 
						|
 protected:
 | 
						|
    Base const& base_reference() const;
 | 
						|
    Base& base_reference();
 | 
						|
 private: // Core iterator interface for iterator_facade.  
 | 
						|
    typename iterator_adaptor::reference dereference() const;
 | 
						|
 | 
						|
    template <
 | 
						|
    class OtherDerived, class OtherIterator, class V, class C, class R, class D
 | 
						|
    >   
 | 
						|
    bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
 | 
						|
 | 
						|
    void advance(typename iterator_adaptor::difference_type n);
 | 
						|
    void increment();
 | 
						|
    void decrement();
 | 
						|
 | 
						|
    template <
 | 
						|
        class OtherDerived, class OtherIterator, class V, class C, class R, class D
 | 
						|
    >   
 | 
						|
    typename iterator_adaptor::difference_type distance_to(
 | 
						|
        iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
 | 
						|
 | 
						|
 private:
 | 
						|
    Base m_iterator;
 | 
						|
};
 | 
						|
</pre>
 | 
						|
<div class="section" id="iterator-adaptor-requirements">
 | 
						|
<h2><a class="toc-backref" href="#id5" name="iterator-adaptor-requirements"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> requirements</a></h2>
 | 
						|
<p>The <tt class="literal"><span class="pre">Derived</span></tt> template parameter must be a derived class of
 | 
						|
<tt class="literal"><span class="pre">iterator_adaptor</span></tt>. The <tt class="literal"><span class="pre">Base</span></tt> type must implement the
 | 
						|
expressions involving <tt class="literal"><span class="pre">m_iterator</span></tt> in the specifications of those
 | 
						|
private member functions of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> that are not
 | 
						|
redefined by the <tt class="literal"><span class="pre">Derived</span></tt> class and that are needed to model the
 | 
						|
concept corresponding to the <tt class="literal"><span class="pre">iterator_adaptor</span></tt>'s <tt class="literal"><span class="pre">category</span></tt>
 | 
						|
typedef according to the requirements of <tt class="literal"><span class="pre">iterator_facade</span></tt>.  The
 | 
						|
rest of the template parameters specify the types for the member
 | 
						|
typedefs in <tt class="literal"><span class="pre">iterator_facade</span></tt>.  The following pseudo-code
 | 
						|
specifies the traits types for <tt class="literal"><span class="pre">iterator_adaptor</span></tt>.</p>
 | 
						|
<pre class="literal-block">
 | 
						|
if (Value == use_default)
 | 
						|
    value_type = iterator_traits<Base>::value_type;
 | 
						|
else 
 | 
						|
    value_type = remove_cv<Value>::type;
 | 
						|
 | 
						|
if (Reference == use_default) {
 | 
						|
    if (Value == use_default)
 | 
						|
        reference = iterator_traits<Base>::reference;
 | 
						|
    else 
 | 
						|
        reference = Value&;
 | 
						|
} else
 | 
						|
    reference = Reference;
 | 
						|
 | 
						|
if (Distance == use_default)
 | 
						|
    difference_type = iterator_traits<Base>::difference_type;
 | 
						|
else
 | 
						|
    difference_type = Distance;
 | 
						|
 | 
						|
if (Category == use_default)
 | 
						|
    iterator_category = iterator_tag< 
 | 
						|
        access_category< Base >,
 | 
						|
        traversal_category< Base >
 | 
						|
    >
 | 
						|
else if (Category is an access tag)
 | 
						|
    iterator_category = iterator_tag<
 | 
						|
        Category
 | 
						|
    ...
 | 
						|
 | 
						|
else if (Category is a traversal tag)
 | 
						|
    ...
 | 
						|
else
 | 
						|
    iterator_category = Category;
 | 
						|
    // Actually the above is wrong.  See the use of
 | 
						|
    // access_category_tag and
 | 
						|
    // new_category_to_access/iter_category_to_access.
 | 
						|
</pre>
 | 
						|
<!-- Replaced with new semantics - -thw
 | 
						|
if (Category == use_default)
 | 
						|
    iterator_category = iterator_traits<Base>::iterator_category;
 | 
						|
else
 | 
						|
    iterator_category = Category;
 | 
						|
 | 
						|
Fix this up!! -->
 | 
						|
</div>
 | 
						|
<div class="section" id="iterator-adaptor-public-operations">
 | 
						|
<h2><a class="toc-backref" href="#id6" name="iterator-adaptor-public-operations"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> public operations</a></h2>
 | 
						|
<p><tt class="literal"><span class="pre">iterator_adaptor();</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Requires:</th><td class="field-body">The <tt class="literal"><span class="pre">Base</span></tt> type must be Default Constructible.</td>
 | 
						|
</tr>
 | 
						|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> with 
 | 
						|
<tt class="literal"><span class="pre">m_iterator</span></tt> default constructed.</td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<p><tt class="literal"><span class="pre">explicit</span> <span class="pre">iterator_adaptor(Base</span> <span class="pre">iter);</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> with
 | 
						|
<tt class="literal"><span class="pre">m_iterator</span></tt> copy constructed from <tt class="literal"><span class="pre">iter</span></tt>.</td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<p><tt class="literal"><span class="pre">Base</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span></tt></td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
</div>
 | 
						|
<div class="section" id="iterator-adaptor-protected-member-functions">
 | 
						|
<h2><a class="toc-backref" href="#id7" name="iterator-adaptor-protected-member-functions"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> protected member functions</a></h2>
 | 
						|
<p><tt class="literal"><span class="pre">Base</span> <span class="pre">const&</span> <span class="pre">base_reference()</span> <span class="pre">const;</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A const reference to <tt class="literal"><span class="pre">m_iterator</span></tt>.</td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<p><tt class="literal"><span class="pre">Base&</span> <span class="pre">base_reference();</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A non-const reference to <tt class="literal"><span class="pre">m_iterator</span></tt>.</td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
</div>
 | 
						|
<div class="section" id="iterator-adaptor-private-member-functions">
 | 
						|
<h2><a class="toc-backref" href="#id8" name="iterator-adaptor-private-member-functions"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> private member functions</a></h2>
 | 
						|
<p><tt class="literal"><span class="pre">typename</span> <span class="pre">iterator_adaptor::reference</span> <span class="pre">dereference()</span> <span class="pre">const;</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*m_iterator</span></tt></td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<pre class="literal-block">
 | 
						|
template <
 | 
						|
class OtherDerived, class OtherIterator, class V, class C, class R, class D
 | 
						|
>   
 | 
						|
bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
 | 
						|
</pre>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span> <span class="pre">==</span> <span class="pre">x.base()</span></tt></td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<p><tt class="literal"><span class="pre">void</span> <span class="pre">advance(typename</span> <span class="pre">iterator_adaptor::difference_type</span> <span class="pre">n);</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span> <span class="pre">+=</span> <span class="pre">n;</span></tt></td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<p><tt class="literal"><span class="pre">void</span> <span class="pre">increment();</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">++m_iterator;</span></tt></td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<p><tt class="literal"><span class="pre">void</span> <span class="pre">decrement();</span></tt></p>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">--m_iterator;</span></tt></td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
<pre class="literal-block">
 | 
						|
template <
 | 
						|
    class OtherDerived, class OtherIterator, class V, class C, class R, class D
 | 
						|
>   
 | 
						|
typename iterator_adaptor::difference_type distance_to(
 | 
						|
    iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
 | 
						|
</pre>
 | 
						|
<table class="field-list" frame="void" rules="none">
 | 
						|
<col class="field-name" />
 | 
						|
<col class="field-body" />
 | 
						|
<tbody valign="top">
 | 
						|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">y.base()</span> <span class="pre">-</span> <span class="pre">m_iterator</span></tt></td>
 | 
						|
</tr>
 | 
						|
</tbody>
 | 
						|
</table>
 | 
						|
</div>
 | 
						|
</div>
 | 
						|
</div>
 | 
						|
<hr class="footer" />
 | 
						|
<div class="footer">
 | 
						|
<a class="reference" href="iterator_adaptor.rst">View document source</a>.
 | 
						|
Generated on: 2003-09-21 09:34 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>
 |