mirror of
https://github.com/boostorg/iterator.git
synced 2025-05-11 05:23:52 +00:00
- Fixed multiple broken links to the documentation. Converted some of the links to internal references to the QuickBook documentation. Not all links converted because some of the QuickBook pages are not completely converted. - Renamed utilities.qbk to type_traits.qbk and removed the part duplicated by concept_checking.qbk. - Renamed traits.qbk to iterator_traits.qbk to better disambiguate with other type traits documented in type_traits.qbk. - Converted some of the headings in iterator concepts to sections to be able to give those sections ids. This allows to reference those sections from other places in the documentation. - In order to preserve the more compact pagination of the new sections (i.e. to have multiple sections on one page, like it was with headings) set chunk.section.depth=2 in the docs Jamfile.
299 lines
12 KiB
Plaintext
299 lines
12 KiB
Plaintext
|
|
[library Boost.Iterator
|
|
[/ version 1.0.1]
|
|
[quickbook 1.6]
|
|
[authors [Abrahams, David], [Siek, Jeremy], [Witt, Thomas]]
|
|
[copyright 2003 2005 David Abrahams Jeremy Siek Thomas Witt]
|
|
[category iterator]
|
|
[id iterator]
|
|
[dirname iterator]
|
|
[purpose
|
|
]
|
|
[license
|
|
Distributed under the Boost Software License, Version 1.0.
|
|
(See accompanying file LICENSE_1_0.txt or copy at
|
|
<ulink url="http://www.boost.org/LICENSE_1_0.txt">
|
|
http://www.boost.org/LICENSE_1_0.txt
|
|
</ulink>)
|
|
]
|
|
]
|
|
|
|
[/ QuickBook Document version 1.0 ]
|
|
|
|
[/ Images ]
|
|
|
|
[def _note_ [$images/note.png]]
|
|
[def _alert_ [$images/caution.png]]
|
|
[def _detail_ [$images/note.png]]
|
|
[def _tip_ [$images/tip.png]]
|
|
|
|
[/ Links ]
|
|
|
|
[def _iterator_ [@../../../iterator/doc/index.html Boost.Iterator]]
|
|
[def _concept_check_ [@../../../concept_check/index.html Boost.ConceptCheck]]
|
|
|
|
[template sub[x]'''<subscript>'''[x]'''</subscript>''']
|
|
|
|
[section:intro Introduction]
|
|
|
|
[def _concepts_ [@http://www.boost.org/more/generic_programming.html#concept concepts]]
|
|
|
|
The Boost Iterator Library contains two parts. The first
|
|
is a system of _concepts_ which extend the C++ standard
|
|
iterator requirements. The second is a framework of
|
|
components for building iterators based on these
|
|
extended concepts and includes several useful iterator
|
|
adaptors. The extended iterator concepts have been
|
|
carefully designed so that old-style iterators
|
|
can fit in the new concepts and so that new-style
|
|
iterators will be compatible with old-style algorithms,
|
|
though algorithms may need to be updated if they want to
|
|
take full advantage of the new-style iterator
|
|
capabilities. Several components of this library have
|
|
been accepted into the C++ standard technical report.
|
|
The components of the Boost Iterator Library replace the
|
|
older Boost Iterator Adaptor Library.
|
|
|
|
|
|
[h2 New-Style Iterators]
|
|
|
|
[def _N1185_ [@http://www.gotw.ca/publications/N1185.pdf N1185]]
|
|
[def _N1211_ [@http://www.gotw.ca/publications/N1211.pdf N1211]]
|
|
[def _GOTW_50_ [@http://www.gotw.ca/gotw/050.htm Guru of the Week]]
|
|
|
|
The iterator categories defined in C++98 are extremely limiting
|
|
because they bind together two orthogonal concepts: traversal and
|
|
element access. For example, because a random access iterator is
|
|
required to return a reference (and not a proxy) when dereferenced,
|
|
it is impossible to capture the capabilities of
|
|
`vector<bool>::iterator` using the C++98 categories. This is the
|
|
infamous "`vector<bool>` is not a container, and its iterators
|
|
aren't random access iterators", debacle about which Herb Sutter
|
|
wrote two papers for the standards comittee (_N1185_ and _N1211_),
|
|
and a _GOTW_50_. New-style iterators go well beyond
|
|
patching up `vector<bool>`, though: there are lots of other
|
|
iterators already in use which can't be adequately represented by
|
|
the existing concepts. For details about the new iterator
|
|
concepts, see our [@../new-iter-concepts.html Standard Proposal for New-Style Iterators].
|
|
|
|
[h2 Iterator Facade and Adaptor]
|
|
|
|
[/
|
|
[def _facade_ [link iterator.generic.facade facade]]
|
|
[def _adaptor_ [link iterator.generic.adaptor adaptor]]
|
|
]
|
|
[def _facade_ [@../iterator_facade.html facade]]
|
|
[def _adaptor_ [@../iterator_adaptor.html adaptor]]
|
|
|
|
Writing standard-conforming iterators is tricky, but the need comes
|
|
up often. In order to ease the implementation of new iterators,
|
|
the Boost.Iterator library provides the _facade_ class template,
|
|
which implements many useful defaults and compile-time checks
|
|
designed to help the iterator author ensure that his iterator is
|
|
correct.
|
|
|
|
It is also common to define a new iterator that is similar to some
|
|
underlying iterator or iterator-like type, but that modifies some
|
|
aspect of the underlying type's behavior. For that purpose, the
|
|
library supplies the _adaptor_ class template, which is specially
|
|
designed to take advantage of as much of the underlying type's
|
|
behavior as possible.
|
|
|
|
Both _facade_ and _adaptor_ as well as many of the [link iterator.specialized specialized
|
|
adaptors] mentioned below have been proposed for standardization
|
|
([@../facade-and-adaptor.html Standard Proposal For Iterator Facade and Adaptor]).
|
|
|
|
[h2 Specialized Adaptors]
|
|
|
|
The iterator library supplies a useful suite of standard-conforming
|
|
iterator templates based on the Boost [link
|
|
iterator.intro.iterator_facade_and_adaptor iterator facade and adaptor]
|
|
templates.
|
|
|
|
[def _counting_ [link iterator.specialized.counting `counting_iterator`]]
|
|
[def _filter_ [link iterator.specialized.filter `filter_iterator`]]
|
|
[def _function_ [link iterator.specialized.function_output `function_output_iterator`]]
|
|
[def _indirect_ [link iterator.specialized.indirect `indirect_iterator`]]
|
|
[def _permutation_ [link iterator.specialized.permutation `permutation_iterator`]]
|
|
[def _reverse_ [link iterator.specialized.reverse `reverse_iterator`]]
|
|
[def _shared_ [link iterator.specialized.shared_container `shared_container_iterator`]]
|
|
[def _transform_ [link iterator.specialized.transform `transform_iterator`]]
|
|
[def _zip_ [link iterator.specialized.zip `zip_iterator`]]
|
|
|
|
[def _shared_ptr_ [@../../smart_ptr/shared_ptr.htm `shared_ptr`]]
|
|
|
|
* _counting_: an iterator over a sequence of consecutive values.
|
|
Implements a "lazy sequence"
|
|
|
|
* _filter_: an iterator over the subset of elements of some
|
|
sequence which satisfy a given predicate
|
|
|
|
* _function_: an output iterator wrapping a unary function
|
|
object; each time an element is written into the dereferenced
|
|
iterator, it is passed as a parameter to the function object.
|
|
|
|
* _indirect_: an iterator over the objects *pointed-to* by the
|
|
elements of some sequence.
|
|
|
|
* _permutation_: an iterator over the elements of some random-access
|
|
sequence, rearranged according to some sequence of integer indices.
|
|
|
|
* _reverse_: an iterator which traverses the elements of some
|
|
bidirectional sequence in reverse. Corrects many of the
|
|
shortcomings of C++98's `std::reverse_iterator`.
|
|
|
|
* _shared_: an iterator over elements of a container whose
|
|
lifetime is maintained by a _shared_ptr_ stored in the iterator.
|
|
|
|
* _transform_: an iterator over elements which are the result of
|
|
applying some functional transformation to the elements of an
|
|
underlying sequence. This component also replaces the old
|
|
`projection_iterator_adaptor`.
|
|
|
|
* _zip_: an iterator over tuples of the elements at corresponding
|
|
positions of heterogeneous underlying iterators.
|
|
|
|
[h2 Iterator Utilities]
|
|
|
|
[h3 Traits]
|
|
|
|
[def _pointee_ [link iterator.utilities.traits `pointee.hpp`]]
|
|
[def _iterator_traits_ [link iterator.utilities.iterator_traits `iterator_traits.hpp`]]
|
|
[def _interoperable_ [@../interoperable.html `interoperable.hpp`]]
|
|
[def _MPL_ [@../../mpl/doc/index.html [*MPL]]]
|
|
|
|
* _pointee_: Provides the capability to deduce the referent types
|
|
of pointers, smart pointers and iterators in generic code. Used
|
|
in _indirect_.
|
|
|
|
* _iterator_traits_: Provides _MPL_ compatible metafunctions which
|
|
retrieve an iterator's traits. Also corrects for the deficiencies
|
|
of broken implementations of `std::iterator_traits`.
|
|
|
|
[/
|
|
* _interoperable_: Provides an _MPL_ compatible metafunction for
|
|
testing iterator interoperability
|
|
]
|
|
|
|
[h3 Testing and Concept Checking]
|
|
|
|
[def _iterator_concepts_ [link iterator.concepts `iterator_concepts.hpp`]]
|
|
[def _iterator_archetypes_ [link iterator.utilities.archetypes `iterator_archetypes.hpp`]]
|
|
|
|
* _iterator_concepts_: Concept checking classes for the new iterator concepts.
|
|
|
|
* _iterator_archetypes_: Concept archetype classes for the new iterators concepts.
|
|
|
|
[h2 Iterator Algorithms]
|
|
|
|
The library provides a number of generic algorithms for use with iterators. These
|
|
algorithms take advantage of the new concepts defined by the library to provide
|
|
better performance and functionality.
|
|
|
|
[def _advance_ [link iterator.algorithms.advance `advance.hpp`]]
|
|
[def _distance_ [link iterator.algorithms.distance `distance.hpp`]]
|
|
[def _next_prior_ [link iterator.algorithms.next_prior `next_prior.hpp`]]
|
|
|
|
* _advance_: Provides `advance()` function for advancing an iterator a given number
|
|
of positions forward or backward.
|
|
|
|
* _distance_: Provides `distance()` function for computing distance between two
|
|
iterators.
|
|
|
|
* _next_prior_: Provides `next()` and `prior()` functions for obtaining
|
|
next and prior iterators to a given iterator. The functions are also compatible
|
|
with non-iterator types.
|
|
|
|
[endsect]
|
|
|
|
[include concepts.qbk]
|
|
|
|
[section:generic Generic Iterators]
|
|
|
|
[include facade.qbk]
|
|
|
|
[include adaptor.qbk]
|
|
|
|
[endsect]
|
|
|
|
[include specialized_adaptors.qbk]
|
|
|
|
[section:utilities Utilities]
|
|
|
|
[include archetypes.qbk]
|
|
|
|
[include concept_checking.qbk]
|
|
|
|
[include iterator_traits.qbk]
|
|
|
|
[include type_traits.qbk]
|
|
|
|
[endsect]
|
|
|
|
[include algorithms.qbk]
|
|
|
|
[section:upgrading Upgrading from the old Boost Iterator Adaptor Library]
|
|
|
|
[def _type_generator_ [@http://www.boost.org/more/generic_programming.html#type_generator type generator]]
|
|
|
|
If you have been using the old Boost Iterator Adaptor library to
|
|
implement iterators, you probably wrote a `Policies` class which
|
|
captures the core operations of your iterator. In the new library
|
|
design, you'll move those same core operations into the body of the
|
|
iterator class itself. If you were writing a family of iterators,
|
|
you probably wrote a _type_generator_ to build the
|
|
`iterator_adaptor` specialization you needed; in the new library
|
|
design you don't need a type generator (though may want to keep it
|
|
around as a compatibility aid for older code) because, due to the
|
|
use of the Curiously Recurring Template Pattern (CRTP) [Cop95]_,
|
|
you can now define the iterator class yourself and acquire
|
|
functionality through inheritance from `iterator_facade` or
|
|
`iterator_adaptor`. As a result, you also get much finer control
|
|
over how your iterator works: you can add additional constructors,
|
|
or even override the iterator functionality provided by the
|
|
library.
|
|
|
|
|
|
If you're looking for the old `projection_iterator` component,
|
|
its functionality has been merged into _transform_iterator_: as
|
|
long as the function object's `result_type` (or the `Reference`
|
|
template argument, if explicitly specified) is a true reference
|
|
type, _transform_iterator_ will behave like
|
|
`projection_iterator` used to.
|
|
|
|
[endsect]
|
|
|
|
[section:history History]
|
|
|
|
In 2000 Dave Abrahams was writing an iterator for a container of
|
|
pointers, which would access the pointed-to elements when
|
|
dereferenced. Naturally, being a library writer, he decided to
|
|
generalize the idea and the Boost Iterator Adaptor library was born.
|
|
Dave was inspired by some writings of Andrei Alexandrescu and chose a
|
|
policy based design (though he probably didn't capture Andrei's idea
|
|
very well - there was only one policy class for all the iterator's
|
|
orthogonal properties). Soon Jeremy Siek realized he would need the
|
|
library and they worked together to produce a "Boostified" version,
|
|
which was reviewed and accepted into the library. They wrote a paper
|
|
and made several important revisions of the code.
|
|
|
|
Eventually, several shortcomings of the older library began to make
|
|
the need for a rewrite apparent. Dave and Jeremy started working
|
|
at the Santa Cruz C++ committee meeting in 2002, and had quickly
|
|
generated a working prototype. At the urging of Mat Marcus, they
|
|
decided to use the GenVoca/CRTP pattern approach, and moved the
|
|
policies into the iterator class itself. Thomas Witt expressed
|
|
interest and became the voice of strict compile-time checking for
|
|
the project, adding uses of the SFINAE technique to eliminate false
|
|
converting constructors and operators from the overload set. He
|
|
also recognized the need for a separate `iterator_facade`, and
|
|
factored it out of `iterator_adaptor`. Finally, after a
|
|
near-complete rewrite of the prototype, they came up with the
|
|
library you see today.
|
|
|
|
[:\[Coplien, 1995\] Coplien, J., Curiously Recurring Template
|
|
Patterns, C++ Report, February 1995, pp. 24-27.]
|
|
|
|
[endsect]
|
|
|