1#ifndef ENTT_META_RANGE_HPP
2#define ENTT_META_RANGE_HPP
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"
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;
29 constexpr meta_range_iterator() noexcept
33 constexpr meta_range_iterator(
const meta_ctx &area,
const It iter) noexcept
37 constexpr meta_range_iterator &operator++() noexcept {
41 constexpr meta_range_iterator operator++(
int)
noexcept {
42 const meta_range_iterator orig = *
this;
43 return ++(*this), orig;
46 constexpr meta_range_iterator &operator--() noexcept {
50 constexpr meta_range_iterator operator--(
int)
noexcept {
51 const meta_range_iterator orig = *
this;
52 return operator--(), orig;
55 constexpr meta_range_iterator &operator+=(
const difference_type value)
noexcept {
60 constexpr meta_range_iterator
operator+(
const difference_type value)
const noexcept {
61 meta_range_iterator copy = *
this;
62 return (copy += value);
65 constexpr meta_range_iterator &operator-=(
const difference_type value)
noexcept {
66 return (*
this += -value);
69 constexpr meta_range_iterator operator-(
const difference_type value)
const noexcept {
70 return (*
this + -value);
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}};
77 return {it[value].id, Type{*ctx, it[value]}};
81 [[nodiscard]]
constexpr pointer operator->() const noexcept {
85 [[nodiscard]]
constexpr reference operator*() const noexcept {
89 [[nodiscard]]
constexpr stl::ptrdiff_t operator-(
const meta_range_iterator &other)
const noexcept {
93 [[nodiscard]]
constexpr bool operator==(
const meta_range_iterator &other)
const noexcept {
94 return it == other.it;
97 [[nodiscard]]
constexpr auto operator<=>(
const meta_range_iterator &other)
const noexcept {
98 return it <=> other.it;
114template<
typename Type, stl::forward_iterator It>
iterable_adaptor< internal::meta_range_iterator< Type, It > > meta_range
Iterable range to use to iterate all types of meta objects.
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.