Browse Source

meta: make meta_range_iterator forward the context to the returned elements

Michele Caini 3 years ago
parent
commit
54f66c9094
3 changed files with 16 additions and 12 deletions
  1. 6 6
      src/entt/meta/meta.hpp
  2. 9 5
      src/entt/meta/range.hpp
  3. 1 1
      src/entt/meta/resolve.hpp

+ 6 - 6
src/entt/meta/meta.hpp

@@ -780,7 +780,7 @@ struct meta_data {
      * @return An iterable range to visit registered meta properties.
      */
     [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_data_node::prop)::const_iterator> prop() const noexcept {
-        return {node->prop.cbegin(), node->prop.cend()};
+        return {{node->prop.cbegin(), *ctx}, {node->prop.cend(), *ctx}};
     }
 
     /**
@@ -898,7 +898,7 @@ struct meta_func {
 
     /*! @copydoc meta_data::prop */
     [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_func_node::prop)::const_iterator> prop() const noexcept {
-        return {node->prop.cbegin(), node->prop.cend()};
+        return {{node->prop.cbegin(), *ctx}, {node->prop.cend(), *ctx}};
     }
 
     /**
@@ -1182,7 +1182,7 @@ public:
      */
     [[nodiscard]] meta_range<meta_type, typename decltype(internal::meta_type_descriptor::base)::const_iterator> base() const noexcept {
         using range_type = meta_range<meta_type, typename decltype(internal::meta_type_descriptor::base)::const_iterator>;
-        return node.details ? range_type{node.details->base.cbegin(), node.details->base.cend()} : range_type{};
+        return node.details ? range_type{{node.details->base.cbegin(), *ctx}, {node.details->base.cend(), *ctx}} : range_type{};
     }
 
     /**
@@ -1191,7 +1191,7 @@ public:
      */
     [[nodiscard]] meta_range<meta_data, typename decltype(internal::meta_type_descriptor::data)::const_iterator> data() const noexcept {
         using range_type = meta_range<meta_data, typename decltype(internal::meta_type_descriptor::data)::const_iterator>;
-        return node.details ? range_type{node.details->data.cbegin(), node.details->data.cend()} : range_type{};
+        return node.details ? range_type{{node.details->data.cbegin(), *ctx}, {node.details->data.cend(), *ctx}} : range_type{};
     }
 
     /**
@@ -1218,7 +1218,7 @@ public:
      */
     [[nodiscard]] meta_range<meta_func, typename decltype(internal::meta_type_descriptor::func)::const_iterator> func() const noexcept {
         using return_type = meta_range<meta_func, typename decltype(internal::meta_type_descriptor::func)::const_iterator>;
-        return node.details ? return_type{node.details->func.cbegin(), node.details->func.cend()} : return_type{};
+        return node.details ? return_type{{node.details->func.cbegin(), *ctx}, {node.details->func.cend(), *ctx}} : return_type{};
     }
 
     /**
@@ -1387,7 +1387,7 @@ public:
      */
     [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_type_descriptor::prop)::const_iterator> prop() const noexcept {
         using range_type = meta_range<meta_prop, typename decltype(internal::meta_type_descriptor::prop)::const_iterator>;
-        return node.details ? range_type{node.details->prop.cbegin(), node.details->prop.cend()} : range_type{};
+        return node.details ? range_type{{node.details->prop.cbegin(), *ctx}, {node.details->prop.cend(), *ctx}} : range_type{};
     }
 
     /**

+ 9 - 5
src/entt/meta/range.hpp

@@ -6,6 +6,7 @@
 #include <utility>
 #include "../core/fwd.hpp"
 #include "../core/iterator.hpp"
+#include "context.hpp"
 
 namespace entt {
 
@@ -25,10 +26,12 @@ struct meta_range_iterator final {
     using iterator_category = std::input_iterator_tag;
 
     meta_range_iterator() noexcept
-        : it{} {}
+        : it{},
+          ctx{} {}
 
-    meta_range_iterator(const It iter) noexcept
-        : it{iter} {}
+    meta_range_iterator(const It iter, const meta_ctx &area) noexcept
+        : it{iter},
+          ctx{&area} {}
 
     meta_range_iterator &operator++() noexcept {
         return ++it, *this;
@@ -67,7 +70,7 @@ struct meta_range_iterator final {
     }
 
     [[nodiscard]] constexpr reference operator[](const difference_type value) const noexcept {
-        return {it[value].first, it[value].second};
+        return {it[value].first, Type{it[value].second, *ctx}};
     }
 
     [[nodiscard]] constexpr pointer operator->() const noexcept {
@@ -75,7 +78,7 @@ struct meta_range_iterator final {
     }
 
     [[nodiscard]] constexpr reference operator*() const noexcept {
-        return {it->first, it->second};
+        return {it->first, Type{it->second, *ctx}};
     }
 
     template<typename... Args>
@@ -89,6 +92,7 @@ struct meta_range_iterator final {
 
 private:
     It it;
+    const meta_ctx *ctx;
 };
 
 template<typename... Args>

+ 1 - 1
src/entt/meta/resolve.hpp

@@ -30,7 +30,7 @@ template<typename Type>
  */
 [[nodiscard]] inline meta_range<meta_type, typename decltype(internal::meta_context::value)::const_iterator> resolve(const meta_ctx &ctx = locator<meta_ctx>::value_or()) noexcept {
     auto &&context = internal::meta_context::from(ctx);
-    return {context.value.cbegin(), context.value.cend()};
+    return {{context.value.cbegin(), ctx}, {context.value.cend(), ctx}};
 }
 
 /**