From c2f87a70c5bf2be137513867b01664c8e7ce8bae Mon Sep 17 00:00:00 2001 From: skypjack Date: Sun, 14 Jul 2024 14:25:04 +0200 Subject: [PATCH] meta: further reduce cost of creating meta func objects --- src/entt/meta/factory.hpp | 42 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/entt/meta/factory.hpp b/src/entt/meta/factory.hpp index cb133e84f..95ab4d5cf 100644 --- a/src/entt/meta/factory.hpp +++ b/src/entt/meta/factory.hpp @@ -25,23 +25,6 @@ namespace entt { /*! @cond TURN_OFF_DOXYGEN */ namespace internal { -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()) { - for(auto *curr = &it->second; curr; curr = curr->next.get()) { - if(curr->invoke == node.invoke) { - node.next = std::move(curr->next); - *curr = std::move(node); - return *curr; - } - } - - // locally overloaded function - node.next = std::make_shared(std::move(parent.details->func[id])); - } - - return parent.details->func.insert_or_assign(id, std::move(node)).first->second; -} - class basic_meta_factory { using bucket_type = dense_map; @@ -73,6 +56,27 @@ protected: properties = &elem.prop; } + void extend(const id_type id, meta_func_node node) { + auto &parent = owner(); + + if(auto it = parent.details->func.find(id); it != parent.details->func.end()) { + for(auto *curr = &it->second; curr; curr = curr->next.get()) { + if(curr->invoke == node.invoke) { + node.next = std::move(curr->next); + *curr = std::move(node); + properties = &curr->prop; + return; + } + } + + // locally overloaded function + node.next = std::make_shared(std::move(parent.details->func[id])); + } + + auto &&elem = parent.details->func.insert_or_assign(id, std::move(node)).first->second; + properties = &elem.prop; + } + void property(const id_type key, internal::meta_prop_node value) { ENTT_ASSERT(properties != nullptr, "Meta object does not support properties"); (*properties)[key] = std::move(value); @@ -416,8 +420,7 @@ public: using descriptor = meta_function_helper_t; static_assert(Policy::template value, "Invalid return type for the given policy"); - auto &&elem = internal::meta_extend( - this->owner(), + this->extend( id, internal::meta_func_node{ (descriptor::is_const ? internal::meta_traits::is_const : internal::meta_traits::is_none) | (descriptor::is_static ? internal::meta_traits::is_static : internal::meta_traits::is_none), @@ -426,7 +429,6 @@ public: &meta_arg, &meta_invoke}); - this->bucket(&elem.prop); return *this; }