forked from boostorg/iterator
initial commit
[SVN r1143]
This commit is contained in:
253
doc/facade-and-adaptor.rst
Executable file
253
doc/facade-and-adaptor.rst
Executable file
@@ -0,0 +1,253 @@
|
|||||||
|
+++++++++++++++++++++++++++++
|
||||||
|
Iterator Facade and Adaptor
|
||||||
|
+++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
:Author: David Abrahams, Jeremy Siek, Thomas Witt
|
||||||
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
|
||||||
|
:organization: `Boost Consulting`_, Indiana University `Open Systems Lab`_, University of Hanover `Institute for Transport Railway Operation and Construction`_
|
||||||
|
:date: $Date$
|
||||||
|
|
||||||
|
:copyright: Copyright Dave Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
|
||||||
|
|
||||||
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
.. _`Open Systems Lab`: http://www.osl.iu.edu
|
||||||
|
.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de
|
||||||
|
|
||||||
|
:abstract: We propose to introduce a new system of iterator concepts
|
||||||
|
which treats access and positioning independently. We also
|
||||||
|
propose two class templates that make it easier to build
|
||||||
|
new standard-conforming iterators and to adapt existing
|
||||||
|
iterator types.
|
||||||
|
|
||||||
|
.. contents:: Table of Contents
|
||||||
|
|
||||||
|
============
|
||||||
|
Motivation
|
||||||
|
============
|
||||||
|
|
||||||
|
Iterators play an important role in modern C++ programming. The
|
||||||
|
iterator is the central abstraction of the algorithms of the Standard
|
||||||
|
Library, allowing algorithms to be re-used in in a wide variety of
|
||||||
|
contexts.
|
||||||
|
|
||||||
|
Iterators
|
||||||
|
=========
|
||||||
|
|
||||||
|
The power of iterators derives from several key features:
|
||||||
|
|
||||||
|
- Iterators form a rich family of concepts [#concept]_ whose
|
||||||
|
functionality varies along several axes: movement, dereferencing,
|
||||||
|
and associated type exposure.
|
||||||
|
|
||||||
|
- The existing iterator concepts of the C++ standard form a refinement
|
||||||
|
hierarchy which allows the same basic interface elements to
|
||||||
|
implement diverse functionality.
|
||||||
|
|
||||||
|
- Because built-in pointer types model the RandomAccessIterator
|
||||||
|
concept, iterators can be both efficient and convenient to use.
|
||||||
|
|
||||||
|
The C++ Standard Library contains a wide variety of useful
|
||||||
|
iterators. Every one of the standard containers comes with constant
|
||||||
|
and mutable iterators[#mutable]_, and also reverse versions of those
|
||||||
|
same iterators which traverse the container in the opposite direction.
|
||||||
|
The Standard also supplies ``istream_iterator`` and
|
||||||
|
``ostream_iterator`` for reading from and writing to streams,
|
||||||
|
``insert_iterator``, ``front_insert_iterator`` and
|
||||||
|
``back_insert_iterator`` for inserting elements into containers, and
|
||||||
|
``raw_storage_iterator`` for initializing raw memory [7].
|
||||||
|
|
||||||
|
Despite the many iterators supplied by the Standard Library, many
|
||||||
|
obvious iterators are missing, and creating new iterator types is
|
||||||
|
still a common task for C++ programmers. The literature documents
|
||||||
|
several of these, for example line_iterator [3] Constant_iterator
|
||||||
|
[9]. The iterator abstraction is so powerful, however, that we expect
|
||||||
|
programmers will always need to invent new iterator types.
|
||||||
|
|
||||||
|
|
||||||
|
Adaptors
|
||||||
|
========
|
||||||
|
|
||||||
|
Because iterators combine traversal, indirection, and associated type
|
||||||
|
exposure, it is common to want to adapt one iterator to form a new
|
||||||
|
one. This strategy allows one to reuse some of original iterator's
|
||||||
|
axes of variation while redefining others. For example, the Standard
|
||||||
|
provides reverse_iterator, which adapts any BidirectionalIterator by
|
||||||
|
inverting its direction of traversal. As with plain iterators,
|
||||||
|
iterator adaptors defined outside the Standard have become commonplace
|
||||||
|
in the literature:
|
||||||
|
|
||||||
|
|
||||||
|
* Checked iter[13] adds bounds-checking to an existing iterator.
|
||||||
|
|
||||||
|
* The iterators of the View Template Library[14], which adapts
|
||||||
|
containers, are themselves adaptors over the underlying iterators.
|
||||||
|
|
||||||
|
|
||||||
|
* smart iterators [5] adapt an iterator<6F>s dereferencing behavior by
|
||||||
|
applying a function object to the object being referenced and
|
||||||
|
returning the result.
|
||||||
|
|
||||||
|
|
||||||
|
* Custom iterators [4], in which a variety of adaptor types are enumerated.
|
||||||
|
|
||||||
|
|
||||||
|
* compound iterators [1], which access a slice out of a container of containers.
|
||||||
|
|
||||||
|
|
||||||
|
* Several iterator adaptors from the MTL [12]. The MTL contains a
|
||||||
|
strided iterator, where each call to ``operator++()`` moves the
|
||||||
|
iterator ahead by some constant factor, and a scaled iterator, which
|
||||||
|
multiplies the dereferenced value by some constant.
|
||||||
|
|
||||||
|
|
||||||
|
.. [#concept] We use the term concept to mean a set of requirements
|
||||||
|
that a type must satisfy to be used with a particular template
|
||||||
|
parameter.
|
||||||
|
|
||||||
|
.. [#mutable] The term mutable iterator refers to iterators over objects that
|
||||||
|
can be changed by assigning to the dereferenced iterator, while
|
||||||
|
constant iterator refers to iterators over objects that cannot be
|
||||||
|
modified.
|
||||||
|
|
||||||
|
To automate the repetitive work of constructing iterators, we propose
|
||||||
|
``iterator_facade``, an iterator base class template which provides
|
||||||
|
the rich interface of standard iterators and delegates its
|
||||||
|
implementation to member functions of the derived class. We also
|
||||||
|
propose ``iterator_adaptor``, a base class generator designed
|
||||||
|
specifically for creating iterator adaptors. Because iterators
|
||||||
|
usually have many of the features of their underlying iterator type,
|
||||||
|
the default features of ``iterator_adaptor`` are those of its base
|
||||||
|
[#base]_. The user can selectively replace these features in a
|
||||||
|
derived iterator class.
|
||||||
|
|
||||||
|
.. [#base] The term "Base" is not meant to imply the use of
|
||||||
|
inheritance. We have followed the lead of the standard library,
|
||||||
|
which provides a base() function to access the underlying iterator
|
||||||
|
object of a reverse - iterator adaptor.
|
||||||
|
|
||||||
|
Core Elements of the Iterator Concept
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
The first step in designing such a generalized model of the iterator concept is to identify
|
||||||
|
the core elements of its interface. We have identified the following core behaviors for
|
||||||
|
iterators:
|
||||||
|
|
||||||
|
|
||||||
|
* dereferencing
|
||||||
|
* incrementing
|
||||||
|
* decrementing
|
||||||
|
* equality comparison
|
||||||
|
* random-access motion
|
||||||
|
* distance measurement
|
||||||
|
|
||||||
|
In addition to the behaviors listed above, the core interface elements
|
||||||
|
include the associated types exposed through iterator traits: value
|
||||||
|
type, reference, pointer, and iterator category. The library supports
|
||||||
|
two ways of specifying these: as traditional template parameters and
|
||||||
|
also as named template parameters (described below), and uses a system
|
||||||
|
of smart defaults which in most cases reduces the number of these
|
||||||
|
types that must be specified.
|
||||||
|
|
||||||
|
|
||||||
|
From Building Models to Building Adaptors
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
A generalized iterator generator is useful (helping to create new iterator types from
|
||||||
|
scratch), but a generalized iterator adaptor is even more useful. An adaptor generator
|
||||||
|
allows one to build whole families of iterator instances based on existing iterators.
|
||||||
|
|
||||||
|
In the Boost Iterator Adaptor Library, the iterator adaptor class template plays
|
||||||
|
the roles of both iterator generator and iterator adaptor generator. The behaviors of
|
||||||
|
iterator adaptor instances are supplied through a policies class [2] which allows
|
||||||
|
users to specialize adaptation. Users go beyond generating new iterator types to easily
|
||||||
|
generating new iterator adaptor families.
|
||||||
|
|
||||||
|
The library contains several examples of specialized adaptors which were quickly
|
||||||
|
implemented using iterator adaptor:
|
||||||
|
|
||||||
|
|
||||||
|
* Indirect Iterator Adaptor, which iterates over iterators, pointers, or smart pointers
|
||||||
|
and applies an extra level of dereferencing.
|
||||||
|
|
||||||
|
|
||||||
|
* Reverse Iterator Adaptor, which inverts the direction of a Base iterator<6F>s motion,
|
||||||
|
while allowing adapted constant and mutable iterators to interact in the expected
|
||||||
|
ways. We will discuss this further in Section 5.2.1.
|
||||||
|
|
||||||
|
* Transform Iterator Adaptor, which applies a user-defined function object to the
|
||||||
|
underlying values when dereferenced. We will show how this adaptor is implemented
|
||||||
|
in Section 3.1.
|
||||||
|
|
||||||
|
|
||||||
|
* Projection Iterator Adaptor, which is similar to Transform Iterator Adaptor except
|
||||||
|
that when dereferenced it returns by-reference instead of by-value.
|
||||||
|
|
||||||
|
|
||||||
|
* Filter Iterator Adaptor, which provides a view of an iterator range in which some
|
||||||
|
elements of the underlying range are skipped.
|
||||||
|
|
||||||
|
|
||||||
|
* Counting Iterator Adaptor, which adapts any incrementable
|
||||||
|
type (e.g. integers, iterators) so that incrementing/decrementing
|
||||||
|
the adapted iterator and dereferencing it produces successive values
|
||||||
|
of the Base type.
|
||||||
|
|
||||||
|
|
||||||
|
* Function Output Iterator Adaptor, which makes it easier to create custom output
|
||||||
|
iterators.
|
||||||
|
|
||||||
|
Based on the examples in the library, users have generated many new adaptors,
|
||||||
|
among them a permutation adaptor which applies some permutation to a RandomAccessIterator,
|
||||||
|
and a strided adaptor, which adapts a RandomAccessIterator by multiplying
|
||||||
|
its unit of motion by a constant factor. In addition, the Boost Graph Library
|
||||||
|
(BGL) uses iterator adaptors to adapt other graph libraries, such as
|
||||||
|
LEDA [10] and Stanford GraphBase [8], to the BGL interface (which
|
||||||
|
requires C++ Standard compliant iterators).
|
||||||
|
|
||||||
|
|
||||||
|
The Boost iterator adaptor Class Template
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
The iterator adaptor class template simplifies the creation of iterators by automating
|
||||||
|
the implementation of redundant operators and delegating functions and by taking
|
||||||
|
care of the complex details of iterator implementation.
|
||||||
|
|
||||||
|
The central design feature of iterator adaptor is parameterization by
|
||||||
|
a policies class. The policies class is the primary communication
|
||||||
|
mechanism between the iterator implementer and the iterator adaptor;
|
||||||
|
it specifies how the new iterator type behaves. Unlike the policy
|
||||||
|
classes in [2], we group several policies into a single class as this
|
||||||
|
proved more convenient for iterator implementation.
|
||||||
|
|
||||||
|
========================
|
||||||
|
Impact on the Standard
|
||||||
|
========================
|
||||||
|
|
||||||
|
xxxx
|
||||||
|
|
||||||
|
========
|
||||||
|
Design
|
||||||
|
========
|
||||||
|
|
||||||
|
xxx
|
||||||
|
|
||||||
|
===============
|
||||||
|
Proposed Text
|
||||||
|
===============
|
||||||
|
|
||||||
|
xxx
|
||||||
|
|
||||||
|
Standard Iterator Tags
|
||||||
|
======================
|
||||||
|
|
||||||
|
xxx
|
||||||
|
|
||||||
|
``iterator_facade``
|
||||||
|
===================
|
||||||
|
|
||||||
|
xxx
|
||||||
|
|
||||||
|
``iterator_adaptor``
|
||||||
|
====================
|
||||||
|
|
||||||
|
xxx
|
Reference in New Issue
Block a user