index.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <meta name="generator" content="Docutils 0.6: http://docutils.sourceforge.net/" />
  7. <title>The Boost.Iterator Library Boost</title>
  8. <link rel="stylesheet" href="../../../rst.css" type="text/css" />
  9. </head>
  10. <body>
  11. <div class="document" id="the-boost-iterator-library-logo">
  12. <h1 class="title">The Boost.Iterator Library <a class="reference external" href="../../../index.htm"><img alt="Boost" src="../../../boost.png" /></a></h1>
  13. <!-- Distributed under the Boost -->
  14. <!-- Software License, Version 1.0. (See accompanying -->
  15. <!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
  16. <hr class="docutils" />
  17. <table class="docutils field-list" frame="void" rules="none">
  18. <col class="field-name" />
  19. <col class="field-body" />
  20. <tbody valign="top">
  21. <tr class="field"><th class="field-name">Authors:</th><td class="field-body">David Abrahams, Jeremy Siek, Thomas Witt</td>
  22. </tr>
  23. <tr class="field"><th class="field-name">Contact:</th><td class="field-body"><a class="reference external" href="mailto:dave&#64;boost-consulting.com">dave&#64;boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek&#64;osl.iu.edu">jsiek&#64;osl.iu.edu</a>, <a class="reference external" href="mailto:witt&#64;styleadvisor.com">witt&#64;styleadvisor.com</a></td>
  24. </tr>
  25. <tr class="field"><th class="field-name">organizations:</th><td class="field-body"><a class="reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
  26. Lab</a>, <a class="reference external" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td>
  27. </tr>
  28. <tr class="field"><th class="field-name">date:</th><td class="field-body">$Date$</td>
  29. </tr>
  30. <tr class="field"><th class="field-name">copyright:</th><td class="field-body">Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003.</td>
  31. </tr>
  32. </tbody>
  33. </table>
  34. <table class="docutils field-list" frame="void" rules="none">
  35. <col class="field-name" />
  36. <col class="field-body" />
  37. <tbody valign="top">
  38. <tr class="field"><th class="field-name">Abstract:</th><td class="field-body">The Boost Iterator Library contains two parts. The first
  39. is a system of <a class="reference external" href="http://www.boost.org/more/generic_programming.html#concept">concepts</a> which extend the C++ standard
  40. iterator requirements. The second is a framework of
  41. components for building iterators based on these
  42. extended concepts and includes several useful iterator
  43. adaptors. The extended iterator concepts have been
  44. carefully designed so that old-style iterators
  45. can fit in the new concepts and so that new-style
  46. iterators will be compatible with old-style algorithms,
  47. though algorithms may need to be updated if they want to
  48. take full advantage of the new-style iterator
  49. capabilities. Several components of this library have
  50. been accepted into the C++ standard technical report.
  51. The components of the Boost Iterator Library replace the
  52. older Boost Iterator Adaptor Library.</td>
  53. </tr>
  54. </tbody>
  55. </table>
  56. <div class="contents topic" id="table-of-contents">
  57. <p class="topic-title first"><strong>Table of Contents</strong></p>
  58. <ul class="simple">
  59. <li><a class="reference internal" href="#new-style-iterators" id="id23">New-Style Iterators</a></li>
  60. <li><a class="reference internal" href="#iterator-facade-and-adaptor" id="id24">Iterator Facade and Adaptor</a></li>
  61. <li><a class="reference internal" href="#specialized-adaptors" id="id25">Specialized Adaptors</a></li>
  62. <li><a class="reference internal" href="#iterator-utilities" id="id26">Iterator Utilities</a><ul>
  63. <li><a class="reference internal" href="#traits" id="id27">Traits</a></li>
  64. <li><a class="reference internal" href="#testing-and-concept-checking" id="id28">Testing and Concept Checking</a></li>
  65. </ul>
  66. </li>
  67. <li><a class="reference internal" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id29">Upgrading from the old Boost Iterator Adaptor Library</a></li>
  68. <li><a class="reference internal" href="#history" id="id30">History</a></li>
  69. </ul>
  70. </div>
  71. <hr class="docutils" />
  72. <div class="section" id="new-style-iterators">
  73. <h1><a class="toc-backref" href="#id23">New-Style Iterators</a></h1>
  74. <p>The iterator categories defined in C++98 are extremely limiting
  75. because they bind together two orthogonal concepts: traversal and
  76. element access. For example, because a random access iterator is
  77. required to return a reference (and not a proxy) when dereferenced,
  78. it is impossible to capture the capabilities of
  79. <tt class="docutils literal"><span class="pre">vector&lt;bool&gt;::iterator</span></tt> using the C++98 categories. This is the
  80. infamous &quot;<tt class="docutils literal"><span class="pre">vector&lt;bool&gt;</span></tt> is not a container, and its iterators
  81. aren't random access iterators&quot;, debacle about which Herb Sutter
  82. wrote two papers for the standards comittee (<a class="reference external" href="http://www.gotw.ca/publications/N1185.pdf">n1185</a> and <a class="reference external" href="http://www.gotw.ca/publications/N1211.pdf">n1211</a>),
  83. and a <a class="reference external" href="http://www.gotw.ca/gotw/050.htm">Guru of the Week</a>. New-style iterators go well beyond
  84. patching up <tt class="docutils literal"><span class="pre">vector&lt;bool&gt;</span></tt>, though: there are lots of other
  85. iterators already in use which can't be adequately represented by
  86. the existing concepts. For details about the new iterator
  87. concepts, see our</p>
  88. <blockquote>
  89. <a class="reference external" href="new-iter-concepts.html">Standard Proposal For New-Style Iterators</a> (<a class="reference external" href="new-iter-concepts.pdf">PDF</a>)</blockquote>
  90. </div>
  91. <div class="section" id="iterator-facade-and-adaptor">
  92. <h1><a class="toc-backref" href="#id24">Iterator Facade and Adaptor</a></h1>
  93. <p>Writing standard-conforming iterators is tricky, but the need comes
  94. up often. In order to ease the implementation of new iterators,
  95. the Boost.Iterator library provides the <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> class template,
  96. which implements many useful defaults and compile-time checks
  97. designed to help the iterator author ensure that his iterator is
  98. correct.</p>
  99. <p>It is also common to define a new iterator that is similar to some
  100. underlying iterator or iterator-like type, but that modifies some
  101. aspect of the underlying type's behavior. For that purpose, the
  102. library supplies the <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> class template, which is specially
  103. designed to take advantage of as much of the underlying type's
  104. behavior as possible.</p>
  105. <p>The documentation for these two classes can be found at the following
  106. web pages:</p>
  107. <ul class="simple">
  108. <li><a class="reference external" href="iterator_facade.html"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a> (<a class="reference external" href="iterator_facade.pdf">PDF</a>)</li>
  109. <li><a class="reference external" href="iterator_adaptor.html"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt></a> (<a class="reference external" href="iterator_adaptor.pdf">PDF</a>)</li>
  110. </ul>
  111. <p>Both <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> and <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> as well as many of the <a class="reference internal" href="#specialized-adaptors">specialized
  112. adaptors</a> mentioned below have been proposed for standardization,
  113. and accepted into the first C++ technical report; see our</p>
  114. <blockquote>
  115. <a class="reference external" href="facade-and-adaptor.html">Standard Proposal For Iterator Facade and Adaptor</a> (<a class="reference external" href="facade-and-adaptor.pdf">PDF</a>)</blockquote>
  116. <p>for more details.</p>
  117. </div>
  118. <div class="section" id="specialized-adaptors">
  119. <h1><a class="toc-backref" href="#id25">Specialized Adaptors</a></h1>
  120. <p>The iterator library supplies a useful suite of standard-conforming
  121. iterator templates based on the Boost <a class="reference internal" href="#iterator-facade-and-adaptor">iterator facade and adaptor</a>.</p>
  122. <ul class="simple">
  123. <li><a class="reference external" href="counting_iterator.html"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt></a> (<a class="reference external" href="counting_iterator.pdf">PDF</a>): an iterator over a sequence of consecutive values.
  124. Implements a &quot;lazy sequence&quot;</li>
  125. <li><a class="reference external" href="filter_iterator.html"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt></a> (<a class="reference external" href="filter_iterator.pdf">PDF</a>): an iterator over the subset of elements of some
  126. sequence which satisfy a given predicate</li>
  127. <li><a class="reference external" href="function_input_iterator.html"><tt class="docutils literal"><span class="pre">function_input_iterator</span></tt></a> (<a class="reference external" href="function_input_iterator.pdf">PDF</a>): an input iterator wrapping a generator (nullary
  128. function object); each time the iterator is dereferenced, the function object
  129. is called to get the value to return.</li>
  130. <li><a class="reference external" href="function_output_iterator.html"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt></a> (<a class="reference external" href="function_output_iterator.pdf">PDF</a>): an output iterator wrapping a unary function
  131. object; each time an element is written into the dereferenced
  132. iterator, it is passed as a parameter to the function object.</li>
  133. <li><a class="reference external" href="generator_iterator.htm"><tt class="docutils literal"><span class="pre">generator_iterator</span></tt></a>: an input iterator wrapping a reference to a generator (nullary function object);
  134. each time the iterator is dereferenced, the function object
  135. is called to get the value to return. This is a more outdated analogue of <tt class="docutils literal"><span class="pre">function_input_iterator</span></tt>.</li>
  136. <li><a class="reference external" href="indirect_iterator.html"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt></a> (<a class="reference external" href="indirect_iterator.pdf">PDF</a>): an iterator over the objects <em>pointed-to</em> by the
  137. elements of some sequence.</li>
  138. <li><a class="reference external" href="permutation_iterator.html"><tt class="docutils literal"><span class="pre">permutation_iterator</span></tt></a> (<a class="reference external" href="permutation_iterator.pdf">PDF</a>): an iterator over the elements of some random-access
  139. sequence, rearranged according to some sequence of integer indices.</li>
  140. <li><a class="reference external" href="reverse_iterator.html"><tt class="docutils literal"><span class="pre">reverse_iterator</span></tt></a> (<a class="reference external" href="reverse_iterator.pdf">PDF</a>): an iterator which traverses the elements of some
  141. bidirectional sequence in reverse. Corrects many of the
  142. shortcomings of C++98's <tt class="docutils literal"><span class="pre">std::reverse_iterator</span></tt>.</li>
  143. <li><a class="reference external" href="../../utility/shared_container_iterator.html"><tt class="docutils literal"><span class="pre">shared_container_iterator</span></tt></a>: an iterator over elements of a container whose
  144. lifetime is maintained by a <a class="reference external" href="../../smart_ptr/shared_ptr.htm"><tt class="docutils literal"><span class="pre">shared_ptr</span></tt></a> stored in the iterator.</li>
  145. <li><a class="reference external" href="transform_iterator.html"><tt class="docutils literal"><span class="pre">transform_iterator</span></tt></a> (<a class="reference external" href="transform_iterator.pdf">PDF</a>): an iterator over elements which are the result of
  146. applying some functional transformation to the elements of an
  147. underlying sequence. This component also replaces the old
  148. <tt class="docutils literal"><span class="pre">projection_iterator_adaptor</span></tt>.</li>
  149. <li><a class="reference external" href="zip_iterator.html"><tt class="docutils literal"><span class="pre">zip_iterator</span></tt></a> (<a class="reference external" href="zip_iterator.pdf">PDF</a>): an iterator over tuples of the elements at corresponding
  150. positions of heterogeneous underlying iterators.</li>
  151. </ul>
  152. </div>
  153. <div class="section" id="iterator-utilities">
  154. <h1><a class="toc-backref" href="#id26">Iterator Utilities</a></h1>
  155. <div class="section" id="traits">
  156. <h2><a class="toc-backref" href="#id27">Traits</a></h2>
  157. <ul class="simple">
  158. <li><a class="reference external" href="pointee.html"><tt class="docutils literal"><span class="pre">pointee.hpp</span></tt></a> (<a class="reference external" href="pointee.pdf">PDF</a>): Provides the capability to deduce the referent types
  159. of pointers, smart pointers and iterators in generic code. Used
  160. in <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt>.</li>
  161. <li><a class="reference external" href="iterator_traits.html"><tt class="docutils literal"><span class="pre">iterator_traits.hpp</span></tt></a> (<a class="reference external" href="iterator_traits.pdf">PDF</a>): Provides <a class="reference external" href="../../mpl/doc/index.html">MPL</a>-compatible metafunctions which
  162. retrieve an iterator's traits. Also corrects for the deficiencies
  163. of broken implementations of <tt class="docutils literal"><span class="pre">std::iterator_traits</span></tt>.</li>
  164. </ul>
  165. <!-- * |interoperable|_ (PDF__): Provides an MPL_\ -compatible metafunction for
  166. testing iterator interoperability -->
  167. <!-- comment! __ interoperable.pdf -->
  168. </div>
  169. <div class="section" id="testing-and-concept-checking">
  170. <h2><a class="toc-backref" href="#id28">Testing and Concept Checking</a></h2>
  171. <ul class="simple">
  172. <li><a class="reference external" href="iterator_concepts.html"><tt class="docutils literal"><span class="pre">iterator_concepts.hpp</span></tt></a> (<a class="reference external" href="iterator_concepts.pdf">PDF</a>): Concept checking classes for the new iterator concepts.</li>
  173. <li><a class="reference external" href="iterator_archetypes.html"><tt class="docutils literal"><span class="pre">iterator_archetypes.hpp</span></tt></a> (<a class="reference external" href="iterator_archetypes.pdf">PDF</a>): Concept archetype classes for the new iterators concepts.</li>
  174. </ul>
  175. </div>
  176. </div>
  177. <div class="section" id="upgrading-from-the-old-boost-iterator-adaptor-library">
  178. <h1><a class="toc-backref" href="#id29">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
  179. <p id="upgrading">If you have been using the old Boost Iterator Adaptor library to
  180. implement iterators, you probably wrote a <tt class="docutils literal"><span class="pre">Policies</span></tt> class which
  181. captures the core operations of your iterator. In the new library
  182. design, you'll move those same core operations into the body of the
  183. iterator class itself. If you were writing a family of iterators,
  184. you probably wrote a <a class="reference external" href="http://www.boost.org/more/generic_programming.html#type_generator">type generator</a> to build the
  185. <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> specialization you needed; in the new library
  186. design you don't need a type generator (though may want to keep it
  187. around as a compatibility aid for older code) because, due to the
  188. use of the Curiously Recurring Template Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id22">[Cop95]</a>,
  189. you can now define the iterator class yourself and acquire
  190. functionality through inheritance from <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> or
  191. <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. As a result, you also get much finer control
  192. over how your iterator works: you can add additional constructors,
  193. or even override the iterator functionality provided by the
  194. library.</p>
  195. <p>If you're looking for the old <tt class="docutils literal"><span class="pre">projection_iterator</span></tt> component,
  196. its functionality has been merged into <tt class="docutils literal"><span class="pre">transform_iterator</span></tt>: as
  197. long as the function object's <tt class="docutils literal"><span class="pre">result_type</span></tt> (or the <tt class="docutils literal"><span class="pre">Reference</span></tt>
  198. template argument, if explicitly specified) is a true reference
  199. type, <tt class="docutils literal"><span class="pre">transform_iterator</span></tt> will behave like
  200. <tt class="docutils literal"><span class="pre">projection_iterator</span></tt> used to.</p>
  201. </div>
  202. <div class="section" id="history">
  203. <h1><a class="toc-backref" href="#id30">History</a></h1>
  204. <p>In 2000 Dave Abrahams was writing an iterator for a container of
  205. pointers, which would access the pointed-to elements when
  206. dereferenced. Naturally, being a library writer, he decided to
  207. generalize the idea and the Boost Iterator Adaptor library was born.
  208. Dave was inspired by some writings of Andrei Alexandrescu and chose a
  209. policy based design (though he probably didn't capture Andrei's idea
  210. very well - there was only one policy class for all the iterator's
  211. orthogonal properties). Soon Jeremy Siek realized he would need the
  212. library and they worked together to produce a &quot;Boostified&quot; version,
  213. which was reviewed and accepted into the library. They wrote a paper
  214. and made several important revisions of the code.</p>
  215. <p>Eventually, several shortcomings of the older library began to make
  216. the need for a rewrite apparent. Dave and Jeremy started working
  217. at the Santa Cruz C++ committee meeting in 2002, and had quickly
  218. generated a working prototype. At the urging of Mat Marcus, they
  219. decided to use the GenVoca/CRTP pattern approach, and moved the
  220. policies into the iterator class itself. Thomas Witt expressed
  221. interest and became the voice of strict compile-time checking for
  222. the project, adding uses of the SFINAE technique to eliminate false
  223. converting constructors and operators from the overload set. He
  224. also recognized the need for a separate <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>, and
  225. factored it out of <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. Finally, after a
  226. near-complete rewrite of the prototype, they came up with the
  227. library you see today.</p>
  228. <table class="docutils citation" frame="void" id="cop95" rules="none">
  229. <colgroup><col class="label" /><col /></colgroup>
  230. <tbody valign="top">
  231. <tr><td class="label"><a class="fn-backref" href="#id22">[Cop95]</a></td><td>[Coplien, 1995] Coplien, J., Curiously Recurring Template
  232. Patterns, C++ Report, February 1995, pp. 24-27.</td></tr>
  233. </tbody>
  234. </table>
  235. <!-- LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue
  236. LocalWords: ReadableIterator WritableIterator SwappableIterator cv pre iter
  237. LocalWords: ConstantLvalueIterator MutableLvalueIterator CopyConstructible TR
  238. LocalWords: ForwardTraversalIterator BidirectionalTraversalIterator lvalue
  239. LocalWords: RandomAccessTraversalIterator dereferenceable Incrementable tmp
  240. LocalWords: incrementable xxx min prev inplace png oldeqnew AccessTag struct
  241. LocalWords: TraversalTag typename lvalues DWA Hmm JGS -->
  242. </div>
  243. </div>
  244. <div class="footer">
  245. <hr class="footer" />
  246. <a class="reference external" href="index.rst">View document source</a>.
  247. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
  248. </div>
  249. </body>
  250. </html>