Gaia-ECS v1.0.0
A simple and powerful entity component system
Loading...
Searching...
No Matches
iterator.h
1#pragma once
2#include "gaia/config/config.h"
3
4#include <cstddef>
5#include <type_traits>
6#include <utility>
7
8namespace gaia {
9 namespace core {
12
18
23 template <typename It, typename Diff>
25 public:
27 using iterator_type = It;
29 using value_type = std::remove_cv_t<std::remove_reference_t<decltype(*std::declval<It&>())>>;
31 using pointer = std::conditional_t<std::is_pointer_v<It>, It, void>;
33 using reference = decltype(*std::declval<It&>());
35 using difference_type = Diff;
38
39 private:
40 It m_current{};
41
42 public:
43 constexpr reverse_iterator() = default;
44
47 constexpr explicit reverse_iterator(It current): m_current(current) {}
48
51 GAIA_NODISCARD constexpr It base() const {
52 return m_current;
53 }
54
57 GAIA_NODISCARD constexpr decltype(auto) operator*() const {
58 auto current = m_current;
59 --current;
60 return *current;
61 }
62
65 GAIA_NODISCARD constexpr decltype(auto) operator->() const {
66 auto current = m_current;
67 --current;
68 if constexpr (std::is_pointer_v<It>)
69 return current;
70 else
71 return current.operator->();
72 }
73
77 GAIA_NODISCARD constexpr decltype(auto) operator[](difference_type offset) const {
78 return *(*this + offset);
79 }
80
84 --m_current;
85 return *this;
86 }
87
91 auto tmp = *this;
92 ++*this;
93 return tmp;
94 }
95
99 ++m_current;
100 return *this;
101 }
102
106 auto tmp = *this;
107 --*this;
108 return tmp;
109 }
110
115 m_current -= offset;
116 return *this;
117 }
118
123 m_current += offset;
124 return *this;
125 }
126
130 GAIA_NODISCARD constexpr reverse_iterator operator+(difference_type offset) const {
131 auto tmp = *this;
132 tmp += offset;
133 return tmp;
134 }
135
139 GAIA_NODISCARD constexpr reverse_iterator operator-(difference_type offset) const {
140 auto tmp = *this;
141 tmp -= offset;
142 return tmp;
143 }
144
148 GAIA_NODISCARD constexpr difference_type operator-(const reverse_iterator& other) const {
149 return (difference_type)(other.m_current - m_current);
150 }
151
155 GAIA_NODISCARD constexpr bool operator==(const reverse_iterator& other) const {
156 return m_current == other.m_current;
157 }
158
162 GAIA_NODISCARD constexpr bool operator!=(const reverse_iterator& other) const {
163 return !(*this == other);
164 }
165
169 GAIA_NODISCARD constexpr bool operator<(const reverse_iterator& other) const {
170 return other.m_current < m_current;
171 }
172
176 GAIA_NODISCARD constexpr bool operator>(const reverse_iterator& other) const {
177 return other < *this;
178 }
179
183 GAIA_NODISCARD constexpr bool operator<=(const reverse_iterator& other) const {
184 return !(other < *this);
185 }
186
190 GAIA_NODISCARD constexpr bool operator>=(const reverse_iterator& other) const {
191 return !(*this < other);
192 }
193 };
194
201 template <typename It, typename Diff>
202 GAIA_NODISCARD constexpr reverse_iterator<It, Diff> operator+(
203 Diff offset, const reverse_iterator<It, Diff>& it) {
204 return it + offset;
205 }
206
208 namespace detail {
209 template <typename, typename = void>
210 struct iterator_traits_base {}; // empty for non-iterators
211
212 template <typename It>
213 struct iterator_traits_base<
214 It, std::void_t<
215 typename It::iterator_category, typename It::value_type, typename It::difference_type,
216 typename It::pointer, typename It::reference>> {
217 using iterator_category = typename It::iterator_category;
218 using value_type = typename It::value_type;
219 using difference_type = typename It::difference_type;
220 using pointer = typename It::pointer;
221 using reference = typename It::reference;
222 };
223
224 template <typename T, bool = std::is_object_v<T>>
225 struct iterator_traits_pointer_base {
226 using iterator_category = random_access_iterator_tag;
227 using value_type = std::remove_cv_t<T>;
228 using difference_type = std::ptrdiff_t;
229 using pointer = T*;
230 using reference = T&;
231 };
232
234 template <typename T>
235 struct iterator_traits_pointer_base<T, false> {};
236
238 template <typename It>
239 struct iterator_traits: iterator_traits_base<It> {};
240
241 // Iterator traits for pointers
242 template <typename T>
243 struct iterator_traits<T*>: iterator_traits_pointer_base<T> {};
244
245 template <typename It>
246 using iterator_cat_t = typename iterator_traits<It>::iterator_category;
247 } // namespace detail
249
252 template <typename T, typename = void>
253 [[maybe_unused]] constexpr bool is_iterator_v = false;
254
257 template <typename T>
258 [[maybe_unused]] constexpr bool is_iterator_v<T, std::void_t<detail::iterator_cat_t<T>>> = true;
259
260 template <typename T>
261 struct is_iterator: std::bool_constant<is_iterator_v<T>> {};
262
265 template <typename It>
266 [[maybe_unused]] constexpr bool is_input_iter_v =
267 std::is_convertible_v<detail::iterator_cat_t<It>, input_iterator_tag>;
268
271 template <typename It>
272 [[maybe_unused]] constexpr bool is_fwd_iter_v =
273 std::is_convertible_v<detail::iterator_cat_t<It>, forward_iterator_tag>;
274
277 template <typename It>
278 [[maybe_unused]] constexpr bool is_rev_iter_v =
279 std::is_convertible_v<detail::iterator_cat_t<It>, reverse_iterator_tag>;
280
283 template <typename It>
284 [[maybe_unused]] constexpr bool is_bidi_iter_v =
285 std::is_convertible_v<detail::iterator_cat_t<It>, bidirectional_iterator_tag>;
286
289 template <typename It>
290 [[maybe_unused]] constexpr bool is_random_iter_v =
291 std::is_convertible_v<detail::iterator_cat_t<It>, random_access_iterator_tag>;
292
295 template <typename It>
296 using iterator_ref_t = typename detail::iterator_traits<It>::reference;
297
300 template <typename It>
301 using iterator_value_t = typename detail::iterator_traits<It>::value_type;
302
305 template <typename It>
306 using iterator_diff_t = typename detail::iterator_traits<It>::difference_type;
307
310 template <typename... It>
311 using common_diff_t = std::common_type_t<iterator_diff_t<It>...>;
312
318 template <typename It>
319 constexpr iterator_diff_t<It> distance(It first, It last) {
320 if constexpr (std::is_pointer_v<It> || is_random_iter_v<It>)
321 return last - first;
322 else {
323 iterator_diff_t<It> offset{};
324 while (first != last) {
325 ++first;
326 ++offset;
327 }
328 return offset;
329 }
330 }
331 } // namespace core
332} // namespace gaia
Random-access iterator that traverses an underlying iterator in reverse. The stored iterator denotes ...
Definition iterator.h:24
GAIA_NODISCARD constexpr It base() const
Returns the underlying forward iterator.
Definition iterator.h:51
constexpr reverse_iterator(It current)
Constructs a reverse iterator from its forward base iterator.
Definition iterator.h:47
GAIA_NODISCARD constexpr bool operator!=(const reverse_iterator &other) const
Checks whether two iterators have different base positions.
Definition iterator.h:162
constexpr reverse_iterator & operator+=(difference_type offset)
Advances by a number of reverse positions.
Definition iterator.h:114
decltype(*std::declval< It & >()) reference
Reference or proxy type returned by dereference.
Definition iterator.h:33
It iterator_type
Underlying iterator type.
Definition iterator.h:27
std::remove_cv_t< std::remove_reference_t< decltype(*std::declval< It & >())> > value_type
Element type returned by dereference.
Definition iterator.h:29
GAIA_NODISCARD constexpr bool operator<=(const reverse_iterator &other) const
Compares positions in reverse traversal order.
Definition iterator.h:183
GAIA_NODISCARD constexpr bool operator>(const reverse_iterator &other) const
Compares positions in reverse traversal order.
Definition iterator.h:176
GAIA_NODISCARD constexpr bool operator<(const reverse_iterator &other) const
Compares positions in reverse traversal order.
Definition iterator.h:169
Diff difference_type
Signed iterator distance type.
Definition iterator.h:35
GAIA_NODISCARD constexpr difference_type operator-(const reverse_iterator &other) const
Computes the reverse distance from another iterator.
Definition iterator.h:148
constexpr reverse_iterator & operator-=(difference_type offset)
Moves opposite to reverse traversal by a number of positions.
Definition iterator.h:122
GAIA_NODISCARD constexpr reverse_iterator operator+(difference_type offset) const
Returns an iterator advanced in reverse traversal order.
Definition iterator.h:130
GAIA_NODISCARD constexpr bool operator>=(const reverse_iterator &other) const
Compares positions in reverse traversal order.
Definition iterator.h:190
constexpr reverse_iterator operator++(int)
Advances one position in reverse traversal order.
Definition iterator.h:90
constexpr reverse_iterator operator--(int)
Moves one position opposite to reverse traversal order.
Definition iterator.h:105
GAIA_NODISCARD constexpr reverse_iterator operator-(difference_type offset) const
Returns an iterator moved opposite to reverse traversal order.
Definition iterator.h:139
constexpr reverse_iterator & operator++()
Advances one position in reverse traversal order.
Definition iterator.h:83
GAIA_NODISCARD constexpr bool operator==(const reverse_iterator &other) const
Checks whether two iterators have the same base position.
Definition iterator.h:155
std::conditional_t< std::is_pointer_v< It >, It, void > pointer
Mutable pointer type when the underlying iterator is a pointer.
Definition iterator.h:31
constexpr reverse_iterator & operator--()
Moves one position opposite to reverse traversal order.
Definition iterator.h:98
Definition iterator.h:17
Definition iterator.h:13
Definition iterator.h:10
Definition iterator.h:261
Definition iterator.h:11
Definition iterator.h:14