summaryrefslogtreecommitdiff
path: root/libs/iterator/doc/zip_iterator_ref.rst
blob: f81ccd21a5b79b3c06458cc5def89a7ee6a118b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
.. Copyright David Abrahams 2006. Distributed under the Boost
.. Software License, Version 1.0. (See accompanying
.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

::

  template<typename IteratorTuple>
  class zip_iterator
  {  

  public:
    typedef /* see below */ reference;
    typedef reference value_type;
    typedef value_type* pointer;
    typedef /* see below */ difference_type;
    typedef /* see below */ iterator_category;

    zip_iterator();
    zip_iterator(IteratorTuple iterator_tuple);

    template<typename OtherIteratorTuple>
    zip_iterator(
          const zip_iterator<OtherIteratorTuple>& other
        , typename enable_if_convertible<
                OtherIteratorTuple
              , IteratorTuple>::type* = 0     // exposition only
    );

    const IteratorTuple& get_iterator_tuple() const;

  private:
    IteratorTuple m_iterator_tuple;     // exposition only
  };

  template<typename IteratorTuple> 
  zip_iterator<IteratorTuple> 
  make_zip_iterator(IteratorTuple t);


The ``reference`` member of ``zip_iterator`` is the type of the tuple
made of the reference types of the iterator types in the ``IteratorTuple``
argument.

The ``difference_type`` member of ``zip_iterator`` is the ``difference_type``
of the first of the iterator types in the ``IteratorTuple`` argument.

The ``iterator_category`` member of ``zip_iterator`` is convertible to the
minimum of the traversal categories of the iterator types in the ``IteratorTuple``
argument. For example, if the ``zip_iterator`` holds only vector
iterators, then ``iterator_category`` is convertible to 
``boost::random_access_traversal_tag``. If you add a list iterator, then
``iterator_category`` will be convertible to ``boost::bidirectional_traversal_tag``,
but no longer to ``boost::random_access_traversal_tag``.


``zip_iterator`` requirements
...................................

All iterator types in the argument ``IteratorTuple`` shall model Readable Iterator.  


``zip_iterator`` models
.............................

The resulting ``zip_iterator`` models Readable Iterator.

The fact that the ``zip_iterator`` models only Readable Iterator does not 
prevent you from modifying the values that the individual iterators point
to. The tuple returned by the ``zip_iterator``'s ``operator*`` is a tuple 
constructed from the reference types of the individual iterators, not 
their value types. For example, if ``zip_it`` is a ``zip_iterator`` whose
first member iterator is an ``std::vector<double>::iterator``, then the
following line will modify the value which the first member iterator of
``zip_it`` currently points to:

::

    zip_it->get<0>() = 42.0;


Consider the set of standard traversal concepts obtained by taking
the most refined standard traversal concept modeled by each individual
iterator type in the ``IteratorTuple`` argument.The ``zip_iterator`` 
models the least refined standard traversal concept in this set.

``zip_iterator<IteratorTuple1>`` is interoperable with
``zip_iterator<IteratorTuple2>`` if and only if ``IteratorTuple1``
is interoperable with ``IteratorTuple2``.



``zip_iterator`` operations
.................................

In addition to the operations required by the concepts modeled by
``zip_iterator``, ``zip_iterator`` provides the following
operations.


``zip_iterator();``

:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple``
  default constructed.


``zip_iterator(IteratorTuple iterator_tuple);``

:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple``
  initialized to ``iterator_tuple``.


::

    template<typename OtherIteratorTuple>
    zip_iterator(
          const zip_iterator<OtherIteratorTuple>& other
        , typename enable_if_convertible<
                OtherIteratorTuple
              , IteratorTuple>::type* = 0     // exposition only
    );

:Returns: An instance of ``zip_iterator`` that is a copy of ``other``.
:Requires: ``OtherIteratorTuple`` is implicitly convertible to ``IteratorTuple``.


``const IteratorTuple& get_iterator_tuple() const;``

:Returns: ``m_iterator_tuple``


``reference operator*() const;``

:Returns: A tuple consisting of the results of dereferencing all iterators in
  ``m_iterator_tuple``.


``zip_iterator& operator++();``

:Effects: Increments each iterator in ``m_iterator_tuple``.
:Returns: ``*this``


``zip_iterator& operator--();``

:Effects: Decrements each iterator in ``m_iterator_tuple``.
:Returns: ``*this``

::

    template<typename IteratorTuple> 
    zip_iterator<IteratorTuple> 
    make_zip_iterator(IteratorTuple t);

:Returns: An instance of ``zip_iterator<IteratorTuple>`` with ``m_iterator_tuple``
  initialized to ``t``.