From c8a6465688df42f684fdddcbd26c248ec56b62f9 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Fri, 29 May 2020 00:30:20 +0200 Subject: [PATCH] meta: reduce instantiations --- src/entt/meta/factory.hpp | 112 ++++++++++++++++++++------------------ src/entt/meta/meta.hpp | 7 +-- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/src/entt/meta/factory.hpp b/src/entt/meta/factory.hpp index 88eb52369..affb2f5aa 100644 --- a/src/entt/meta/factory.hpp +++ b/src/entt/meta/factory.hpp @@ -88,64 +88,62 @@ meta_any construct(meta_any * const args, std::index_sequence) { } -template +template bool setter([[maybe_unused]] meta_any instance, [[maybe_unused]] meta_any index, [[maybe_unused]] meta_any value) { bool accepted = false; - if constexpr(!Const) { - if constexpr(std::is_function_v>> || std::is_member_function_pointer_v) { - using helper_type = meta_function_helper_t; - using data_type = std::tuple_element_t, typename helper_type::args_type>; - static_assert(std::is_invocable_v, "Invalid function or member function"); - auto * const clazz = instance.try_cast(); + if constexpr(std::is_function_v>> || std::is_member_function_pointer_v) { + using helper_type = meta_function_helper_t; + using data_type = std::tuple_element_t, typename helper_type::args_type>; + static_assert(std::is_invocable_v, "Invalid function or member function"); + auto * const clazz = instance.try_cast(); + auto * const direct = value.try_cast(); + + if(clazz && (direct || value.convert())) { + std::invoke(Data, *clazz, direct ? *direct : value.cast()); + accepted = true; + } + } else if constexpr(std::is_member_object_pointer_v) { + using data_type = std::remove_cv_t().*Data)>>; + static_assert(std::is_invocable_v, "Invalid data member"); + auto * const clazz = instance.try_cast(); + + if constexpr(std::is_array_v) { + using underlying_type = std::remove_extent_t; + auto * const direct = value.try_cast(); + auto * const idx = index.try_cast(); + + if(clazz && idx && (direct || value.convert())) { + std::invoke(Data, clazz)[*idx] = direct ? *direct : value.cast(); + accepted = true; + } + } else { auto * const direct = value.try_cast(); if(clazz && (direct || value.convert())) { - std::invoke(Data, *clazz, direct ? *direct : value.cast()); + std::invoke(Data, clazz) = (direct ? *direct : value.cast()); accepted = true; } - } else if constexpr(std::is_member_object_pointer_v) { - using data_type = std::remove_cv_t().*Data)>>; - static_assert(std::is_invocable_v, "Invalid data member"); - auto * const clazz = instance.try_cast(); + } + } else { + static_assert(std::is_pointer_v, "Invalid pointer to data type"); + using data_type = std::remove_cv_t>; - if constexpr(std::is_array_v) { - using underlying_type = std::remove_extent_t; - auto * const direct = value.try_cast(); - auto * const idx = index.try_cast(); + if constexpr(std::is_array_v) { + using underlying_type = std::remove_extent_t; + auto * const direct = value.try_cast(); + auto * const idx = index.try_cast(); - if(clazz && idx && (direct || value.convert())) { - std::invoke(Data, clazz)[*idx] = direct ? *direct : value.cast(); - accepted = true; - } - } else { - auto * const direct = value.try_cast(); - - if(clazz && (direct || value.convert())) { - std::invoke(Data, clazz) = (direct ? *direct : value.cast()); - accepted = true; - } + if(idx && (direct || value.convert())) { + (*Data)[*idx] = (direct ? *direct : value.cast()); + accepted = true; } } else { - static_assert(std::is_pointer_v, "Invalid pointer to data type"); - using data_type = std::remove_cv_t>; + auto * const direct = value.try_cast(); - if constexpr(std::is_array_v) { - using underlying_type = std::remove_extent_t; - auto * const direct = value.try_cast(); - auto * const idx = index.try_cast(); - - if(idx && (direct || value.convert())) { - (*Data)[*idx] = (direct ? *direct : value.cast()); - accepted = true; - } - } else { - auto * const direct = value.try_cast(); - - if(direct || value.convert()) { - *Data = (direct ? *direct : value.cast()); - accepted = true; - } + if(direct || value.convert()) { + *Data = (direct ? *direct : value.cast()); + accepted = true; } } } @@ -625,9 +623,8 @@ public: nullptr, nullptr, true, - true, &internal::meta_info::resolve, - &internal::setter, + nullptr, &internal::getter }; @@ -640,10 +637,15 @@ public: type, nullptr, nullptr, - std::is_const_v, !std::is_member_object_pointer_v, &internal::meta_info::resolve, - &internal::setter, Type, Data>, + []() -> decltype(internal::meta_data_node::set) { + if constexpr(std::is_const_v) { + return nullptr; + } else { + return &internal::setter; + } + }(), &internal::getter }; @@ -656,10 +658,15 @@ public: type, nullptr, nullptr, - std::is_const_v, !std::is_member_object_pointer_v, &internal::meta_info::resolve, - &internal::setter, Type, Data>, + []() -> decltype(internal::meta_data_node::set) { + if constexpr(std::is_const_v) { + return nullptr; + } else { + return &internal::setter; + } + }(), &internal::getter }; @@ -707,9 +714,8 @@ public: nullptr, nullptr, false, - false, &internal::meta_info::resolve, - &internal::setter, + &internal::setter, &internal::getter }; diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index b4d82a0f4..449492b57 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -76,7 +76,6 @@ struct meta_data_node { meta_type_node * const parent; meta_data_node * next; meta_prop_node * prop; - const bool is_const; const bool is_static; meta_type_node *(* const type)() ENTT_NOEXCEPT; bool(* const set)(meta_any, meta_any, meta_any); @@ -912,7 +911,7 @@ struct meta_data { * @return True if the meta data is constant, false otherwise. */ bool is_const() const ENTT_NOEXCEPT { - return node->is_const; + return (node->set == nullptr); } /** @@ -942,7 +941,7 @@ struct meta_data { */ template bool set(meta_handle instance, Type &&value) const { - return node->set(*instance, {}, std::forward(value)); + return node->set && node->set(*instance, {}, std::forward(value)); } /** @@ -963,7 +962,7 @@ struct meta_data { template bool set(meta_handle instance, std::size_t index, Type &&value) const { ENTT_ASSERT(index < node->type()->extent); - return node->set(*instance, index, std::forward(value)); + return node->set && node->set(*instance, index, std::forward(value)); } /**