CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
Iterator.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
12
14
15#include <algorithm>
16#include <exception>
17#include <functional>
18#include <iterator>
19#include <tuple>
20#include <type_traits>
21#include <utility>
22
23namespace CeresEngine {
24
26 struct IterationEnd {
27 const IterationEnd& operator*() const { return *this; }
28 };
29
31 namespace impl {
32 namespace compare {
33 struct ByValue {
34 template<class T> CE_FORCE_INLINE bool operator()(const T& a, const T& b) const { return a == b; }
35 };
36
37 struct ByValueGTE {
38 template<class T> CE_FORCE_INLINE bool operator()(const T& a, const T& b) const { return a >= b; }
39 };
40
41 struct ByAddress {
42 template<class T> CE_FORCE_INLINE bool operator()(const T& a, const T& b) const { return &a == &b; }
43 };
44
46 template<typename... ArgsA, typename... ArgsB> bool operator()(const std::tuple<ArgsA...>& a, const std::tuple<ArgsB...>& b) const {
47 static_assert(sizeof...(ArgsA) == sizeof...(ArgsB), "comparing invalid tuples");
48 return std::get<sizeof...(ArgsA) - 1>(a) == std::get<sizeof...(ArgsB) - 1>(b);
49 }
50 };
51
52 struct Never {
53 template<class A, class B> bool operator()(const A&, const B&) const { return false; }
54 };
55 } // namespace compare
56
58 namespace increment {
59 template<int A> struct ByValue {
60 template<class T> CE_FORCE_INLINE void operator()(T& v) const { v = v + A; }
61 };
62
64 template<class T> CE_FORCE_INLINE void operator()(T& v) const { ++v; }
65 };
66
68 template<class T> CE_FORCE_INLINE void operator()(T& v) const { v++; }
69 };
70
71 template<typename Callback> struct ByCallback {
72 mutable Callback callback;
73 explicit ByCallback(Callback callback) : callback(std::move(callback)) {}
74 template<typename T> void operator()(T& v) const { callback(v); }
75 };
76
78 template<typename... Args> void dummy(Args&&...) {}
79 template<class T, size_t... Idx> void updateValues(T& v, std::index_sequence<Idx...>) { dummy(++std::get<Idx>(v)...); }
80 template<typename... Args> void operator()(std::tuple<Args...>& v) { updateValues(v, std::make_index_sequence<sizeof...(Args)>()); }
81 };
82
83 template<typename T, typename M, M Method> struct ByMemberCall {
84 using R = decltype((std::declval<T&>().*Method)());
85 R operator()(T& v) const { return (v.*Method)(); }
86 };
87
88 } // namespace increment
89
91 namespace dereference {
92 struct ByValue {
93 template<class T> CE_FORCE_INLINE T operator()(T& v) const { return v; }
94 };
95
97 template<class T> CE_FORCE_INLINE const T& operator()(T& v) const { return v; }
98 };
99
101 template<class T> CE_FORCE_INLINE T& operator()(T& v) const { return v; }
102 };
103
105 template<class T> CE_FORCE_INLINE decltype(auto) operator()(T& v) const { return *v; }
106 };
107
111 template<class T> CE_FORCE_INLINE auto& operator()(T& v) const {
112 CE_ASSERT(*v != nullptr);
113 return **v;
114 }
115 };
116
117 template<typename Callback> struct ByCallback {
118 mutable Callback callback;
119 explicit ByCallback(Callback callback) : callback(std::move(callback)) {}
120 template<typename T> decltype(auto) operator()(T& v) const { return callback(*v); }
121 };
122
124 template<size_t Idx, class T> auto constexpr getElement(T& v) const {
125 if constexpr(std::is_reference<decltype(*std::get<Idx>(v))>::value) {
126 return std::reference_wrapper(*std::get<Idx>(v));
127 } else {
128 return *std::get<Idx>(v);
129 }
130 }
131
132 template<size_t... Idx, class T> auto getReferenceTuple(T& v, std::index_sequence<Idx...>) const {
133 return std::make_tuple(getElement<Idx>(v)...);
134 }
135
136 template<typename... Args> auto operator()(std::tuple<Args...>& v) const {
137 return getReferenceTuple(v, std::make_index_sequence<sizeof...(Args)>());
138 }
139 };
140
141 template<typename T, typename M, M Method> struct ByMemberCall {
142 using R = decltype((std::declval<T&>().*Method)());
143 R operator()(T& v) const { return (v.*Method)(); }
144 };
145
146 template<typename M, M Member> struct ByMemberVariable {
147 template<typename T> auto& operator()(T& v) const { return ((*v).*Member); }
148 };
149
150 } // namespace dereference
151 } // namespace impl
152
154 struct UndefinedIteratorException : public std::exception {
155 [[nodiscard]] const char* what() const noexcept override { return "attempt to dereference an undefined iterator"; }
156 };
157
165 template<class T, typename D = impl::dereference::ByValueReference, typename C = impl::compare::ByValue> class IteratorPrototype {
166 public:
167 // iterator traits
168 using iterator_category = std::input_iterator_tag;
169 using reference = decltype(std::declval<D>()(std::declval<T&>()));
170 using value_type = typename std::decay<reference>::type;
172 using difference_type = std::ptrdiff_t;
173
174 protected:
177
178 public:
179 mutable T value;
181
183 explicit IteratorPrototype(T&& first, D&& _dereferencer = D(), C&& _compare = C())
185
187 CE_FORCE_INLINE auto* operator->() const { return &**this; }
188
189 friend bool operator==(const IteratorPrototype& lhs, const IteratorPrototype& rhs) { return lhs.compare(lhs.value, rhs.value); }
190 friend bool operator!=(const IteratorPrototype& lhs, const IteratorPrototype& rhs) { return !(lhs == rhs); }
191 };
192
193 template<class T> IteratorPrototype(const T&) -> IteratorPrototype<T>;
194 template<class T, typename D> IteratorPrototype(const T&, const D&) -> IteratorPrototype<T, D>;
195 template<class T, typename D, typename C> IteratorPrototype(const T&, const D&, const C&) -> IteratorPrototype<T, D, C>;
196
197 namespace impl {
198 struct WithState {
199 constexpr static bool hasState = true;
200 bool state = true;
201 };
203 constexpr static bool hasState = false;
204 };
205
206 template<class F, class T> static constexpr bool needsState = !std::is_same<void, decltype(std::declval<F>()(std::declval<T&>()))>::value;
207 } // namespace impl
208
211 template<class T, typename F = impl::increment::ByValue<1>, typename D = impl::dereference::ByValueReference, typename C = impl::compare::ByValue>
212 class Iterator final : public IteratorPrototype<T, D, C>, public std::conditional<impl::needsState<F, T>, impl::WithState, impl::WithoutState>::type {
213 protected:
216
217 public:
218 template<typename TF = F, typename TD = D, typename TC = C>
219 explicit Iterator(T&& begin, F&& _callback = F(), D&& _dereferencer = D(), C&& _compare = C())
222
224 if constexpr(Iterator::hasState) {
225 if(Iterator::state) {
226 Iterator::state = callback(Base::value);
227 }
228 } else {
230 }
231 return *this;
232 }
233
235 if constexpr(Iterator::hasState) {
236 if(!Iterator::state) {
238 }
239 }
241 }
242
243 friend bool operator==(const Iterator& lhs, const IterationEnd& rhs) { return !(lhs != rhs); }
244
245 friend bool operator!=(const Iterator& lhs, const IterationEnd& rhs) {
246 if constexpr(Iterator::hasState) {
247 return lhs.state;
248 } else {
249 return true;
250 }
251 }
252
253 explicit operator bool() const {
254 if constexpr(Iterator::hasState) {
255 return Iterator::state;
256 } else {
257 return true;
258 }
259 }
260 };
261
262 template<class T> Iterator(const T&) -> Iterator<T>;
263 template<class T, typename F> Iterator(const T&, const F&) -> Iterator<T, F>;
264 template<class T, typename F, typename D> Iterator(const T&, const F&, const D&) -> Iterator<T, F, D>;
265 template<class T, typename F, typename D, typename C> Iterator(const T&, const F&, const D&, const C&) -> Iterator<T, F, D, C>;
266
267 template<class T, typename F = impl::increment::ByValue<1>, typename D = impl::dereference::ByValueReference, typename C = impl::compare::ByValue>
268 Iterator<T, F, D, C> makeIterator(T&& t, F f = F(), D&& d = D(), C&& c = C()) {
269 return Iterator<T, F, D, C>(std::forward<T>(t), std::forward<F>(f), std::forward<D>(d), std::forward<C>(c));
270 }
271
273 template<class T, class A = impl::increment::ByValue<1>> using ReferenceIterator = Iterator<T*, A, impl::dereference::ByValueDereference>;
274
276 template<class IB, class IE = IB, class Context = void> struct WrappedIterator {
280 IB&& begin() const { return std::move(beginIterator); }
281 IE&& end() const { return std::move(endIterator); }
283 };
284
286 template<class IB, class IE> struct WrappedIterator<IB, IE> {
289 IB&& begin() const { return std::move(beginIterator); }
290 IE&& end() const { return std::move(endIterator); }
292 };
293
296 template<class IB, class IE, class Context> auto wrap(IB&& a, IE&& b, Context&& context) {
297 return WrappedIterator<IB, IE, Context>(std::forward<IB>(a), std::forward<IE>(b), std::forward<Context>(context));
298 }
299
302 template<class IB, class IE, class Context> auto wrap(Pair<IB, IE>&& pair, Context&& context) {
303 return wrap(std::forward<IB>(pair.first), std::forward<IE>(pair.second), std::forward<Context>(context));
304 }
305
308 template<class IB, class IE> auto wrap(IB&& a, IE&& b) { return WrappedIterator<IB, IE>(std::forward<IB>(a), std::forward<IE>(b)); }
309
312 template<class IB, class IE> auto wrap(Pair<IB, IE>&& pair) { return wrap(std::forward<IB>(pair.first), std::forward<IE>(pair.second)); }
313
315 template<class T> struct RangeIterator : public IteratorPrototype<T, impl::dereference::ByValue, impl::compare::ByValueGTE> {
317
318 RangeIterator(const T& start, const T& _increment = 1)
319 : IteratorPrototype<T, impl::dereference::ByValue, impl::compare::ByValueGTE>(T(start)), increment(_increment) {}
320
323 return *this;
324 }
325 };
326
327 template<class T> RangeIterator<T> rangeValue(T v, T i = 1) { return RangeIterator<T>(v, i); }
328
331 template<class T> auto range(T begin, T end, T increment) {
332 if constexpr(std::is_floating_point_v<T>) {
333 return wrap(rangeValue(end, increment), rangeValue(end, increment));
334 } else {
335 const T actualEnd = end - ((end - begin) % increment);
336 return wrap(rangeValue(begin, increment), rangeValue(actualEnd, increment));
337 }
338 }
339
342 template<class T> auto range(T begin, T end) { return range<T>(begin, end, 1); }
343
346 template<class T> auto range(T end) { return range<T>(0, end, 1); }
347
350 template<class T = UInt64> auto range() { return range<T>(std::numeric_limits<T>::max()); }
351
354 template<typename T = UInt64, typename Container> auto indices(const Container& container) { return range<T>(T(0), T(container.size())); }
355
358 template<typename Container> auto indices(const Container& container) {
359 using T = decltype(container.size());
360 return indices<T>(container);
361 }
362
364 template<class T> auto reverse(T& v) { return wrap(v.rbegin(), v.rend()); }
365
369 template<typename... Args> auto zip(Args&&... args) {
370 auto begin = Iterator(std::make_tuple(args.begin()...), impl::increment::ByTupleIncrement(), impl::dereference::ByTupleDereference(),
372 auto end = Iterator(std::make_tuple(args.end()...), impl::increment::ByTupleIncrement(), impl::dereference::ByTupleDereference(),
374 return wrap(std::move(begin), std::move(end));
375 }
376
380 template<typename Container> auto keys(Container& container) {
381 using PairType = std::decay_t<decltype(*container.begin())>;
382 using Dereference = impl::dereference::ByMemberVariable<decltype(&PairType::first), &PairType::first>;
383
384 return wrap(makeIterator(container.begin(), impl::increment::ByPrefixIncrement(), Dereference()),
386 }
387
389 template<typename Container> auto keys(Container&& container) {
390 using PairType = std::decay_t<decltype(*container.begin())>;
391 using Dereference = impl::dereference::ByMemberVariable<decltype(&PairType::first), &PairType::first>;
392
393 return wrap(makeIterator(container.begin(), impl::increment::ByPrefixIncrement(), Dereference()),
394 makeIterator(container.end(), impl::increment::ByPrefixIncrement(), Dereference()), std::forward<Container>(container));
395 }
396
400 template<typename Container> auto values(Container& container) {
401 using PairType = std::decay_t<decltype(*container.begin())>;
402 using Dereference = impl::dereference::ByMemberVariable<decltype(&PairType::second), &PairType::second>;
403
404 return wrap(makeIterator(container.begin(), impl::increment::ByPrefixIncrement(), Dereference()),
406 }
407
409 template<typename Container> auto values(Container&& container) {
410 using PairType = std::decay_t<decltype(*container.begin())>;
411 using Dereference = impl::dereference::ByMemberVariable<decltype(&PairType::second), &PairType::second>;
412
413 return wrap(makeIterator(container.begin(), impl::increment::ByPrefixIncrement(), Dereference()),
414 makeIterator(container.end(), impl::increment::ByPrefixIncrement(), Dereference()), std::forward<Container>(container));
415 }
416
421 template<typename Container> auto dereference(Container& container) {
424 }
425
427 template<typename Container> auto dereference(Container&& container) {
429 makeIterator(container.end(), impl::increment::ByPrefixIncrement(), impl::dereference::ByPointerReference()), std::forward<Container>(container));
430 }
431
436 template<typename Container, typename Transform> auto transform(Container& container, Transform&& transform) {
439 }
440
442 template<typename Container, typename Transform> auto transform(Container&& container, Transform&& transform) {
444 makeIterator(container.end(), impl::increment::ByPrefixIncrement(), impl::dereference::ByCallback(transform)), std::forward<Container>(container));
445 }
446
451 template<typename Container, typename Predicate> auto filter(Container& container, Predicate&& predicate) {
452 auto begin = std::find_if(container.begin(), container.end(), predicate);
453 const auto filter = [end = container.end(), predicate = std::forward<Predicate>(predicate)](auto& iterator) mutable {
454 iterator = std::find_if(++iterator, end, predicate);
455 };
458 }
459
461 template<typename Container, typename Predicate> auto filter(Container&& container, Predicate&& predicate) {
462 auto begin = std::find_if(container.begin(), container.end(), predicate);
463 const auto filter = [end = container.end(), predicate = std::forward<Predicate>(predicate)](auto& iterator) mutable {
464 iterator = std::find_if(++iterator, end, predicate);
465 };
467 makeIterator(container.end(), impl::increment::ByCallback(filter), impl::dereference::ByValueDereference()), std::forward<Container>(container));
468 }
469
473 template<typename Container> auto unique(Container& container) {
474 const auto callback = [end = container.end(), current = container.begin()](auto& iterator) mutable {
475 current = iterator = std::find_if_not(++iterator, end, [&](auto& candidate) {
476 return candidate == *current;
477 });
478 };
481 }
482
486 template<typename Container> auto unique(Container&& container) {
487 const auto callback = [end = container.end(), current = container.begin()](auto& iterator) mutable {
488 current = iterator = std::find_if_not(++iterator, end, [&](auto& candidate) {
489 return candidate == *current;
490 });
491 };
493 makeIterator(container.end(), impl::increment::ByCallback(callback), impl::dereference::ByValueDereference()), std::forward<Container>(container));
494 }
495
499 template<typename Container> auto skipNull(Container& container) {
500 return filter(container, [](const auto& v) { return v != nullptr; });
501 }
502
504 template<typename Container> auto skipNull(Container&& container) {
505 return filter(std::forward<Container>(container), [](const auto& v) { return v != nullptr; });
506 }
507
511 template<typename Container> auto weakLock(Container& container) {
512 return transform(container, [](const auto& value) { return value.lock(); });
513 }
514
516 template<typename Container> auto weakLock(Container&& container) {
517 return transform(std::forward<Container>(container), [](const auto& value) { return value.lock(); });
518 }
519
524
529 template<class T> struct MakeIterable {
530 mutable Iterator<T, impl::increment::ByMemberCall<T, decltype(&T::advance), &T::advance>,
531 impl::dereference::ByMemberCall<T, decltype(&T::value), &T::value>, impl::compare::ByValue>
533
534 auto&& begin() const {
535 if constexpr(std::is_base_of<InitializedIterable, T>::value) {
536 start.state = start.value.init();
537 }
538 return std::move(start);
539 }
540 auto end() const { return IterationEnd(); }
541
542 explicit MakeIterable(T&& value) : start(std::move(value)) {}
543 template<typename... Args> explicit MakeIterable(Args&&... args) : start(T(std::forward<Args>(args)...)) {}
544 };
545
547 template<class T, class I = impl::increment::ByValue<1>> auto valuesBetween(T* begin, T* end) {
548 return wrap(ReferenceIterator<T, I>(begin), Iterator(end));
549 }
550
552 template<class T, class A> void fill(A& arr, const T& value) {
553 for(auto& v : arr) {
554 v = value;
555 }
556 }
557
564 template<class A, class B, class T = impl::dereference::ByValueReference> void copy(const A& a, B& b, T&& t = T()) {
565 for(auto [v1, v2] : zip(a, b)) {
566 v2 = t(v1);
567 }
568 }
569
572 template<class I, class C> decltype(&*std::declval<I>()) found(const I& it, C& container) {
573 if(it != container.end()) {
574 return &*it;
575 }
576 return nullptr;
577 }
578
581 template<class I, class C> bool eraseIfFound(const I& it, C& container) {
582 if(it != container.end()) {
583 container.erase(it);
584 return true;
585 }
586 return false;
587 }
588
589 // /// Returns a pointer to the value if found, otherwise `nullptr`.
590 // /// Usage: `if(auto v = find(map, key)) { do_something(v); }`
591 // template<class C, class V> auto find(C& c, V&& v) {
592 // auto it = c.find(v);
593 // return found(it, c);
594 // }
595
596} // namespace CeresEngine
597
598template<class T, typename F, typename D, typename C> struct std::iterator_traits<CeresEngine::Iterator<T, F, D, C>> {
600
601 using difference_type = typename Iterator::difference_type;
602 using value_type = typename Iterator::value_type;
603 using pointer = typename Iterator::pointer;
604 using reference = typename Iterator::reference;
605 using iterator_category = typename Iterator::iterator_category;
606};
#define CE_FORCE_INLINE
Definition Macros.hpp:367
#define CE_ASSERT(...)
Definition Macros.hpp:323
IteratorPrototype where advance is defined by the functional held by F.
Definition Iterator.hpp:212
friend bool operator!=(const Iterator &lhs, const IterationEnd &rhs)
Definition Iterator.hpp:245
friend bool operator==(const Iterator &lhs, const IterationEnd &rhs)
Definition Iterator.hpp:243
Base::DereferencedType operator*() const
Definition Iterator.hpp:234
Iterator(T &&begin, F &&_callback=F(), D &&_dereferencer=D(), C &&_compare=C())
Definition Iterator.hpp:219
Iterator & operator++()
Definition Iterator.hpp:223
F callback
Definition Iterator.hpp:215
Base class for simple iterators.
Definition Iterator.hpp:165
decltype(std::declval< D >()(std::declval< T & >())) reference
Definition Iterator.hpp:169
auto * operator->() const
Definition Iterator.hpp:187
IteratorPrototype(T &&first, D &&_dereferencer=D(), C &&_compare=C())
Definition Iterator.hpp:183
decltype(dereferencer(value)) DereferencedType
Definition Iterator.hpp:180
value_type * pointer
Definition Iterator.hpp:171
C compare
Definition Iterator.hpp:176
D dereferencer
Definition Iterator.hpp:175
T value
Definition Iterator.hpp:179
friend bool operator!=(const IteratorPrototype &lhs, const IteratorPrototype &rhs)
Definition Iterator.hpp:190
typename std::decay< reference >::type value_type
Definition Iterator.hpp:170
std::input_iterator_tag iterator_category
Definition Iterator.hpp:168
std::ptrdiff_t difference_type
Definition Iterator.hpp:172
friend bool operator==(const IteratorPrototype &lhs, const IteratorPrototype &rhs)
Definition Iterator.hpp:189
DereferencedType operator*()
Definition Iterator.hpp:186
Definition Application.hpp:19
bool eraseIfFound(const I &it, C &container)
Removes a value from a container with find method.
Definition Iterator.hpp:581
auto range()
Returns an iterator that increases it's value from 0 to end by 1 for each step.
Definition Iterator.hpp:350
Iterator< T, F, D, C > makeIterator(T &&t, F f=F(), D &&d=D(), C &&c=C())
Definition Iterator.hpp:268
auto indices(const Container &container)
Returns an iterator that increases it's value from 0 to container.size() by 1 on each step.
Definition Iterator.hpp:354
RangeIterator< T > rangeValue(T v, T i=1)
Definition Iterator.hpp:327
auto zip(Args &&... args)
Returns an iterable object where all argument iterators are traversed simultaneously.
Definition Iterator.hpp:369
auto valuesBetween(T *begin, T *end)
Iterates over the dereferenced values between begin and end.
Definition Iterator.hpp:547
@ Method
Indicates that the item is a method.
std::pair< First, Second > Pair
Pair is a struct template that provides a way to store two heterogeneous objects as a single unit.
Definition Pair.hpp:18
auto skipNull(Container &container)
Returns an iterable object that iterates over the non-null values of container.
Definition Iterator.hpp:499
auto move(Vector3 position)
Moves a entity to the given position.
Definition Helpers.hpp:22
auto values(Container &container)
Returns an iterable object that iterates over the values of a map-like container.
Definition Iterator.hpp:400
Iterator(const T &) -> Iterator< T >
auto weakLock(Container &container)
Returns an iterable object that iterates over the locked weak pointers of Container.
Definition Iterator.hpp:511
auto wrap(IB &&a, IE &&b, Context &&context)
Wraps two iterators into a single-use container with begin/end methods to match the C++ iterator conv...
Definition Iterator.hpp:296
auto keys(Container &container)
Returns an iterable object that iterates over the keys of a map-like container.
Definition Iterator.hpp:380
constexpr auto predicate(Callable &&callable) noexcept
Helper function to create a new predicate from a lambda.
Definition Predicate.hpp:390
auto unique(Container &container)
Returns an iterable object that iterates over all unique values on the container.
Definition Iterator.hpp:473
auto dereference(Container &container)
Returns an iterable object that iterates over the values of Container but also dereferences the point...
Definition Iterator.hpp:421
@ Transform
Indicates that the object transform is dirty.
void copy(const A &a, B &b, T &&t=T())
Copies values from one container to another.
Definition Iterator.hpp:564
auto transform(Container &container, Transform &&transform)
Returns an iterable object that iterates over the values of the container and applies transform to ev...
Definition Iterator.hpp:436
void fill(A &arr, const T &value)
Copy-assigns the given value to every element in a container.
Definition Iterator.hpp:552
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
auto reverse(T &v)
Wraps the rbegin and rend iterators.
Definition Iterator.hpp:364
decltype(&*std::declval< I >() found)(const I &it, C &container)
Returns a pointer to the value if found, otherwise nullptr.
Definition Iterator.hpp:572
auto filter(Container &container, Predicate &&predicate)
Returns an iterable object that iterates over the values of the container and applies transform to ev...
Definition Iterator.hpp:451
Definition Span.hpp:668
When used as a base class for a iterator type, MakeIterable will call the bool init() member before i...
Definition Iterator.hpp:523
The end state for self-contained iterators.
Definition Iterator.hpp:26
const IterationEnd & operator*() const
Definition Iterator.hpp:27
Take a class T with that defines the methods T::advance() and O T::value() for any type O and wraps i...
Definition Iterator.hpp:529
MakeIterable(Args &&... args)
Definition Iterator.hpp:543
MakeIterable(T &&value)
Definition Iterator.hpp:542
Iterator< T, impl::increment::ByMemberCall< T, decltype(&T::advance), &T::advance >, impl::dereference::ByMemberCall< T, decltype(&T::value), &T::value >, impl::compare::ByValue > start
Definition Iterator.hpp:532
auto && begin() const
Definition Iterator.hpp:534
auto end() const
Definition Iterator.hpp:540
A type that predicate types must extend to allow automatic operator overloading.
Definition Predicate.hpp:19
Helper class for range().
Definition Iterator.hpp:315
RangeIterator(const T &start, const T &_increment=1)
Definition Iterator.hpp:318
RangeIterator & operator++()
Definition Iterator.hpp:321
T increment
Definition Iterator.hpp:316
Exception when dereferencing an undefined iterator value.
Definition Iterator.hpp:154
const char * what() const noexcept override
Definition Iterator.hpp:155
IB && begin() const
Definition Iterator.hpp:289
IE && end() const
Definition Iterator.hpp:290
IE endIterator
Definition Iterator.hpp:288
IB beginIterator
Definition Iterator.hpp:287
WrappedIterator(IB &&begin, IE &&end)
Definition Iterator.hpp:291
Helper class for wrap().
Definition Iterator.hpp:276
IB && begin() const
Definition Iterator.hpp:280
Context mContext
Definition Iterator.hpp:277
IB beginIterator
Definition Iterator.hpp:278
IE endIterator
Definition Iterator.hpp:279
WrappedIterator(IB &&begin, IE &&end, Context &&context)
Definition Iterator.hpp:282
IE && end() const
Definition Iterator.hpp:281
Definition Iterator.hpp:198
static constexpr bool hasState
Definition Iterator.hpp:199
bool state
Definition Iterator.hpp:200
Definition Iterator.hpp:202
static constexpr bool hasState
Definition Iterator.hpp:203
Definition Iterator.hpp:41
bool operator()(const T &a, const T &b) const
Definition Iterator.hpp:42
bool operator()(const std::tuple< ArgsA... > &a, const std::tuple< ArgsB... > &b) const
Definition Iterator.hpp:46
Definition Iterator.hpp:37
bool operator()(const T &a, const T &b) const
Definition Iterator.hpp:38
Definition Iterator.hpp:33
bool operator()(const T &a, const T &b) const
Definition Iterator.hpp:34
Definition Iterator.hpp:52
bool operator()(const A &, const B &) const
Definition Iterator.hpp:53
ByCallback(Callback callback)
Definition Iterator.hpp:119
Callback callback
Definition Iterator.hpp:118
const T & operator()(T &v) const
Definition Iterator.hpp:97
decltype((std::declval< T & >().*Method)()) R
Definition Iterator.hpp:142
R operator()(T &v) const
Definition Iterator.hpp:143
auto & operator()(T &v) const
Definition Iterator.hpp:147
Dereferencing helper used to dereference a pointer type from a pointer iterator.
Definition Iterator.hpp:110
auto & operator()(T &v) const
Definition Iterator.hpp:111
auto constexpr getElement(T &v) const
Definition Iterator.hpp:124
auto operator()(std::tuple< Args... > &v) const
Definition Iterator.hpp:136
auto getReferenceTuple(T &v, std::index_sequence< Idx... >) const
Definition Iterator.hpp:132
Definition Iterator.hpp:92
T operator()(T &v) const
Definition Iterator.hpp:93
T & operator()(T &v) const
Definition Iterator.hpp:101
Callback callback
Definition Iterator.hpp:72
ByCallback(Callback callback)
Definition Iterator.hpp:73
void operator()(T &v) const
Definition Iterator.hpp:74
R operator()(T &v) const
Definition Iterator.hpp:85
decltype((std::declval< T & >().*Method)()) R
Definition Iterator.hpp:84
void operator()(T &v) const
Definition Iterator.hpp:68
void operator()(T &v) const
Definition Iterator.hpp:64
void operator()(std::tuple< Args... > &v)
Definition Iterator.hpp:80
void dummy(Args &&...)
Definition Iterator.hpp:78
void updateValues(T &v, std::index_sequence< Idx... >)
Definition Iterator.hpp:79
Definition Iterator.hpp:59
void operator()(T &v) const
Definition Iterator.hpp:60