Pārlūkot izejas kodu

meta: context aware meta_arg_node function (with internal temporary trampoline)

Michele Caini 3 gadi atpakaļ
vecāks
revīzija
6a8a9c4b31
2 mainītis faili ar 17 papildinājumiem un 12 dzēšanām
  1. 16 11
      src/entt/meta/node.hpp
  2. 1 1
      src/entt/meta/utility.hpp

+ 16 - 11
src/entt/meta/node.hpp

@@ -131,15 +131,25 @@ struct meta_type_node {
 };
 };
 
 
 template<typename Type>
 template<typename Type>
-meta_type_node resolve() noexcept;
+meta_type_node resolve(const meta_context &) noexcept;
+
+template<typename Type>
+[[nodiscard]] meta_type_node resolve_TODO() noexcept {
+    return resolve<Type>(meta_context::from(locator<meta_ctx>::value_or()));
+}
 
 
 template<typename... Args>
 template<typename... Args>
-[[nodiscard]] auto meta_arg_node(type_list<Args...>, [[maybe_unused]] const std::size_t index) noexcept {
+[[nodiscard]] auto meta_arg_node(type_list<Args...>, const meta_context &context, [[maybe_unused]] const std::size_t index) noexcept {
     std::size_t pos{};
     std::size_t pos{};
-    meta_type_node (*value)() noexcept = nullptr;
-    ((value = (pos++ == index ? &resolve_TODO<std::remove_cv_t<std::remove_reference_t<Args>>> : value)), ...);
+    meta_type_node (*value)(const meta_context &) noexcept = nullptr;
+    ((value = (pos++ == index ? &resolve<std::remove_cv_t<std::remove_reference_t<Args>>> : value)), ...);
     ENTT_ASSERT(value != nullptr, "Out of bounds");
     ENTT_ASSERT(value != nullptr, "Out of bounds");
-    return value();
+    return value(context);
+}
+
+template<typename Args>
+[[nodiscard]] auto meta_arg_node_TODO(Args, const std::size_t index) noexcept {
+    return meta_arg_node(Args{}, meta_context::from(locator<meta_ctx>::value_or()), index);
 }
 }
 
 
 [[nodiscard]] inline const void *try_cast(const meta_type_node &from, const meta_type_node &to, const void *instance) noexcept {
 [[nodiscard]] inline const void *try_cast(const meta_type_node &from, const meta_type_node &to, const void *instance) noexcept {
@@ -163,11 +173,6 @@ template<typename... Args>
     return it != context.value.end() ? &it->second : nullptr;
     return it != context.value.end() ? &it->second : nullptr;
 }
 }
 
 
-template<typename Type>
-[[nodiscard]] meta_type_node resolve_TODO() noexcept {
-    return resolve<Type>(meta_context::from(locator<meta_ctx>::value_or()));
-}
-
 template<typename Type>
 template<typename Type>
 [[nodiscard]] meta_type_node resolve(const meta_context &context) noexcept {
 [[nodiscard]] meta_type_node resolve(const meta_context &context) noexcept {
     static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Invalid type");
     static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Invalid type");
@@ -219,7 +224,7 @@ template<typename Type>
         node.templ = meta_template_node{
         node.templ = meta_template_node{
             meta_template_traits<Type>::args_type::size,
             meta_template_traits<Type>::args_type::size,
             &resolve_TODO<typename meta_template_traits<Type>::class_type>,
             &resolve_TODO<typename meta_template_traits<Type>::class_type>,
-            +[](const std::size_t index) noexcept { return meta_arg_node(typename meta_template_traits<Type>::args_type{}, index); }};
+            +[](const std::size_t index) noexcept { return meta_arg_node_TODO(typename meta_template_traits<Type>::args_type{}, index); }};
     }
     }
 
 
     return node;
     return node;

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

@@ -176,7 +176,7 @@ meta_any meta_dispatch([[maybe_unused]] Type &&value) {
  */
  */
 template<typename Type>
 template<typename Type>
 [[nodiscard]] static meta_type meta_arg(const std::size_t index) noexcept {
 [[nodiscard]] static meta_type meta_arg(const std::size_t index) noexcept {
-    return internal::meta_arg_node(Type{}, index);
+    return internal::meta_arg_node_TODO(Type{}, index);
 }
 }
 
 
 /**
 /**