Loading...
Searching...
No Matches
IndexIterator.H
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2020-2025 OpenCFD Ltd.
9-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26Class
27 Foam::IndexIterator
28
29Description
30 A random-access, integer-like, input iterator for integral values.
31
32Note
33 No \c operator+(value_type, iterator) is defined
34 since this provokes misleading resolution errors
35
36Class
37 Foam::ReverseIndexIterator
38
39Description
40 A random-access, integer-like, input iterator for integral values
41 that behaves like a reverse iterator.
42
43Note
44 No \c operator+(value_type, iterator) is defined
45 since this provokes misleading resolution errors
46
47\*---------------------------------------------------------------------------*/
48
49#ifndef Foam_IndexIterator_H
50#define Foam_IndexIterator_H
51
52#include <iterator>
53#include <type_traits>
54
55// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
56
57namespace Foam
59
60/*---------------------------------------------------------------------------*\
61 Class IndexIterator Declaration
62\*---------------------------------------------------------------------------*/
63
64template<class IntType>
65class IndexIterator
66{
67 static_assert(std::is_integral_v<IntType>, "Integral required");
68
69 // Private Data
70
71 //- The current value
72 IntType value_;
74public:
76 // STL definitions (as per std::iterator)
77 typedef std::random_access_iterator_tag iterator_category;
78 typedef IntType value_type;
79 typedef IntType difference_type;
80 typedef const IntType* pointer;
81 typedef IntType reference;
82
83
84 // Constructors
85
86 //- Default construct as zero
87 constexpr IndexIterator() noexcept : value_(0) {}
88
89 //- Construct with specified value
90 constexpr IndexIterator(value_type val) noexcept : value_(val) {}
91
92
93 // Member Operators
94
95 //- Return the value
96 constexpr value_type operator*() const noexcept { return value_; }
98 //- Offset dereference operator
99 constexpr value_type operator[](value_type n) const noexcept
100 {
101 return (value_ + n);
103
104 //- Prefix increment
106 {
107 ++value_;
108 return *this;
109 }
111 //- Postfix increment
112 IndexIterator operator++(int) noexcept
113 {
114 auto old(*this);
115 ++value_;
116 return old;
117 }
118
119 //- Prefix decrement
121 {
122 --value_;
123 return *this;
124 }
125
126 //- Postfix decrement
127 IndexIterator operator--(int) noexcept
128 {
129 auto old(*this);
130 --value_;
131 return old;
132 }
133
134 //- Arbitrary increment
136 {
137 value_ += n;
138 return *this;
139 }
140
141 //- Arbitrary decrement
143 {
144 value_ -= n;
145 return *this;
146 }
147
148 //- Return iterator with offset
149 constexpr IndexIterator
150 operator+(value_type n) const noexcept { return (value_ + n); }
151
152 //- Return iterator with offset
154 operator-(value_type n) const noexcept { return (value_ - n); }
155
156 //- Difference operator
157 constexpr value_type
158 operator-(const IndexIterator& iter) const noexcept
159 {
160 return (value_ - iter.value_);
161 }
162
163
164 // Comparison
165
166 //- Test for equality of values
167 constexpr bool
168 operator==(const IndexIterator& iter) const noexcept
169 {
170 return (value_ == iter.value_);
171 }
172
173 //- Compare less-than
174 constexpr bool
175 operator<(const IndexIterator& iter) const noexcept
176 {
177 return (value_ < iter.value_);
178 }
180
181 // Derived comparisons
182
183 constexpr bool
184 operator!=(const IndexIterator& iter) const noexcept
185 {
186 return !(*this == iter);
187 }
188
189 constexpr bool
190 operator<=(const IndexIterator& iter) const noexcept
192 return !(iter < *this);
193 }
194
195 constexpr bool
196 operator>(const IndexIterator& iter) const noexcept
197 {
198 return (iter < *this);
200
201 constexpr bool
202 operator>=(const IndexIterator& iter) const noexcept
203 {
204 return !(*this < iter);
205 }
206};
207
208
209/*---------------------------------------------------------------------------*\
210 Class ReverseIndexIterator Declaration
211\*---------------------------------------------------------------------------*/
212
213template<class IntType>
215{
216 //- The current value
217 IntType value_;
218
219public:
220
221 // STL definitions (as per std::iterator)
222 typedef std::random_access_iterator_tag iterator_category;
223 typedef IntType value_type;
224 typedef IntType difference_type;
225 typedef const IntType* pointer;
226 typedef IntType reference;
228
229 // Constructors
230
231 //- Default construct as zero
232 constexpr ReverseIndexIterator() noexcept : value_(0) {}
233
234 //- Construct with specified value
235 constexpr ReverseIndexIterator(value_type n) noexcept : value_(n) {}
236
237
238 // Member Operators
240 //- Return the value
241 constexpr value_type operator*() const noexcept { return value_; }
242
243 //- Offset dereference operator
244 constexpr value_type operator[](value_type n) const noexcept
245 {
246 return (value_ - n);
247 }
248
249 //- Prefix increment
252 --value_;
253 return *this;
254 }
255
256 //- Postfix increment
257 ReverseIndexIterator operator++(int) noexcept
258 {
259 auto old(*this);
260 --value_;
261 return old;
262 }
263
264 //- Prefix decrement
267 ++value_;
268 return *this;
269 }
270
271 //- Postfix decrement
272 ReverseIndexIterator operator--(int) noexcept
273 {
274 auto old(*this);
275 ++value_;
276 return old;
277 }
278
279 //- Arbitrary increment
281 {
282 value_ -= n;
283 return *this;
284 }
285
286 //- Arbitrary decrement
288 {
289 value_ += n;
290 return *this;
291 }
292
293 //- Return iterator with offset
294 constexpr ReverseIndexIterator
295 operator+(value_type n) const noexcept { return (value_ - n); }
297 //- Return iterator with offset
298 constexpr ReverseIndexIterator
299 operator-(value_type n) const noexcept { return (value_ + n); }
300
301 //- Difference operator
302 constexpr value_type
303 operator-(const ReverseIndexIterator& iter) const noexcept
304 {
305 return (iter.value_ - value_);
307
308
309 // Comparison
310
311 //- Test for equality of values
312 constexpr bool
313 operator==(const ReverseIndexIterator& iter) const noexcept
314 {
315 return (value_ == iter.value_);
316 }
317
318 //- Compare less-than
319 constexpr bool
320 operator<(const ReverseIndexIterator& iter) const noexcept
321 {
322 return (value_ > iter.value_);
323 }
324
326 // Derived Comparisons
327
328 constexpr bool
329 operator!=(const ReverseIndexIterator& iter) const noexcept
330 {
331 return !(*this == iter);
332 }
333
334 constexpr bool
335 operator<=(const ReverseIndexIterator& iter) const noexcept
336 {
337 return !(iter < *this);
338 }
339
340 constexpr bool
341 operator>(const ReverseIndexIterator& iter) const noexcept
342 {
343 return (iter < *this);
345
346 constexpr bool
347 operator>=(const ReverseIndexIterator& iter) const noexcept
348 {
349 return !(*this < iter);
351};
352
353// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
354
355} // End namespace Foam
357// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
358
359#endif
360
361// ************************************************************************* //
label n
A random-access, integer-like, input iterator for integral values.
constexpr bool operator==(const IndexIterator &iter) const noexcept
Test for equality of values.
constexpr bool operator<(const IndexIterator &iter) const noexcept
Compare less-than.
constexpr value_type operator-(const IndexIterator &iter) const noexcept
Difference operator.
constexpr IndexIterator operator+(value_type n) const noexcept
Return iterator with offset.
constexpr bool operator>=(const IndexIterator &iter) const noexcept
constexpr value_type operator*() const noexcept
Return the value.
IndexIterator operator-(value_type n) const noexcept
Return iterator with offset.
constexpr value_type operator[](value_type n) const noexcept
Offset dereference operator.
IndexIterator & operator++() noexcept
Prefix increment.
constexpr bool operator<=(const IndexIterator &iter) const noexcept
IndexIterator & operator+=(value_type n) noexcept
Arbitrary increment.
std::random_access_iterator_tag iterator_category
IndexIterator operator--(int) noexcept
Postfix decrement.
const IntType * pointer
IndexIterator operator++(int) noexcept
Postfix increment.
IndexIterator & operator-=(value_type n) noexcept
Arbitrary decrement.
IndexIterator & operator--() noexcept
Prefix decrement.
constexpr IndexIterator() noexcept
Default construct as zero.
constexpr bool operator!=(const IndexIterator &iter) const noexcept
constexpr bool operator>(const IndexIterator &iter) const noexcept
constexpr IndexIterator(value_type val) noexcept
Construct with specified value.
A random-access, integer-like, input iterator for integral values that behaves like a reverse iterato...
constexpr ReverseIndexIterator() noexcept
Default construct as zero.
constexpr bool operator!=(const ReverseIndexIterator &iter) const noexcept
constexpr ReverseIndexIterator operator-(value_type n) const noexcept
Return iterator with offset.
constexpr ReverseIndexIterator operator+(value_type n) const noexcept
Return iterator with offset.
ReverseIndexIterator operator--(int) noexcept
Postfix decrement.
constexpr value_type operator*() const noexcept
Return the value.
ReverseIndexIterator & operator-=(value_type n) noexcept
Arbitrary decrement.
constexpr value_type operator-(const ReverseIndexIterator &iter) const noexcept
Difference operator.
constexpr value_type operator[](value_type n) const noexcept
Offset dereference operator.
constexpr ReverseIndexIterator(value_type n) noexcept
Construct with specified value.
std::random_access_iterator_tag iterator_category
constexpr bool operator<(const ReverseIndexIterator &iter) const noexcept
Compare less-than.
constexpr bool operator<=(const ReverseIndexIterator &iter) const noexcept
ReverseIndexIterator & operator++() noexcept
Prefix increment.
constexpr bool operator>=(const ReverseIndexIterator &iter) const noexcept
constexpr bool operator==(const ReverseIndexIterator &iter) const noexcept
Test for equality of values.
ReverseIndexIterator & operator+=(value_type n) noexcept
Arbitrary increment.
ReverseIndexIterator operator++(int) noexcept
Postfix increment.
constexpr bool operator>(const ReverseIndexIterator &iter) const noexcept
ReverseIndexIterator & operator--() noexcept
Prefix decrement.
Namespace for OpenFOAM.
const direction noexcept
Definition scalarImpl.H:265