EnTT 4.0.0
Loading...
Searching...
No Matches
range.hpp
1#ifndef ENTT_META_RANGE_HPP
2#define ENTT_META_RANGE_HPP
3
4#include <compare>
5#include "../core/fwd.hpp"
6#include "../core/iterator.hpp"
7#include "../stl/concepts.hpp"
8#include "../stl/cstddef.hpp"
9#include "../stl/iterator.hpp"
10#include "../stl/utility.hpp"
11#include "context.hpp"
12
13namespace entt {
14
16namespace internal {
17
18struct meta_base_node;
19
20template<typename Type, typename It>
21struct meta_range_iterator final {
22 using value_type = stl::pair<id_type, Type>;
23 using pointer = input_iterator_pointer<value_type>;
24 using reference = value_type;
25 using difference_type = stl::ptrdiff_t;
26 using iterator_category = stl::input_iterator_tag;
27 using iterator_concept = stl::random_access_iterator_tag;
28
29 constexpr meta_range_iterator() noexcept
30 : it{},
31 ctx{} {}
32
33 constexpr meta_range_iterator(const meta_ctx &area, const It iter) noexcept
34 : it{iter},
35 ctx{&area} {}
36
37 constexpr meta_range_iterator &operator++() noexcept {
38 return ++it, *this;
39 }
40
41 constexpr meta_range_iterator operator++(int) noexcept {
42 const meta_range_iterator orig = *this;
43 return ++(*this), orig;
44 }
45
46 constexpr meta_range_iterator &operator--() noexcept {
47 return --it, *this;
48 }
49
50 constexpr meta_range_iterator operator--(int) noexcept {
51 const meta_range_iterator orig = *this;
52 return operator--(), orig;
53 }
54
55 constexpr meta_range_iterator &operator+=(const difference_type value) noexcept {
56 it += value;
57 return *this;
58 }
59
60 constexpr meta_range_iterator operator+(const difference_type value) const noexcept {
61 meta_range_iterator copy = *this;
62 return (copy += value);
63 }
64
65 constexpr meta_range_iterator &operator-=(const difference_type value) noexcept {
66 return (*this += -value);
67 }
68
69 constexpr meta_range_iterator operator-(const difference_type value) const noexcept {
70 return (*this + -value);
71 }
72
73 [[nodiscard]] constexpr reference operator[](const difference_type value) const noexcept {
74 if constexpr(stl::is_same_v<It, typename meta_context::bucket_type::const_iterator>) {
75 return {it[value].first, Type{*ctx, *it[value].second}};
76 } else {
77 return {it[value].id, Type{*ctx, it[value]}};
78 }
79 }
80
81 [[nodiscard]] constexpr pointer operator->() const noexcept {
82 return operator*();
83 }
84
85 [[nodiscard]] constexpr reference operator*() const noexcept {
86 return operator[](0);
87 }
88
89 [[nodiscard]] constexpr stl::ptrdiff_t operator-(const meta_range_iterator &other) const noexcept {
90 return it - other.it;
91 }
92
93 [[nodiscard]] constexpr bool operator==(const meta_range_iterator &other) const noexcept {
94 return it == other.it;
95 }
96
97 [[nodiscard]] constexpr auto operator<=>(const meta_range_iterator &other) const noexcept {
98 return it <=> other.it;
99 }
100
101private:
102 It it;
103 const meta_ctx *ctx;
104};
105
106} // namespace internal
108
114template<typename Type, stl::forward_iterator It>
116
117} // namespace entt
118
119#endif
EnTT default namespace.
Definition dense_map.hpp:25
iterable_adaptor< internal::meta_range_iterator< Type, It > > meta_range
Iterable range to use to iterate all types of meta objects.
Definition range.hpp:115
constexpr type_list< Type..., Other... > operator+(type_list< Type... >, type_list< Other... >)
Concatenates multiple type lists.
Utility class to create an iterable object from a pair of iterators.
Definition iterator.hpp:125