2#include "gaia/config/config.h"
23 template <
typename It,
typename Diff>
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>;
51 GAIA_NODISCARD
constexpr It
base()
const {
57 GAIA_NODISCARD
constexpr decltype(
auto)
operator*()
const {
58 auto current = m_current;
65 GAIA_NODISCARD
constexpr decltype(
auto) operator->()
const {
66 auto current = m_current;
68 if constexpr (std::is_pointer_v<It>)
71 return current.operator->();
77 GAIA_NODISCARD
constexpr decltype(
auto)
operator[](
difference_type offset)
const {
78 return *(*
this + offset);
156 return m_current == other.m_current;
163 return !(*
this == other);
170 return other.m_current < m_current;
177 return other < *
this;
184 return !(other < *
this);
191 return !(*
this < other);
201 template <
typename It,
typename Diff>
202 GAIA_NODISCARD
constexpr reverse_iterator<It, Diff> operator+(
203 Diff offset,
const reverse_iterator<It, Diff>& it) {
209 template <
typename,
typename =
void>
210 struct iterator_traits_base {};
212 template <
typename It>
213 struct iterator_traits_base<
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;
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;
230 using reference = T&;
234 template <
typename T>
235 struct iterator_traits_pointer_base<T, false> {};
238 template <
typename It>
239 struct iterator_traits: iterator_traits_base<It> {};
242 template <
typename T>
243 struct iterator_traits<T*>: iterator_traits_pointer_base<T> {};
245 template <
typename It>
246 using iterator_cat_t =
typename iterator_traits<It>::iterator_category;
252 template <
typename T,
typename =
void>
253 [[maybe_unused]]
constexpr bool is_iterator_v =
false;
257 template <
typename T>
258 [[maybe_unused]]
constexpr bool is_iterator_v<T, std::void_t<detail::iterator_cat_t<T>>> =
true;
260 template <
typename T>
265 template <
typename It>
266 [[maybe_unused]]
constexpr bool is_input_iter_v =
271 template <
typename It>
272 [[maybe_unused]]
constexpr bool is_fwd_iter_v =
277 template <
typename It>
278 [[maybe_unused]]
constexpr bool is_rev_iter_v =
283 template <
typename It>
284 [[maybe_unused]]
constexpr bool is_bidi_iter_v =
289 template <
typename It>
290 [[maybe_unused]]
constexpr bool is_random_iter_v =
295 template <
typename It>
296 using iterator_ref_t =
typename detail::iterator_traits<It>::reference;
300 template <
typename It>
301 using iterator_value_t =
typename detail::iterator_traits<It>::value_type;
305 template <
typename It>
306 using iterator_diff_t =
typename detail::iterator_traits<It>::difference_type;
310 template <
typename... It>
311 using common_diff_t = std::common_type_t<iterator_diff_t<It>...>;
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>)
323 iterator_diff_t<It> offset{};
324 while (first != last) {
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:261