Gaia-ECS v0.9.3
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
7namespace gaia {
8 namespace core {
11
17
18 namespace detail {
19 template <typename, typename = void>
20 struct iterator_traits_base {}; // empty for non-iterators
21
22 template <typename It>
24 It, std::void_t<
25 typename It::iterator_category, typename It::value_type, typename It::difference_type,
26 typename It::pointer, typename It::reference>> {
27 using iterator_category = typename It::iterator_category;
28 using value_type = typename It::value_type;
29 using difference_type = typename It::difference_type;
30 using pointer = typename It::pointer;
31 using reference = typename It::reference;
32 };
33
34 template <typename T, bool = std::is_object_v<T>>
37 using value_type = std::remove_cv_t<T>;
38 using difference_type = std::ptrdiff_t;
39 using pointer = T*;
40 using reference = T&;
41 };
42
44 template <typename T>
45 struct iterator_traits_pointer_base<T, false> {};
46
48 template <typename It>
50
51 // Iterator traits for pointers
52 template <typename T>
54
55 template <typename It>
56 using iterator_cat_t = typename iterator_traits<It>::iterator_category;
57 } // namespace detail
58
59 template <typename T, typename = void>
60 [[maybe_unused]] constexpr bool is_iterator_v = false;
61
62 template <typename T>
63 [[maybe_unused]] constexpr bool is_iterator_v<T, std::void_t<detail::iterator_cat_t<T>>> = true;
64
65 template <typename T>
66 struct is_iterator: std::bool_constant<is_iterator_v<T>> {};
67
68 template <typename It>
69 [[maybe_unused]] constexpr bool is_input_iter_v =
70 std::is_convertible_v<detail::iterator_cat_t<It>, input_iterator_tag>;
71
72 template <typename It>
73 [[maybe_unused]] constexpr bool is_fwd_iter_v =
74 std::is_convertible_v<detail::iterator_cat_t<It>, forward_iterator_tag>;
75
76 template <typename It>
77 [[maybe_unused]] constexpr bool is_rev_iter_v =
78 std::is_convertible_v<detail::iterator_cat_t<It>, reverse_iterator_tag>;
79
80 template <typename It>
81 [[maybe_unused]] constexpr bool is_bidi_iter_v =
82 std::is_convertible_v<detail::iterator_cat_t<It>, bidirectional_iterator_tag>;
83
84 template <typename It>
85 [[maybe_unused]] constexpr bool is_random_iter_v =
86 std::is_convertible_v<detail::iterator_cat_t<It>, random_access_iterator_tag>;
87
88 template <typename It>
89 using iterator_ref_t = typename detail::iterator_traits<It>::reference;
90
91 template <typename It>
92 using iterator_value_t = typename detail::iterator_traits<It>::value_type;
93
94 template <typename It>
95 using iterator_diff_t = typename detail::iterator_traits<It>::difference_type;
96
97 template <typename... It>
98 using common_diff_t = std::common_type_t<iterator_diff_t<It>...>;
99
100 template <typename It>
101 constexpr iterator_diff_t<It> distance(It first, It last) {
102 if constexpr (std::is_pointer_v<It> || is_random_iter_v<It>)
103 return last - first;
104 else {
105 iterator_diff_t<It> offset{};
106 while (first != last) {
107 ++first;
108 ++offset;
109 }
110 return offset;
111 }
112 }
113 } // namespace core
114} // namespace gaia
Checks if endianess was detected correctly at compile-time.
Definition bitset.h:9
Definition iterator.h:16
Iterator traits for iterators.
Definition iterator.h:49
Definition iterator.h:12
Definition iterator.h:9
Definition iterator.h:66
Definition iterator.h:10
Definition iterator.h:13