diff --git a/develop/singles/headers/meta.hpp/meta_all.hpp b/develop/singles/headers/meta.hpp/meta_all.hpp index e83e2e4..7af0cbf 100644 --- a/develop/singles/headers/meta.hpp/meta_all.hpp +++ b/develop/singles/headers/meta.hpp/meta_all.hpp @@ -4163,92 +4163,79 @@ namespace meta_hpp::detail template < array_kind Array > [[nodiscard]] array_type resolve_array_type() { using array_t = std::remove_cv_t; - static array_type type{ensure_type(type_list{})}; - return type; + return array_type{ensure_type(type_list{})}; } template < class_kind Class > [[nodiscard]] class_type resolve_class_type() { using class_t = std::remove_cv_t; - static class_type type{ensure_type(type_list{})}; - return type; + return class_type{ensure_type(type_list{})}; } template < class_kind Class, typename... Args > [[nodiscard]] constructor_type resolve_constructor_type() { using class_t = std::remove_cv_t; - static constructor_type type{ensure_type(type_list{}, type_list{})}; - return type; + return constructor_type{ensure_type(type_list{}, type_list{})}; } template < class_kind Class > [[nodiscard]] destructor_type resolve_destructor_type() { using class_t = std::remove_cv_t; - static destructor_type type{ensure_type(type_list{})}; - return type; + return destructor_type{ensure_type(type_list{})}; } template < enum_kind Enum > [[nodiscard]] enum_type resolve_enum_type() { using enum_t = std::remove_cv_t; - static enum_type type{ensure_type(type_list{})}; - return type; + return enum_type{ensure_type(type_list{})}; } template < function_kind Function > [[nodiscard]] function_type resolve_function_type() { using function_t = std::remove_cv_t; - static function_type type{ensure_type(type_list{})}; - return type; + return function_type{ensure_type(type_list{})}; } template < member_pointer_kind Member > [[nodiscard]] member_type resolve_member_type() { using member_t = std::remove_cv_t; - static member_type type{ensure_type(type_list{})}; - return type; + return member_type{ensure_type(type_list{})}; } template < method_pointer_kind Method > [[nodiscard]] method_type resolve_method_type() { using method_t = std::remove_cv_t; - static method_type type{ensure_type(type_list{})}; - return type; + return method_type{ensure_type(type_list{})}; } template < nullptr_kind Nullptr > [[nodiscard]] nullptr_type resolve_nullptr_type() { using nullptr_t = std::remove_cv_t; - static nullptr_type type{ensure_type(type_list{})}; - return type; + return nullptr_type{ensure_type(type_list{})}; } template < number_kind Number > [[nodiscard]] number_type resolve_number_type() { using number_t = std::remove_cv_t; - static number_type type{ensure_type(type_list{})}; - return type; + return number_type{ensure_type(type_list{})}; } template < pointer_kind Pointer > [[nodiscard]] pointer_type resolve_pointer_type() { using pointer_t = std::remove_cv_t; - static pointer_type type{ensure_type(type_list{})}; - return type; + return pointer_type{ensure_type(type_list{})}; } template < reference_kind Reference > [[nodiscard]] reference_type resolve_reference_type() { using reference_t = std::remove_cv_t; - static reference_type type{ensure_type(type_list{})}; - return type; + return reference_type{ensure_type(type_list{})}; } template < void_kind Void > [[nodiscard]] void_type resolve_void_type() { using void_t = std::remove_cv_t; - static void_type type{ensure_type(type_list{})}; - return type; + return void_type{ensure_type(type_list{})}; } private: @@ -4256,11 +4243,14 @@ namespace meta_hpp::detail template < typename TypeData, typename... Args > TypeData* ensure_type(Args&&... args) { - static auto data{std::make_unique(std::forward(args)...)}; + static auto data = [this](Args&&... args) { + auto new_type_data = std::make_unique(META_HPP_FWD(args)...); - const locker lock; - types_.emplace_back(data.get()); + const locker lock; + types_.emplace_back(new_type_data.get()); + return new_type_data; + }(META_HPP_FWD(args)...); return data.get(); } diff --git a/headers/meta.hpp/meta_detail/type_registry.hpp b/headers/meta.hpp/meta_detail/type_registry.hpp index fe1457a..a232178 100644 --- a/headers/meta.hpp/meta_detail/type_registry.hpp +++ b/headers/meta.hpp/meta_detail/type_registry.hpp @@ -70,92 +70,79 @@ namespace meta_hpp::detail template < array_kind Array > [[nodiscard]] array_type resolve_array_type() { using array_t = std::remove_cv_t; - static array_type type{ensure_type(type_list{})}; - return type; + return array_type{ensure_type(type_list{})}; } template < class_kind Class > [[nodiscard]] class_type resolve_class_type() { using class_t = std::remove_cv_t; - static class_type type{ensure_type(type_list{})}; - return type; + return class_type{ensure_type(type_list{})}; } template < class_kind Class, typename... Args > [[nodiscard]] constructor_type resolve_constructor_type() { using class_t = std::remove_cv_t; - static constructor_type type{ensure_type(type_list{}, type_list{})}; - return type; + return constructor_type{ensure_type(type_list{}, type_list{})}; } template < class_kind Class > [[nodiscard]] destructor_type resolve_destructor_type() { using class_t = std::remove_cv_t; - static destructor_type type{ensure_type(type_list{})}; - return type; + return destructor_type{ensure_type(type_list{})}; } template < enum_kind Enum > [[nodiscard]] enum_type resolve_enum_type() { using enum_t = std::remove_cv_t; - static enum_type type{ensure_type(type_list{})}; - return type; + return enum_type{ensure_type(type_list{})}; } template < function_kind Function > [[nodiscard]] function_type resolve_function_type() { using function_t = std::remove_cv_t; - static function_type type{ensure_type(type_list{})}; - return type; + return function_type{ensure_type(type_list{})}; } template < member_pointer_kind Member > [[nodiscard]] member_type resolve_member_type() { using member_t = std::remove_cv_t; - static member_type type{ensure_type(type_list{})}; - return type; + return member_type{ensure_type(type_list{})}; } template < method_pointer_kind Method > [[nodiscard]] method_type resolve_method_type() { using method_t = std::remove_cv_t; - static method_type type{ensure_type(type_list{})}; - return type; + return method_type{ensure_type(type_list{})}; } template < nullptr_kind Nullptr > [[nodiscard]] nullptr_type resolve_nullptr_type() { using nullptr_t = std::remove_cv_t; - static nullptr_type type{ensure_type(type_list{})}; - return type; + return nullptr_type{ensure_type(type_list{})}; } template < number_kind Number > [[nodiscard]] number_type resolve_number_type() { using number_t = std::remove_cv_t; - static number_type type{ensure_type(type_list{})}; - return type; + return number_type{ensure_type(type_list{})}; } template < pointer_kind Pointer > [[nodiscard]] pointer_type resolve_pointer_type() { using pointer_t = std::remove_cv_t; - static pointer_type type{ensure_type(type_list{})}; - return type; + return pointer_type{ensure_type(type_list{})}; } template < reference_kind Reference > [[nodiscard]] reference_type resolve_reference_type() { using reference_t = std::remove_cv_t; - static reference_type type{ensure_type(type_list{})}; - return type; + return reference_type{ensure_type(type_list{})}; } template < void_kind Void > [[nodiscard]] void_type resolve_void_type() { using void_t = std::remove_cv_t; - static void_type type{ensure_type(type_list{})}; - return type; + return void_type{ensure_type(type_list{})}; } private: @@ -163,11 +150,14 @@ namespace meta_hpp::detail template < typename TypeData, typename... Args > TypeData* ensure_type(Args&&... args) { - static auto data{std::make_unique(std::forward(args)...)}; + static auto data = [this](Args&&... args) { + auto new_type_data = std::make_unique(META_HPP_FWD(args)...); - const locker lock; - types_.emplace_back(data.get()); + const locker lock; + types_.emplace_back(new_type_data.get()); + return new_type_data; + }(META_HPP_FWD(args)...); return data.get(); }