Browse Source

meta: further reduce cost of creating meta data objects

skypjack 1 year ago
parent
commit
1bfe022a57
1 changed files with 19 additions and 28 deletions
  1. 19 28
      src/entt/meta/factory.hpp

+ 19 - 28
src/entt/meta/factory.hpp

@@ -25,10 +25,6 @@ namespace entt {
 /*! @cond TURN_OFF_DOXYGEN */
 /*! @cond TURN_OFF_DOXYGEN */
 namespace internal {
 namespace internal {
 
 
-inline meta_data_node &meta_extend(internal::meta_type_node &parent, const id_type id, meta_data_node node) {
-    return parent.details->data.insert_or_assign(id, std::move(node)).first->second;
-}
-
 inline meta_func_node &meta_extend(internal::meta_type_node &parent, const id_type id, meta_func_node node) {
 inline meta_func_node &meta_extend(internal::meta_type_node &parent, const id_type id, meta_func_node node) {
     if(auto it = parent.details->func.find(id); it != parent.details->func.end()) {
     if(auto it = parent.details->func.find(id); it != parent.details->func.end()) {
         for(auto *curr = &it->second; curr; curr = curr->next.get()) {
         for(auto *curr = &it->second; curr; curr = curr->next.get()) {
@@ -72,6 +68,11 @@ protected:
         elem.id = id;
         elem.id = id;
     }
     }
 
 
+    void extend(const id_type id, meta_data_node node) {
+        auto &&elem = owner().details->data.insert_or_assign(id, std::move(node)).first->second;
+        properties = &elem.prop;
+    }
+
     void property(const id_type key, internal::meta_prop_node value) {
     void property(const id_type key, internal::meta_prop_node value) {
         ENTT_ASSERT(properties != nullptr, "Meta object does not support properties");
         ENTT_ASSERT(properties != nullptr, "Meta object does not support properties");
         (*properties)[key] = std::move(value);
         (*properties)[key] = std::move(value);
@@ -98,8 +99,7 @@ class meta_factory: private internal::basic_meta_factory {
         using args_type = type_list<typename meta_function_helper_t<Type, decltype(value_list_element_v<Index, Setter>)>::args_type...>;
         using args_type = type_list<typename meta_function_helper_t<Type, decltype(value_list_element_v<Index, Setter>)>::args_type...>;
         static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
         static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
 
 
-        auto &&elem = internal::meta_extend(
-            this->owner(),
+        this->extend(
             id,
             id,
             internal::meta_data_node{
             internal::meta_data_node{
                 /* this is never static */
                 /* this is never static */
@@ -109,8 +109,6 @@ class meta_factory: private internal::basic_meta_factory {
                 &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_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) { 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>});
                 &meta_getter<Type, Getter, Policy>});
-
-        this->bucket(&elem.prop);
     }
     }
 
 
 public:
 public:
@@ -290,8 +288,7 @@ public:
             using data_type = std::invoke_result_t<decltype(Data), Type &>;
             using data_type = std::invoke_result_t<decltype(Data), Type &>;
             static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
             static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
 
 
-            auto &&elem = internal::meta_extend(
-                this->owner(),
+            this->extend(
                 id,
                 id,
                 internal::meta_data_node{
                 internal::meta_data_node{
                     /* this is never static */
                     /* this is never static */
@@ -301,8 +298,6 @@ public:
                     &meta_arg<type_list<std::remove_cv_t<std::remove_reference_t<data_type>>>>,
                     &meta_arg<type_list<std::remove_cv_t<std::remove_reference_t<data_type>>>>,
                     &meta_setter<Type, Data>,
                     &meta_setter<Type, Data>,
                     &meta_getter<Type, Data, Policy>});
                     &meta_getter<Type, Data, Policy>});
-
-            this->bucket(&elem.prop);
         } else {
         } else {
             using data_type = std::remove_pointer_t<decltype(Data)>;
             using data_type = std::remove_pointer_t<decltype(Data)>;
 
 
@@ -312,8 +307,7 @@ public:
                 static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
                 static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
             }
             }
 
 
-            auto &&elem = internal::meta_extend(
-                this->owner(),
+            this->extend(
                 id,
                 id,
                 internal::meta_data_node{
                 internal::meta_data_node{
                     ((std::is_same_v<Type, std::remove_cv_t<std::remove_reference_t<data_type>>> || std::is_const_v<std::remove_reference_t<data_type>>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static,
                     ((std::is_same_v<Type, std::remove_cv_t<std::remove_reference_t<data_type>>> || std::is_const_v<std::remove_reference_t<data_type>>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static,
@@ -322,8 +316,6 @@ public:
                     &meta_arg<type_list<std::remove_cv_t<std::remove_reference_t<data_type>>>>,
                     &meta_arg<type_list<std::remove_cv_t<std::remove_reference_t<data_type>>>>,
                     &meta_setter<Type, Data>,
                     &meta_setter<Type, Data>,
                     &meta_getter<Type, Data, Policy>});
                     &meta_getter<Type, Data, Policy>});
-
-            this->bucket(&elem.prop);
         }
         }
 
 
         return *this;
         return *this;
@@ -355,8 +347,7 @@ public:
         static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
         static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
 
 
         if constexpr(std::is_same_v<decltype(Setter), std::nullptr_t>) {
         if constexpr(std::is_same_v<decltype(Setter), std::nullptr_t>) {
-            auto &&elem = internal::meta_extend(
-                this->owner(),
+            this->extend(
                 id,
                 id,
                 internal::meta_data_node{
                 internal::meta_data_node{
                     /* this is never static */
                     /* this is never static */
@@ -366,13 +357,10 @@ public:
                     &meta_arg<type_list<>>,
                     &meta_arg<type_list<>>,
                     &meta_setter<Type, Setter>,
                     &meta_setter<Type, Setter>,
                     &meta_getter<Type, Getter, Policy>});
                     &meta_getter<Type, Getter, Policy>});
-
-            this->bucket(&elem.prop);
         } else {
         } else {
             using args_type = typename meta_function_helper_t<Type, decltype(Setter)>::args_type;
             using args_type = typename meta_function_helper_t<Type, decltype(Setter)>::args_type;
 
 
-            auto &&elem = internal::meta_extend(
-                this->owner(),
+            this->extend(
                 id,
                 id,
                 internal::meta_data_node{
                 internal::meta_data_node{
                     /* this is never static nor const */
                     /* this is never static nor const */
@@ -382,8 +370,6 @@ public:
                     &meta_arg<type_list<type_list_element_t<args_type::size != 1u, args_type>>>,
                     &meta_arg<type_list<type_list_element_t<args_type::size != 1u, args_type>>>,
                     &meta_setter<Type, Setter>,
                     &meta_setter<Type, Setter>,
                     &meta_getter<Type, Getter, Policy>});
                     &meta_getter<Type, Getter, Policy>});
-
-            this->bucket(&elem.prop);
         }
         }
 
 
         return *this;
         return *this;
@@ -457,11 +443,16 @@ public:
     template<typename... Value>
     template<typename... Value>
     meta_factory prop(id_type id, [[maybe_unused]] Value &&...value) {
     meta_factory prop(id_type id, [[maybe_unused]] Value &&...value) {
         if constexpr(sizeof...(Value) == 0u) {
         if constexpr(sizeof...(Value) == 0u) {
-            internal::meta_prop_node node{&internal::resolve<void>};
-            this->property(id, std::move(node));
+            this->property(
+                id,
+                internal::meta_prop_node{
+                    &internal::resolve<void>});
         } else {
         } else {
-            internal::meta_prop_node node{&internal::resolve<std::decay_t<Value>>..., std::make_shared<std::decay_t<Value>>(std::forward<Value>(value))...};
-            this->property(id, std::move(node));
+            this->property(
+                id,
+                internal::meta_prop_node{
+                    &internal::resolve<std::decay_t<Value>>...,
+                    std::make_shared<std::decay_t<Value>>(std::forward<Value>(value))...});
         }
         }
 
 
         return *this;
         return *this;