Browse Source

meta: internal meta_arg_node is back to its old, unsafe version

Michele Caini 3 years ago
parent
commit
de34a109e1
4 changed files with 14 additions and 16 deletions
  1. 4 4
      src/entt/meta/factory.hpp
  2. 9 9
      src/entt/meta/node.hpp
  3. 1 1
      src/entt/meta/utility.hpp
  4. 0 2
      test/entt/meta/meta_utility.cpp

+ 4 - 4
src/entt/meta/factory.hpp

@@ -161,7 +161,7 @@ class meta_factory<Type> {
             Setter::size,
             &internal::resolve<std::remove_cv_t<std::remove_reference_t<data_type>>>,
             &meta_arg<type_list<type_list_element_t<type_list_element_t<Index, args_type>::size != 1u, type_list_element_t<Index, args_type>>...>>,
-            +[](meta_handle instance, meta_any value) -> bool { return (meta_setter<Type, value_list_element_v<Index, Setter>>(*instance.operator->(), value.as_ref()) || ...); },
+            +[](meta_handle instance, meta_any value) { return (meta_setter<Type, value_list_element_v<Index, Setter>>(*instance.operator->(), value.as_ref()) || ...); },
             &meta_getter<Type, Getter, Policy>};
 
         auto &&elem = internal::meta_extend(owner(), id, std::move(node));
@@ -202,7 +202,7 @@ public:
 
         internal::meta_base_node node{
             &internal::resolve<Base>,
-            +[](meta_any other) noexcept -> meta_any {
+            +[](meta_any other) noexcept {
                 if(auto *ptr = other.data(); ptr) {
                     return forward_as_meta(*static_cast<Base *>(static_cast<Type *>(ptr)));
                 }
@@ -231,7 +231,7 @@ public:
         using conv_type = std::remove_cv_t<std::remove_reference_t<std::invoke_result_t<decltype(Candidate), Type &>>>;
 
         internal::meta_conv_node node{
-            +[](const meta_any &instance) -> meta_any {
+            +[](const meta_any &instance) {
                 return forward_as_meta(std::invoke(Candidate, *static_cast<const Type *>(instance.data())));
             }};
 
@@ -253,7 +253,7 @@ public:
         using conv_type = std::remove_cv_t<std::remove_reference_t<To>>;
 
         internal::meta_conv_node node{
-            +[](const meta_any &instance) -> meta_any {
+            +[](const meta_any &instance) {
                 return forward_as_meta(static_cast<To>(*static_cast<const Type *>(instance.data())));
             }};
 

+ 9 - 9
src/entt/meta/node.hpp

@@ -137,15 +137,15 @@ template<typename Type>
 meta_type_node resolve() noexcept;
 
 template<typename... Args>
-[[nodiscard]] meta_type_node meta_arg_node(type_list<Args...>, [[maybe_unused]] const std::size_t index) noexcept {
-    if constexpr(sizeof...(Args) != 0u) {
-        if(index < sizeof...(Args)) {
-            const meta_type_node args[sizeof...(Args)]{internal::resolve<std::remove_cv_t<std::remove_reference_t<Args>>>()...};
-            return args[index];
-        }
+[[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 {
+        element_type *args[sizeof...(Args)]{&internal::resolve<std::remove_cv_t<std::remove_reference_t<Args>>>...};
+        return args[index];
     }
-
-    return {};
 }
 
 [[nodiscard]] inline meta_type_node *try_resolve(const type_info &info) noexcept {
@@ -205,7 +205,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 -> meta_type_node { 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

@@ -181,7 +181,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)();
 }
 
 /**

+ 0 - 2
test/entt/meta/meta_utility.cpp

@@ -73,10 +73,8 @@ TEST_F(MetaUtility, MetaDispatch) {
 }
 
 TEST_F(MetaUtility, MetaArg) {
-    ASSERT_EQ((entt::meta_arg<entt::type_list<>>(3u)), entt::meta_type{});
     ASSERT_EQ((entt::meta_arg<entt::type_list<int, char>>(0u)), entt::resolve<int>());
     ASSERT_EQ((entt::meta_arg<entt::type_list<int, char>>(1u)), entt::resolve<char>());
-    ASSERT_EQ((entt::meta_arg<entt::type_list<int, char>>(2u)), entt::meta_type{});
 }
 
 TEST_F(MetaUtility, MetaSetter) {