From 485e29a672d6bc6dc4a9d5629bea855c7cff41b1 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Fri, 15 Apr 2022 15:10:40 +0200 Subject: [PATCH] meta: reduce number of generated symbols --- src/entt/meta/factory.hpp | 157 +++++++++++++++++++++----------------- 1 file changed, 87 insertions(+), 70 deletions(-) diff --git a/src/entt/meta/factory.hpp b/src/entt/meta/factory.hpp index 66b88ff68..9955b96df 100644 --- a/src/entt/meta/factory.hpp +++ b/src/entt/meta/factory.hpp @@ -19,6 +19,80 @@ namespace entt { +/** + * @cond TURN_OFF_DOXYGEN + * Internal details not to be documented. + */ + +namespace internal { + +inline void link_prop_if_required(internal::meta_prop_node **ref, internal::meta_prop_node &node) ENTT_NOEXCEPT { + if(meta_range range{*ref}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { + ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [&node](const auto *curr) { return curr->id == node.id; }) == range.cend(), "Duplicate identifier"); + node.next = *ref; + *ref = &node; + } +} + +inline void link_type_if_required(meta_type_node *owner, const id_type id) ENTT_NOEXCEPT { + meta_range range{*meta_context::global()}; + ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [&](const auto *curr) { return curr != owner && curr->id == id; }) == range.cend(), "Duplicate identifier"); + owner->id = id; + + if(std::find(range.cbegin(), range.cend(), owner) == range.cend()) { + owner->next = *meta_context::global(); + *meta_context::global() = owner; + } +} + +inline void link_base_if_required(meta_type_node *owner, meta_base_node &node) ENTT_NOEXCEPT { + if(meta_range range{owner->base}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { + node.next = owner->base; + owner->base = &node; + } +} + +inline void link_conv_if_required(meta_type_node *owner, meta_conv_node &node) ENTT_NOEXCEPT { + if(meta_range range{owner->conv}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { + node.next = owner->conv; + owner->conv = &node; + } +} + +inline void link_ctor_if_required(meta_type_node *owner, meta_ctor_node &node) ENTT_NOEXCEPT { + if(meta_range range{owner->ctor}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { + node.next = owner->ctor; + owner->ctor = &node; + } +} + +inline void link_data_if_required(meta_type_node *owner, const id_type id, meta_data_node &node) ENTT_NOEXCEPT { + meta_range range{owner->data}; + ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id, &node](const auto *curr) { return curr != &node && curr->id == id; }) == range.cend(), "Duplicate identifier"); + node.id = id; + + if(std::find(range.cbegin(), range.cend(), &node) == range.cend()) { + node.next = owner->data; + owner->data = &node; + } +} + +inline void link_func_if_required(meta_type_node *owner, const id_type id, meta_func_node &node) ENTT_NOEXCEPT { + node.id = id; + + if(meta_range range{owner->func}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { + node.next = owner->func; + owner->func = &node; + } +} + +} // namespace internal + +/** + * Internal details not to be documented. + * @endcond + */ + /** * @brief Meta factory to be used for reflection purposes. * @@ -37,14 +111,6 @@ class meta_factory; */ template class meta_factory: public meta_factory { - void link_prop_if_required(internal::meta_prop_node &node) ENTT_NOEXCEPT { - if(meta_range range{*ref}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { - ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [&node](const auto *curr) { return curr->id == node.id; }) == range.cend(), "Duplicate identifier"); - node.next = *ref; - *ref = &node; - } - } - template void unroll(choice_t<2>, std::tuple property, Other &&...other) ENTT_NOEXCEPT { std::apply([this](auto &&...curr) { (this->unroll(choice<2>, std::forward(curr)...)); }, property); @@ -80,7 +146,7 @@ class meta_factory: public meta_factory { property[0u] = std::move(key); property[1u] = std::move(value); - link_prop_if_required(node); + internal::link_prop_if_required(ref, node); } public: @@ -138,47 +204,6 @@ private: */ template class meta_factory { - void link_base_if_required(internal::meta_base_node &node) ENTT_NOEXCEPT { - if(meta_range range{owner->base}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { - node.next = owner->base; - owner->base = &node; - } - } - - void link_conv_if_required(internal::meta_conv_node &node) ENTT_NOEXCEPT { - if(meta_range range{owner->conv}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { - node.next = owner->conv; - owner->conv = &node; - } - } - - void link_ctor_if_required(internal::meta_ctor_node &node) ENTT_NOEXCEPT { - if(meta_range range{owner->ctor}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { - node.next = owner->ctor; - owner->ctor = &node; - } - } - - void link_data_if_required(const id_type id, internal::meta_data_node &node) ENTT_NOEXCEPT { - meta_range range{owner->data}; - ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id, &node](const auto *curr) { return curr != &node && curr->id == id; }) == range.cend(), "Duplicate identifier"); - node.id = id; - - if(std::find(range.cbegin(), range.cend(), &node) == range.cend()) { - node.next = owner->data; - owner->data = &node; - } - } - - void link_func_if_required(const id_type id, internal::meta_func_node &node) ENTT_NOEXCEPT { - node.id = id; - - if(meta_range range{owner->func}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { - node.next = owner->func; - owner->func = &node; - } - } - template auto data(const id_type id, std::index_sequence) ENTT_NOEXCEPT { using data_type = std::invoke_result_t; @@ -199,7 +224,7 @@ class meta_factory { // tricks clang-format }; - link_data_if_required(id, node); + internal::link_data_if_required(owner, id, node); return meta_factory>{&node.prop}; } @@ -214,15 +239,7 @@ public: * @return An extended meta factory for the given type. */ auto type(const id_type id = type_hash::value()) ENTT_NOEXCEPT { - meta_range range{*internal::meta_context::global()}; - ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id, this](const auto *curr) { return curr != owner && curr->id == id; }) == range.cend(), "Duplicate identifier"); - owner->id = id; - - if(std::find(range.cbegin(), range.cend(), owner) == range.cend()) { - owner->next = *internal::meta_context::global(); - *internal::meta_context::global() = owner; - } - + internal::link_type_if_required(owner, id); return meta_factory{&owner->prop}; } @@ -251,7 +268,7 @@ public: // tricks clang-format }; - link_base_if_required(node); + internal::link_base_if_required(owner, node); return meta_factory{}; } @@ -278,7 +295,7 @@ public: // tricks clang-format }; - link_conv_if_required(node); + internal::link_conv_if_required(owner, node); return meta_factory{}; } @@ -300,7 +317,7 @@ public: // tricks clang-format }; - link_conv_if_required(node); + internal::link_conv_if_required(owner, node); return meta_factory{}; } @@ -331,7 +348,7 @@ public: // tricks clang-format }; - link_ctor_if_required(node); + internal::link_ctor_if_required(owner, node); return meta_factory{}; } @@ -357,7 +374,7 @@ public: // tricks clang-format }; - link_ctor_if_required(node); + internal::link_ctor_if_required(owner, node); return meta_factory{}; } @@ -418,7 +435,7 @@ public: // tricks clang-format }; - link_data_if_required(id, node); + internal::link_data_if_required(owner, id, node); return meta_factory, std::integral_constant>{&node.prop}; } else { using data_type = std::remove_reference_t>; @@ -436,7 +453,7 @@ public: // tricks clang-format }; - link_data_if_required(id, node); + internal::link_data_if_required(owner, id, node); return meta_factory>{&node.prop}; } } @@ -481,7 +498,7 @@ public: // tricks clang-format }; - link_data_if_required(id, node); + internal::link_data_if_required(owner, id, node); return meta_factory, std::integral_constant>{&node.prop}; } else { using args_type = typename meta_function_helper_t::args_type; @@ -500,7 +517,7 @@ public: // tricks clang-format }; - link_data_if_required(id, node); + internal::link_data_if_required(owner, id, node); return meta_factory, std::integral_constant>{&node.prop}; } } @@ -557,7 +574,7 @@ public: // tricks clang-format }; - link_func_if_required(id, node); + internal::link_func_if_required(owner, id, node); return meta_factory>{&node.prop}; }