libstdc++
iterator.h
Go to the documentation of this file.
1// -*- C++ -*-
2
3// Copyright (C) 2007-2024 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the terms
7// of the GNU General Public License as published by the Free Software
8// Foundation; either version 3, or (at your option) any later
9// version.
10
11// This library is distributed in the hope that it will be useful, but
12// WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14// General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file parallel/iterator.h
26 * @brief Helper iterator classes for the std::transform() functions.
27 * This file is a GNU parallel extension to the Standard C++ Library.
28 */
29
30// Written by Johannes Singler.
31
32#ifndef _GLIBCXX_PARALLEL_ITERATOR_H
33#define _GLIBCXX_PARALLEL_ITERATOR_H 1
34
36#include <bits/stl_pair.h>
37
38namespace __gnu_parallel
39{
40 /** @brief A pair of iterators. The usual iterator operations are
41 * applied to both child iterators.
42 */
43 template<typename _Iterator1, typename _Iterator2,
44 typename _IteratorCategory>
45 class _IteratorPair : public std::pair<_Iterator1, _Iterator2>
46 {
47 private:
49
50 public:
51 typedef _IteratorCategory iterator_category;
52 typedef void value_type;
53
55 typedef typename _TraitsType::difference_type difference_type;
56 typedef _IteratorPair* pointer;
57 typedef _IteratorPair& reference;
58
59 _IteratorPair() { }
60
61 _IteratorPair(const _Iterator1& __first, const _Iterator2& __second)
62 : _Base(__first, __second) { }
63
64 // Pre-increment operator.
66 operator++()
67 {
70 return *this;
71 }
72
73 // Post-increment operator.
74 const _IteratorPair
75 operator++(int)
77
78 // Pre-decrement operator.
80 operator--()
81 {
84 return *this;
85 }
86
87 // Post-decrement operator.
88 const _IteratorPair
89 operator--(int)
91
92 // Type conversion.
93 operator _Iterator2() const
94 { return _Base::second; }
95
97 operator=(const _IteratorPair& __other)
98 {
99 _Base::first = __other.first;
100 _Base::second = __other.second;
101 return *this;
102 }
103
105 operator+(difference_type __delta) const
106 { return _IteratorPair(_Base::first + __delta, _Base::second + __delta);
107 }
108
109 difference_type
110 operator-(const _IteratorPair& __other) const
111 { return _Base::first - __other.first; }
112 };
113
114
115 /** @brief A triple of iterators. The usual iterator operations are
116 applied to all three child iterators.
117 */
118 template<typename _Iterator1, typename _Iterator2, typename _Iterator3,
119 typename _IteratorCategory>
121 {
122 public:
123 typedef _IteratorCategory iterator_category;
124 typedef void value_type;
126 difference_type;
127 typedef _IteratorTriple* pointer;
128 typedef _IteratorTriple& reference;
129
130 _Iterator1 _M_first;
131 _Iterator2 _M_second;
132 _Iterator3 _M_third;
133
134 _IteratorTriple() { }
135
136 _IteratorTriple(const _Iterator1& __first, const _Iterator2& __second,
137 const _Iterator3& __third)
138 {
139 _M_first = __first;
140 _M_second = __second;
141 _M_third = __third;
142 }
143
144 // Pre-increment operator.
146 operator++()
147 {
148 ++_M_first;
149 ++_M_second;
150 ++_M_third;
151 return *this;
152 }
153
154 // Post-increment operator.
155 const _IteratorTriple
156 operator++(int)
157 { return _IteratorTriple(_M_first++, _M_second++, _M_third++); }
158
159 // Pre-decrement operator.
161 operator--()
162 {
163 --_M_first;
164 --_M_second;
165 --_M_third;
166 return *this;
167 }
168
169 // Post-decrement operator.
170 const _IteratorTriple
171 operator--(int)
172 { return _IteratorTriple(_M_first--, _M_second--, _M_third--); }
173
174 // Type conversion.
175 operator _Iterator3() const
176 { return _M_third; }
177
179 operator=(const _IteratorTriple& __other)
180 {
181 _M_first = __other._M_first;
182 _M_second = __other._M_second;
183 _M_third = __other._M_third;
184 return *this;
185 }
186
188 operator+(difference_type __delta) const
189 { return _IteratorTriple(_M_first + __delta, _M_second + __delta,
190 _M_third + __delta); }
191
192 difference_type
193 operator-(const _IteratorTriple& __other) const
194 { return _M_first - __other._M_first; }
195 };
196}
197
198#endif /* _GLIBCXX_PARALLEL_ITERATOR_H */
Includes the original header files concerned with iterators except for stream iterators....
GNU parallel code for public use.
Traits class for iterators.
Struct holding two objects of arbitrary type.
Definition stl_pair.h:286
_Iterator1 first
The first member.
Definition stl_pair.h:290
_Iterator2 second
The second member.
Definition stl_pair.h:291
A pair of iterators. The usual iterator operations are applied to both child iterators.
Definition iterator.h:46
A triple of iterators. The usual iterator operations are applied to all three child iterators.
Definition iterator.h:121