| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #ifndef ENTT_META_RANGE_HPP
- #define ENTT_META_RANGE_HPP
- #include <compare>
- #include <concepts>
- #include <cstddef>
- #include "../core/fwd.hpp"
- #include "../core/iterator.hpp"
- #include "../stl/iterator.hpp"
- #include "../stl/utility.hpp"
- #include "context.hpp"
- namespace entt {
- /*! @cond ENTT_INTERNAL */
- namespace internal {
- struct meta_base_node;
- template<typename Type, typename It>
- struct meta_range_iterator final {
- using value_type = stl::pair<id_type, Type>;
- using pointer = input_iterator_pointer<value_type>;
- using reference = value_type;
- using difference_type = std::ptrdiff_t;
- using iterator_category = stl::input_iterator_tag;
- using iterator_concept = stl::random_access_iterator_tag;
- constexpr meta_range_iterator() noexcept
- : it{},
- ctx{} {}
- constexpr meta_range_iterator(const meta_ctx &area, const It iter) noexcept
- : it{iter},
- ctx{&area} {}
- constexpr meta_range_iterator &operator++() noexcept {
- return ++it, *this;
- }
- constexpr meta_range_iterator operator++(int) noexcept {
- const meta_range_iterator orig = *this;
- return ++(*this), orig;
- }
- constexpr meta_range_iterator &operator--() noexcept {
- return --it, *this;
- }
- constexpr meta_range_iterator operator--(int) noexcept {
- const meta_range_iterator orig = *this;
- return operator--(), orig;
- }
- constexpr meta_range_iterator &operator+=(const difference_type value) noexcept {
- it += value;
- return *this;
- }
- constexpr meta_range_iterator operator+(const difference_type value) const noexcept {
- meta_range_iterator copy = *this;
- return (copy += value);
- }
- constexpr meta_range_iterator &operator-=(const difference_type value) noexcept {
- return (*this += -value);
- }
- constexpr meta_range_iterator operator-(const difference_type value) const noexcept {
- return (*this + -value);
- }
- [[nodiscard]] constexpr reference operator[](const difference_type value) const noexcept {
- if constexpr(stl::is_same_v<It, typename meta_context::container_type::const_iterator>) {
- return {it[value].first, Type{*ctx, *it[value].second}};
- } else {
- return {it[value].id, Type{*ctx, it[value]}};
- }
- }
- [[nodiscard]] constexpr pointer operator->() const noexcept {
- return operator*();
- }
- [[nodiscard]] constexpr reference operator*() const noexcept {
- return operator[](0);
- }
- [[nodiscard]] constexpr std::ptrdiff_t operator-(const meta_range_iterator &other) const noexcept {
- return it - other.it;
- }
- [[nodiscard]] constexpr bool operator==(const meta_range_iterator &other) const noexcept {
- return it == other.it;
- }
- [[nodiscard]] constexpr auto operator<=>(const meta_range_iterator &other) const noexcept {
- return it <=> other.it;
- }
- private:
- It it;
- const meta_ctx *ctx;
- };
- } // namespace internal
- /*! @endcond */
- /**
- * @brief Iterable range to use to iterate all types of meta objects.
- * @tparam Type Type of meta objects returned.
- * @tparam It Type of forward iterator.
- */
- template<typename Type, stl::forward_iterator It>
- using meta_range = iterable_adaptor<internal::meta_range_iterator<Type, It>>;
- } // namespace entt
- #endif
|