OGLplus  (0.59.0) a C++ wrapper for rendering APIs

iterator.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_ITERATOR_HPP
10 #define EAGINE_ITERATOR_HPP
11 
12 #include <iterator>
13 
14 namespace eagine {
15 //------------------------------------------------------------------------------
22 template <typename T, typename Derived>
24 public:
26  using value_type = T;
27 
29  using difference_type = decltype(std::declval<T>() - std::declval<T>());
30 
32  constexpr basic_iterable_type() = default;
33 
35  constexpr basic_iterable_type(T value) noexcept
36  : _value{value} {}
37 
39  explicit constexpr operator T() const noexcept {
40  return _value;
41  }
42 
44  constexpr auto operator++() noexcept -> auto& {
45  ++_value;
46  return self();
47  }
48 
50  constexpr auto operator+=(difference_type d) noexcept -> auto& {
51  _value += d;
52  return self();
53  }
54 
56  constexpr auto operator++(int) noexcept -> Derived {
57  Derived res(self());
58  ++_value;
59  return res;
60  }
61 
63  friend constexpr auto
65  Derived res(a.self());
66  res += d;
67  return res;
68  }
69 
71  auto constexpr operator--() noexcept -> auto& {
72  --_value;
73  return self();
74  }
75 
77  auto constexpr operator-=(difference_type d) noexcept -> auto& {
78  _value -= d;
79  return self();
80  }
81 
83  auto constexpr operator--(int) noexcept -> Derived {
84  Derived res(self());
85  --_value;
86  return res;
87  }
88 
90  friend constexpr auto
92  Derived res(a.self());
93  res -= d;
94  return res;
95  }
96 
98  constexpr friend auto
100  -> difference_type {
101  return a._value - b._value;
102  }
103 
105  constexpr friend auto
107  return a._value == b._value;
108  }
109 
111  constexpr friend auto
113  return a._value != b._value;
114  }
115 
117  constexpr friend auto
119  return a._value < b._value;
120  }
121 
123  constexpr friend auto
125  return a._value <= b._value;
126  }
127 
129  constexpr friend auto
131  return a._value > b._value;
132  }
133 
135  constexpr friend auto
137  return a._value >= b._value;
138  }
139 
140 protected:
141  T _value{};
142 
143  constexpr auto self() noexcept -> Derived& {
144  return *static_cast<Derived*>(this);
145  }
146 };
147 //------------------------------------------------------------------------------
153 template <typename T, typename Derived>
154 class basic_selfref_iterator : public basic_iterable_type<T, Derived> {
155 public:
157  using reference = const T&;
158 
160  using pointer = const T*;
161 
163  using iterator_category = std::random_access_iterator_tag;
164 
166 
168  constexpr auto operator*() const noexcept -> const T& {
169  return this->_value;
170  }
171 };
172 //------------------------------------------------------------------------------
176 template <typename T>
177 struct selfref_iterator : basic_selfref_iterator<T, selfref_iterator<T>> {
179 };
180 //------------------------------------------------------------------------------
189 template <
190  typename Iterator,
191  typename T,
192  typename S,
193  typename Transform,
194  typename Derived>
196  : public basic_selfref_iterator<Iterator, Derived> {
197 public:
199  constexpr basic_transforming_iterator() = default;
200 
202  constexpr basic_transforming_iterator(Iterator iter, Transform transf)
203  : _base{iter}
204  , _transf{std::move(transf)} {}
205 
207  using value_type = T;
208 
210  using reference = const T&;
211 
213  using pointer = const T*;
214 
216  constexpr auto operator*() const -> const T& {
217  _tempval = _transf(**_base_iter());
218  return _tempval;
219  }
220 
221 private:
223  Transform _transf{};
224 
225  mutable S _tempval{};
226 
227  constexpr auto _base_iter() const noexcept -> const _base& {
228  return *this;
229  }
230 };
231 //------------------------------------------------------------------------------
232 template <typename Iterator, typename T, typename Transform, typename Derived>
233 class basic_transforming_iterator<Iterator, T, T&, Transform, Derived>
234  : public basic_selfref_iterator<Iterator, Derived> {
235 private:
236  using _base = basic_selfref_iterator<Iterator, Derived>;
237  Transform _transf{};
238 
239  auto _base_iter() const noexcept -> const _base& {
240  return *this;
241  }
242 
243 public:
244  constexpr basic_transforming_iterator() = default;
245 
246  constexpr basic_transforming_iterator(Iterator iter, Transform transf)
247  : _base{iter}
248  , _transf{std::move(transf)} {}
249 
250  using value_type = T;
251  using reference = const T&;
252  using pointer = const T*;
253 
254  constexpr auto operator*() -> T& {
255  return _transf(**_base_iter());
256  }
257 
258  constexpr auto operator*() const -> const T& {
259  return _transf(**_base_iter());
260  }
261 };
262 //------------------------------------------------------------------------------
269 template <typename Iterator, typename T, typename S, typename Transform>
272  Iterator,
273  T,
274  S,
275  Transform,
276  transforming_iterator<Iterator, T, S, Transform>> {
278  Iterator,
279  T,
280  S,
281  Transform,
284 };
285 //------------------------------------------------------------------------------
293 template <typename Iterator, typename T, typename S, typename Derived>
296  Iterator,
297  T,
298  S,
299  S (*)(typename std::iterator_traits<Iterator>::reference) noexcept,
300  Derived> {
302  Iterator,
303  T,
304  S,
305  S (*)(typename std::iterator_traits<Iterator>::reference) noexcept,
306  Derived>;
307 
308 public:
309  constexpr basic_noexcept_casting_iterator(Iterator iter)
310  : _base{iter, &_cast} {}
311 
312 private:
313  static constexpr auto
314  _cast(typename std::iterator_traits<Iterator>::reference r) noexcept -> T {
315  return static_cast<T>(r);
316  }
317 };
318 //------------------------------------------------------------------------------
324 template <typename Iterator, typename T, typename S>
327  Iterator,
328  T,
329  S,
330  noexcept_casting_iterator<Iterator, T, S>> {
332  Iterator,
333  T,
334  S,
336 };
337 //------------------------------------------------------------------------------
338 } // namespace eagine
339 
340 #endif // EAGINE_ITERATOR_HPP
constexpr basic_transforming_iterator()=default
Default constructor.
value_type
Value tree value element data type enumeration.
Definition: interface.hpp:27
constexpr friend auto operator-(basic_iterable_type a, difference_type d) noexcept
Difference operator.
Definition: iterator.hpp:91
Common code is placed in this namespace.
Definition: eagine.hpp:21
constexpr friend auto operator>=(basic_iterable_type a, basic_iterable_type b) noexcept
Greater-equal comparison.
Definition: iterator.hpp:136
constexpr auto operator-=(difference_type d) noexcept -> auto &
Subtraction operator.
Definition: iterator.hpp:77
constexpr auto operator++(int) noexcept -> Derived
Post-increment operator.
Definition: iterator.hpp:56
constexpr basic_iterable_type()=default
Default constructor.
constexpr friend auto operator>(basic_iterable_type a, basic_iterable_type b) noexcept
Greater-than comparison.
Definition: iterator.hpp:130
Iterator referencing the wrapped iterable type.
Definition: iterator.hpp:154
constexpr auto operator*() const -> const T &
Dereference operation.
Definition: iterator.hpp:216
Iterator transforming the referenced elements.
Definition: iterator.hpp:195
Iterator type-casting the referenced elements.
Definition: iterator.hpp:294
constexpr friend auto operator<=(basic_iterable_type a, basic_iterable_type b) noexcept
Less-equal comparison.
Definition: iterator.hpp:124
const Iterator & reference
Alias for reference type.
Definition: iterator.hpp:157
constexpr friend auto operator!=(basic_iterable_type a, basic_iterable_type b) noexcept
Non-equality comparison.
Definition: iterator.hpp:112
Default instantiation of basic_noexcept_casting_iterator.
Definition: iterator.hpp:325
constexpr auto operator*() const noexcept -> const T &
Dereference operator.
Definition: iterator.hpp:168
Default instantiation of basic_selfref_iterator.
Definition: iterator.hpp:177
constexpr basic_iterable_type(T value) noexcept
Initializing constructor.
Definition: iterator.hpp:35
decltype(std::declval< Iterator >() - std::declval< Iterator >()) difference_type
Alias for the difference type.
Definition: iterator.hpp:29
constexpr auto operator++() noexcept -> auto &
Pre-increment operator.
Definition: iterator.hpp:44
constexpr auto operator--() noexcept -> auto &
Pre-decrement operator.
Definition: iterator.hpp:71
const Iterator * pointer
Alias for pointer type.
Definition: iterator.hpp:160
constexpr friend auto operator-(basic_iterable_type a, basic_iterable_type b) noexcept -> difference_type
Subtraction operator.
Definition: iterator.hpp:99
static auto operator*(const MC1 &mc1, const MC2 &mc2) noexcept
Multiplication operator for matrix constructors.
Definition: matrix.hpp:588
std::random_access_iterator_tag iterator_category
Iterator caregoty.
Definition: iterator.hpp:163
const T & reference
Alias for pointer type.
Definition: iterator.hpp:210
constexpr friend auto operator<(basic_iterable_type a, basic_iterable_type b) noexcept
Less-than comparison.
Definition: iterator.hpp:118
constexpr friend auto operator+(basic_iterable_type a, difference_type d) noexcept
Addition operator.
Definition: iterator.hpp:64
constexpr auto operator--(int) noexcept -> Derived
Post-decrement operator.
Definition: iterator.hpp:83
Template used in implementation of some iterators.
Definition: iterator.hpp:23
constexpr auto operator+=(difference_type d) noexcept -> auto &
Addition operator.
Definition: iterator.hpp:50
constexpr basic_transforming_iterator(Iterator iter, Transform transf)
Initialization for the underlying iterator and transform callable.
Definition: iterator.hpp:202
constexpr friend auto operator==(basic_iterable_type a, basic_iterable_type b) noexcept
Equality comparison.
Definition: iterator.hpp:106
Default instantiation of basic_transforming_iterator.
Definition: iterator.hpp:270
Iterator value_type
Alias for the value type.
Definition: iterator.hpp:26

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).