Просмотр исходного кода

meta: rework internal function meta_arg_node

Michele Caini 3 лет назад
Родитель
Сommit
699aa5cd96
2 измененных файлов с 8 добавлено и 12 удалено
  1. 7 11
      src/entt/meta/node.hpp
  2. 1 1
      src/entt/meta/utility.hpp

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

@@ -135,16 +135,12 @@ template<typename Type>
 meta_type_node resolve() noexcept;
 
 template<typename... Args>
-[[nodiscard]] auto *meta_arg_node(type_list<Args...>, [[maybe_unused]] const std::size_t index) noexcept {
-    using element_type = meta_type_node (*)() noexcept;
-
-    if constexpr(sizeof...(Args) == 0u) {
-        return static_cast<element_type>(nullptr);
-    } else {
-        const element_type args[sizeof...(Args)]{&internal::resolve<std::remove_cv_t<std::remove_reference_t<Args>>>...};
-        ENTT_ASSERT(index < sizeof...(Args), "Out of bounds");
-        return args[index];
-    }
+[[nodiscard]] auto meta_arg_node(type_list<Args...>, [[maybe_unused]] const std::size_t index) noexcept {
+    std::size_t pos{};
+    meta_type_node (*value)() noexcept = nullptr;
+    ((value = (pos++ == index ? &internal::resolve<std::remove_cv_t<std::remove_reference_t<Args>>> : value)), ...);
+    ENTT_ASSERT(value != nullptr, "Out of bounds");
+    return value();
 }
 
 [[nodiscard]] inline meta_type_node *try_resolve(const type_info &info) noexcept {
@@ -220,7 +216,7 @@ template<typename Type>
         node.templ = meta_template_node{
             meta_template_traits<Type>::args_type::size,
             &resolve<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(typename meta_template_traits<Type>::args_type{}, index); }};
     }
 
     return node;

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

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