EnTT 3.13.0
Loading...
Searching...
No Matches
range.hpp
1#ifndef ENTT_META_RANGE_HPP
2#define ENTT_META_RANGE_HPP
3
4#include <cstddef>
5#include <iterator>
6#include <utility>
7#include "../core/fwd.hpp"
8#include "../core/iterator.hpp"
9#include "context.hpp"
10
11namespace entt {
12
14namespace internal {
15
16template<typename Type, typename It>
17struct meta_range_iterator final {
18 using difference_type = std::ptrdiff_t;
19 using value_type = std::pair<id_type, Type>;
20 using pointer = input_iterator_pointer<value_type>;
21 using reference = value_type;
22 using iterator_category = std::input_iterator_tag;
23 using iterator_concept = std::random_access_iterator_tag;
24
25 constexpr meta_range_iterator() noexcept
26 : it{},
27 ctx{} {}
28
29 constexpr meta_range_iterator(const meta_ctx &area, const It iter) noexcept
30 : it{iter},
31 ctx{&area} {}
32
33 constexpr meta_range_iterator &operator++() noexcept {
34 return ++it, *this;
35 }
36
37 constexpr meta_range_iterator operator++(int) noexcept {
38 meta_range_iterator orig = *this;
39 return ++(*this), orig;
40 }
41
42 constexpr meta_range_iterator &operator--() noexcept {
43 return --it, *this;
44 }
45
46 constexpr meta_range_iterator operator--(int) noexcept {
47 meta_range_iterator orig = *this;
48 return operator--(), orig;
49 }
50
51 constexpr meta_range_iterator &operator+=(const difference_type value) noexcept {
52 it += value;
53 return *this;
54 }
55
56 constexpr meta_range_iterator operator+(const difference_type value) const noexcept {
57 meta_range_iterator copy = *this;
58 return (copy += value);
59 }
60
61 constexpr meta_range_iterator &operator-=(const difference_type value) noexcept {
62 return (*this += -value);
63 }
64
65 constexpr meta_range_iterator operator-(const difference_type value) const noexcept {
66 return (*this + -value);
67 }
68
69 [[nodiscard]] constexpr reference operator[](const difference_type value) const noexcept {
70 return {it[value].first, Type{*ctx, it[value].second}};
71 }
72
73 [[nodiscard]] constexpr pointer operator->() const noexcept {
74 return operator*();
75 }
76
77 [[nodiscard]] constexpr reference operator*() const noexcept {
78 return {it->first, Type{*ctx, it->second}};
79 }
80
81 template<typename... Args>
82 friend constexpr std::ptrdiff_t operator-(const meta_range_iterator<Args...> &, const meta_range_iterator<Args...> &) noexcept;
83
84 template<typename... Args>
85 friend constexpr bool operator==(const meta_range_iterator<Args...> &, const meta_range_iterator<Args...> &) noexcept;
86
87 template<typename... Args>
88 friend constexpr bool operator<(const meta_range_iterator<Args...> &, const meta_range_iterator<Args...> &) noexcept;
89
90private:
91 It it;
92 const meta_ctx *ctx;
93};
94
95template<typename... Args>
96[[nodiscard]] constexpr std::ptrdiff_t operator-(const meta_range_iterator<Args...> &lhs, const meta_range_iterator<Args...> &rhs) noexcept {
97 return lhs.it - rhs.it;
98}
99
100template<typename... Args>
101[[nodiscard]] constexpr bool operator==(const meta_range_iterator<Args...> &lhs, const meta_range_iterator<Args...> &rhs) noexcept {
102 return lhs.it == rhs.it;
103}
104
105template<typename... Args>
106[[nodiscard]] constexpr bool operator!=(const meta_range_iterator<Args...> &lhs, const meta_range_iterator<Args...> &rhs) noexcept {
107 return !(lhs == rhs);
108}
109
110template<typename... Args>
111[[nodiscard]] constexpr bool operator<(const meta_range_iterator<Args...> &lhs, const meta_range_iterator<Args...> &rhs) noexcept {
112 return lhs.it < rhs.it;
113}
114
115template<typename... Args>
116[[nodiscard]] constexpr bool operator>(const meta_range_iterator<Args...> &lhs, const meta_range_iterator<Args...> &rhs) noexcept {
117 return rhs < lhs;
118}
119
120template<typename... Args>
121[[nodiscard]] constexpr bool operator<=(const meta_range_iterator<Args...> &lhs, const meta_range_iterator<Args...> &rhs) noexcept {
122 return !(lhs > rhs);
123}
124
125template<typename... Args>
126[[nodiscard]] constexpr bool operator>=(const meta_range_iterator<Args...> &lhs, const meta_range_iterator<Args...> &rhs) noexcept {
127 return !(lhs < rhs);
128}
129
130} // namespace internal
138template<typename Type, typename It>
140
141} // namespace entt
142
143#endif
EnTT default namespace.
Definition dense_map.hpp:21
constexpr bool operator<=(const basic_hashed_string< Char > &lhs, const basic_hashed_string< Char > &rhs) noexcept
Compares two hashed strings.
constexpr bool operator<(const basic_hashed_string< Char > &lhs, const basic_hashed_string< Char > &rhs) noexcept
Compares two hashed strings.
constexpr type_list< Type..., Other... > operator+(type_list< Type... >, type_list< Other... >)
Concatenates multiple type lists.
constexpr bool operator!=(const basic_hashed_string< Char > &lhs, const basic_hashed_string< Char > &rhs) noexcept
Compares two hashed strings.
constexpr bool operator>=(const basic_hashed_string< Char > &lhs, const basic_hashed_string< Char > &rhs) noexcept
Compares two hashed strings.
constexpr bool operator>(const basic_hashed_string< Char > &lhs, const basic_hashed_string< Char > &rhs) noexcept
Compares two hashed strings.
constexpr bool operator==(const basic_hashed_string< Char > &lhs, const basic_hashed_string< Char > &rhs) noexcept
Compares two hashed strings.
Utility class to create an iterable object from a pair of iterators.
Definition iterator.hpp:141