1 .. Copyright David Abrahams 2006. Distributed under the Boost
2 .. Software License, Version 1.0. (See accompanying
3 .. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 , class Value = use_default
10 , class CategoryOrTraversal = use_default
11 , class Reference = use_default
12 , class Difference = use_default
14 class indirect_iterator
17 typedef /* see below */ value_type;
18 typedef /* see below */ reference;
19 typedef /* see below */ pointer;
20 typedef /* see below */ difference_type;
21 typedef /* see below */ iterator_category;
24 indirect_iterator(Iterator x);
27 class Iterator2, class Value2, class Category2
28 , class Reference2, class Difference2
32 Iterator2, Value2, Category2, Reference2, Difference2
34 , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
37 Iterator const& base() const;
38 reference operator*() const;
39 indirect_iterator& operator++();
40 indirect_iterator& operator--();
42 Iterator m_iterator; // exposition
46 The member types of ``indirect_iterator`` are defined according to
47 the following pseudo-code, where ``V`` is
48 ``iterator_traits<Iterator>::value_type``
52 if (Value is use_default) then
53 typedef remove_const<pointee<V>::type>::type value_type;
55 typedef remove_const<Value>::type value_type;
57 if (Reference is use_default) then
58 if (Value is use_default) then
59 typedef indirect_reference<V>::type reference;
61 typedef Value& reference;
63 typedef Reference reference;
65 if (Value is use_default) then
66 typedef pointee<V>::type\* pointer;
68 typedef Value\* pointer;
70 if (Difference is use_default)
71 typedef iterator_traits<Iterator>::difference_type difference_type;
73 typedef Difference difference_type;
75 if (CategoryOrTraversal is use_default)
76 typedef *iterator-category* (
77 iterator_traversal<Iterator>::type,``reference``,``value_type``
80 typedef *iterator-category* (
81 CategoryOrTraversal,``reference``,``value_type``
85 ``indirect_iterator`` requirements
86 ..................................
88 The expression ``*v``, where ``v`` is an object of
89 ``iterator_traits<Iterator>::value_type``, shall be valid
90 expression and convertible to ``reference``. ``Iterator`` shall
91 model the traversal concept indicated by ``iterator_category``.
92 ``Value``, ``Reference``, and ``Difference`` shall be chosen so
93 that ``value_type``, ``reference``, and ``difference_type`` meet
94 the requirements indicated by ``iterator_category``.
96 [Note: there are further requirements on the
97 ``iterator_traits<Iterator>::value_type`` if the ``Value``
98 parameter is not ``use_default``, as implied by the algorithm for
99 deducing the default for the ``value_type`` member.]
101 ``indirect_iterator`` models
102 ............................
104 In addition to the concepts indicated by ``iterator_category``
105 and by ``iterator_traversal<indirect_iterator>::type``, a
106 specialization of ``indirect_iterator`` models the following
107 concepts, Where ``v`` is an object of
108 ``iterator_traits<Iterator>::value_type``:
110 * Readable Iterator if ``reference(*v)`` is convertible to
113 * Writable Iterator if ``reference(*v) = t`` is a valid
114 expression (where ``t`` is an object of type
115 ``indirect_iterator::value_type``)
117 * Lvalue Iterator if ``reference`` is a reference type.
119 ``indirect_iterator<X,V1,C1,R1,D1>`` is interoperable with
120 ``indirect_iterator<Y,V2,C2,R2,D2>`` if and only if ``X`` is
121 interoperable with ``Y``.
124 ``indirect_iterator`` operations
125 ................................
127 In addition to the operations required by the concepts described
128 above, specializations of ``indirect_iterator`` provide the
129 following operations.
132 ``indirect_iterator();``
134 :Requires: ``Iterator`` must be Default Constructible.
135 :Effects: Constructs an instance of ``indirect_iterator`` with
136 a default-constructed ``m_iterator``.
139 ``indirect_iterator(Iterator x);``
141 :Effects: Constructs an instance of ``indirect_iterator`` with
142 ``m_iterator`` copy constructed from ``x``.
147 class Iterator2, class Value2, unsigned Access, class Traversal
148 , class Reference2, class Difference2
152 Iterator2, Value2, Access, Traversal, Reference2, Difference2
154 , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
157 :Requires: ``Iterator2`` is implicitly convertible to ``Iterator``.
158 :Effects: Constructs an instance of ``indirect_iterator`` whose
159 ``m_iterator`` subobject is constructed from ``y.base()``.
162 ``Iterator const& base() const;``
164 :Returns: ``m_iterator``
167 ``reference operator*() const;``
169 :Returns: ``**m_iterator``
172 ``indirect_iterator& operator++();``
174 :Effects: ``++m_iterator``
178 ``indirect_iterator& operator--();``
180 :Effects: ``--m_iterator``