diff --git a/src/entt/meta/factory.hpp b/src/entt/meta/factory.hpp index 00138f2ae..f29941940 100644 --- a/src/entt/meta/factory.hpp +++ b/src/entt/meta/factory.hpp @@ -120,16 +120,18 @@ public: template meta_factory prop(id_type id, [[maybe_unused]] Value &&...value) { if constexpr(sizeof...(Value) == 0u) { - internal::meta_prop_node node{ - &internal::resolve}; - - internal::meta_extend(*parent, id, std::move(node)); + internal::meta_extend( + *parent, + id, + internal::meta_prop_node{ + &internal::resolve}); } else { - internal::meta_prop_node node{ - &internal::resolve>..., - std::make_shared>(std::forward(value))...}; - - internal::meta_extend(*parent, id, std::move(node)); + internal::meta_extend( + *parent, + id, + internal::meta_prop_node{ + &internal::resolve>..., + std::make_shared>(std::forward(value))...}); } return *this; @@ -155,16 +157,18 @@ class meta_factory { using args_type = type_list)>::args_type...>; static_assert(Policy::template value, "Invalid return type for the given policy"); - internal::meta_data_node node{ - /* this is never static */ - (std::is_member_object_pointer_v)> && ... && std::is_const_v>) ? internal::meta_traits::is_const : internal::meta_traits::is_none, - Setter::size, - &internal::resolve>>, - &meta_arg::size != 1u, type_list_element_t>...>>, - +[](meta_handle instance, meta_any value) { return (meta_setter>(*instance.operator->(), value.as_ref()) || ...); }, - &meta_getter}; + auto &&elem = internal::meta_extend( + owner(), + id, + internal::meta_data_node{ + /* this is never static */ + (std::is_member_object_pointer_v)> && ... && std::is_const_v>) ? internal::meta_traits::is_const : internal::meta_traits::is_none, + Setter::size, + &internal::resolve>>, + &meta_arg::size != 1u, type_list_element_t>...>>, + +[](meta_handle instance, meta_any value) { return (meta_setter>(*instance.operator->(), value.as_ref()) || ...); }, + &meta_getter}); - auto &&elem = internal::meta_extend(owner(), id, std::move(node)); return meta_factory{elem}; } @@ -200,13 +204,15 @@ public: auto base() noexcept { static_assert(!std::is_same_v && std::is_base_of_v, "Invalid base type"); - internal::meta_base_node node{ - &internal::resolve, - +[](const void *instance) noexcept { - return static_cast(static_cast(static_cast(instance))); - }}; + internal::meta_extend( + owner(), + type_id().hash(), + internal::meta_base_node{ + &internal::resolve, + +[](const void *instance) noexcept { + return static_cast(static_cast(static_cast(instance))); + }}); - internal::meta_extend(owner(), type_id().hash(), std::move(node)); return *this; } @@ -226,12 +232,14 @@ public: auto conv() noexcept { using conv_type = std::remove_cv_t>>; - internal::meta_conv_node node{ - +[](const void *instance) { - return forward_as_meta(std::invoke(Candidate, *static_cast(instance))); - }}; + internal::meta_extend( + owner(), + type_id().hash(), + internal::meta_conv_node{ + +[](const void *instance) { + return forward_as_meta(std::invoke(Candidate, *static_cast(instance))); + }}); - internal::meta_extend(owner(), type_id().hash(), std::move(node)); return *this; } @@ -248,12 +256,14 @@ public: auto conv() noexcept { using conv_type = std::remove_cv_t>; - internal::meta_conv_node node{ - +[](const void *instance) { - return forward_as_meta(static_cast(*static_cast(instance))); - }}; + internal::meta_extend( + owner(), + type_id().hash(), + internal::meta_conv_node{ + +[](const void *instance) { + return forward_as_meta(static_cast(*static_cast(instance))); + }}); - internal::meta_extend(owner(), type_id().hash(), std::move(node)); return *this; } @@ -276,12 +286,14 @@ public: static_assert(Policy::template value, "Invalid return type for the given policy"); static_assert(std::is_same_v>, Type>, "The function doesn't return an object of the required type"); - internal::meta_ctor_node node{ - descriptor::args_type::size, - &meta_arg, - &meta_construct}; + internal::meta_extend( + owner(), + type_id().hash(), + internal::meta_ctor_node{ + descriptor::args_type::size, + &meta_arg, + &meta_construct}); - internal::meta_extend(owner(), type_id().hash(), std::move(node)); return *this; } @@ -299,12 +311,14 @@ public: auto ctor() noexcept { using descriptor = meta_function_helper_t; - internal::meta_ctor_node node{ - descriptor::args_type::size, - &meta_arg, - &meta_construct}; + internal::meta_extend( + owner(), + type_id().hash(), + internal::meta_ctor_node{ + descriptor::args_type::size, + &meta_arg, + &meta_construct}); - internal::meta_extend(owner(), type_id().hash(), std::move(node)); return *this; } @@ -329,8 +343,12 @@ public: template auto dtor() noexcept { static_assert(std::is_invocable_v, "The function doesn't accept an object of the type provided"); - internal::meta_dtor_node node{+[](void *instance) { std::invoke(Func, *static_cast(instance)); }}; - internal::meta_extend(owner(), std::move(node)); + + internal::meta_extend( + owner(), + internal::meta_dtor_node{ + +[](void *instance) { std::invoke(Func, *static_cast(instance)); }}); + return *this; } @@ -352,29 +370,33 @@ public: if constexpr(std::is_member_object_pointer_v) { using data_type = std::remove_reference_t>; - internal::meta_data_node node{ - /* this is never static */ - std::is_const_v ? internal::meta_traits::is_const : internal::meta_traits::is_none, - 1u, - &internal::resolve>, - &meta_arg>>, - &meta_setter, - &meta_getter}; + auto &&elem = internal::meta_extend( + owner(), + id, + internal::meta_data_node{ + /* this is never static */ + std::is_const_v ? internal::meta_traits::is_const : internal::meta_traits::is_none, + 1u, + &internal::resolve>, + &meta_arg>>, + &meta_setter, + &meta_getter}); - auto &&elem = internal::meta_extend(owner(), id, std::move(node)); return meta_factory{elem}; } else { using data_type = std::remove_reference_t>; - internal::meta_data_node node{ - ((std::is_same_v> || std::is_const_v) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static, - 1u, - &internal::resolve>, - &meta_arg>>, - &meta_setter, - &meta_getter}; + auto &&elem = internal::meta_extend( + owner(), + id, + internal::meta_data_node{ + ((std::is_same_v> || std::is_const_v) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static, + 1u, + &internal::resolve>, + &meta_arg>>, + &meta_setter, + &meta_getter}); - auto &&elem = internal::meta_extend(owner(), id, std::move(node)); return meta_factory{elem}; } } @@ -405,30 +427,34 @@ public: static_assert(Policy::template value, "Invalid return type for the given policy"); if constexpr(std::is_same_v) { - internal::meta_data_node node{ - /* this is never static */ - internal::meta_traits::is_const, - 0u, - &internal::resolve>>, - &meta_arg>, - &meta_setter, - &meta_getter}; + auto &&elem = internal::meta_extend( + owner(), + id, + internal::meta_data_node{ + /* this is never static */ + internal::meta_traits::is_const, + 0u, + &internal::resolve>>, + &meta_arg>, + &meta_setter, + &meta_getter}); - auto &&elem = internal::meta_extend(owner(), id, std::move(node)); return meta_factory{elem}; } else { using args_type = typename meta_function_helper_t::args_type; - internal::meta_data_node node{ - /* this is never static nor const */ - internal::meta_traits::is_none, - 1u, - &internal::resolve>>, - &meta_arg>>, - &meta_setter, - &meta_getter}; + auto &&elem = internal::meta_extend( + owner(), + id, + internal::meta_data_node{ + /* this is never static nor const */ + internal::meta_traits::is_none, + 1u, + &internal::resolve>>, + &meta_arg>>, + &meta_setter, + &meta_getter}); - auto &&elem = internal::meta_extend(owner(), id, std::move(node)); return meta_factory{elem}; } } @@ -473,14 +499,16 @@ public: using descriptor = meta_function_helper_t; static_assert(Policy::template value, "Invalid return type for the given policy"); - internal::meta_func_node 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), - descriptor::args_type::size, - &internal::resolve, void, std::remove_cv_t>>>, - &meta_arg, - &meta_invoke}; + auto &&elem = internal::meta_extend( + owner(), + 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), + descriptor::args_type::size, + &internal::resolve, void, std::remove_cv_t>>>, + &meta_arg, + &meta_invoke}); - auto &&elem = internal::meta_extend(owner(), id, std::move(node)); return meta_factory{elem}; } };