diff --git a/CMakeLists.txt b/CMakeLists.txt index 97e4c7d..63b2eb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,5 +38,6 @@ target_link_libraries(${PROJECT_NAME} INTERFACE Threads::Threads) # if(PROJECT_IS_TOP_LEVEL) + enable_testing() add_subdirectory(develop) endif() diff --git a/develop/CMakeLists.txt b/develop/CMakeLists.txt index 16be87b..83b1241 100644 --- a/develop/CMakeLists.txt +++ b/develop/CMakeLists.txt @@ -3,7 +3,6 @@ option(BUILD_WITH_SANITIZERS "Build with sanitizers" OFF) option(BUILD_WITH_NO_EXCEPTIONS "Build with no exceptions" ${META_HPP_NO_EXCEPTIONS}) option(BUILD_WITH_NO_RTTI "Build with no RTTI" ${META_HPP_NO_RTTI}) -enable_testing() set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake") list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake") diff --git a/develop/singles/headers/meta.hpp/meta_all.hpp b/develop/singles/headers/meta.hpp/meta_all.hpp index cc9a492..b39dbe8 100644 --- a/develop/singles/headers/meta.hpp/meta_all.hpp +++ b/develop/singles/headers/meta.hpp/meta_all.hpp @@ -3677,15 +3677,17 @@ namespace meta_hpp::detail private: template < array_kind Array > [[nodiscard]] array_type_data* resolve_array_type_data() { - static array_type_data data{type_list{}}; - ensure_type(data); + static array_type_data data = ( + ensure_type(data), + array_type_data{type_list{}}); return &data; } template < class_kind Class > [[nodiscard]] class_type_data* resolve_class_type_data() { - static class_type_data data{type_list{}}; - ensure_type(data); + static class_type_data data = ( + ensure_type(data), + class_type_data{type_list{}}); return &data; } @@ -3703,64 +3705,73 @@ namespace meta_hpp::detail template < enum_kind Enum > [[nodiscard]] enum_type_data* resolve_enum_type_data() { - static enum_type_data data{type_list{}}; - ensure_type(data); + static enum_type_data data = ( + ensure_type(data), + enum_type_data{type_list{}}); return &data; } template < function_kind Function > [[nodiscard]] function_type_data* resolve_function_type_data() { - static function_type_data data{type_list{}}; - ensure_type(data); + static function_type_data data = ( + ensure_type(data), + function_type_data{type_list{}}); return &data; } template < member_kind Member > [[nodiscard]] member_type_data* resolve_member_type_data() { - static member_type_data data{type_list{}}; - ensure_type(data); + static member_type_data data = ( + ensure_type(data), + member_type_data{type_list{}}); return &data; } template < method_kind Method > [[nodiscard]] method_type_data* resolve_method_type_data() { - static method_type_data data{type_list{}}; - ensure_type(data); + static method_type_data data = ( + ensure_type(data), + method_type_data{type_list{}}); return &data; } template < nullptr_kind Nullptr > [[nodiscard]] nullptr_type_data* resolve_nullptr_type_data() { - static nullptr_type_data data{type_list{}}; - ensure_type(data); + static nullptr_type_data data = ( + ensure_type(data), + nullptr_type_data{type_list{}}); return &data; } template < number_kind Number > [[nodiscard]] number_type_data* resolve_number_type_data() { - static number_type_data data{type_list{}}; - ensure_type(data); + static number_type_data data = ( + ensure_type(data), + number_type_data{type_list{}}); return &data; } template < pointer_kind Pointer > [[nodiscard]] pointer_type_data* resolve_pointer_type_data() { - static pointer_type_data data{type_list{}}; - ensure_type(data); + static pointer_type_data data = ( + ensure_type(data), + pointer_type_data{type_list{}}); return &data; } template < reference_kind Reference > [[nodiscard]] reference_type_data* resolve_reference_type_data() { - static reference_type_data data{type_list{}}; - ensure_type(data); + static reference_type_data data = ( + ensure_type(data), + reference_type_data{type_list{}}); return &data; } template < void_kind Void > [[nodiscard]] void_type_data* resolve_void_type_data() { - static void_type_data data{type_list{}}; - ensure_type(data); + static void_type_data data = ( + ensure_type(data), + void_type_data{type_list{}}); return &data; } private: @@ -3768,24 +3779,21 @@ namespace meta_hpp::detail template < typename Type, typename TypeData > void ensure_type(TypeData& type_data) { - static std::once_flag init_flag{}; - std::call_once(init_flag, [this, &type_data](){ - const locker lock; + const locker lock; - auto&& [position, emplaced] = types_.emplace(any_type{&type_data}); - if ( !emplaced ) { - return; - } + auto&& [position, emplaced] = types_.emplace(any_type{&type_data}); + if ( !emplaced ) { + return; + } - #if !defined(META_HPP_NO_RTTI) - META_HPP_TRY { - rtti_types_.emplace(typeid(Type), any_type{&type_data}); - } META_HPP_CATCH(...) { - types_.erase(position); - META_HPP_RETHROW(); - } - #endif - }); + #if !defined(META_HPP_NO_RTTI) + META_HPP_TRY { + rtti_types_.emplace(typeid(Type), any_type{&type_data}); + } META_HPP_CATCH(...) { + types_.erase(position); + META_HPP_RETHROW(); + } + #endif } private: std::recursive_mutex mutex_; diff --git a/develop/untests/meta_utilities/value2_tests.cpp b/develop/untests/meta_utilities/value2_tests.cpp index 86fa095..4760712 100644 --- a/develop/untests/meta_utilities/value2_tests.cpp +++ b/develop/untests/meta_utilities/value2_tests.cpp @@ -187,12 +187,12 @@ TEST_CASE("meta/meta_utilities/value2/counters/small") { CHECK(v1.get_as().x == 3); CHECK(v2.get_as().x == 1); - CHECK(ivec2::destructor_counter == 5); - CHECK(ivec2::move_constructor_counter == 5); + CHECK((ivec2::destructor_counter == 5 || ivec2::destructor_counter == 6)); + CHECK((ivec2::move_constructor_counter == 5 || ivec2::move_constructor_counter == 6)); CHECK(ivec2::copy_constructor_counter == 0); } - CHECK(ivec2::destructor_counter == 7); - CHECK(ivec2::move_constructor_counter == 5); + CHECK((ivec2::destructor_counter == 7 || ivec2::destructor_counter == 8)); + CHECK((ivec2::move_constructor_counter == 5 || ivec2::move_constructor_counter == 6)); CHECK(ivec2::copy_constructor_counter == 0); } } diff --git a/develop/untests/meta_utilities/value_tests.cpp b/develop/untests/meta_utilities/value_tests.cpp index 60bd0ca..16dc13f 100644 --- a/develop/untests/meta_utilities/value_tests.cpp +++ b/develop/untests/meta_utilities/value_tests.cpp @@ -618,15 +618,15 @@ TEST_CASE("meta/meta_utilities/value") { CHECK(ivec2::copy_constructor_counter == 0); meta::uvalue vv1{*vp}; - CHECK((ivec2::move_constructor_counter == 0 || ivec2::move_constructor_counter == 1 || ivec2::move_constructor_counter == 2)); + CHECK(ivec2::move_constructor_counter <= 3); CHECK(ivec2::copy_constructor_counter == 1); meta::uvalue vv2{*std::move(vp)}; - CHECK((ivec2::move_constructor_counter == 0 || ivec2::move_constructor_counter == 2 || ivec2::move_constructor_counter == 4)); + CHECK(ivec2::move_constructor_counter <= 6); CHECK(ivec2::copy_constructor_counter == 2); meta::uvalue vv3{*std::as_const(vp)}; - CHECK((ivec2::move_constructor_counter == 0 || ivec2::move_constructor_counter == 3 || ivec2::move_constructor_counter == 6)); + CHECK(ivec2::move_constructor_counter <= 9); CHECK(ivec2::copy_constructor_counter == 3); } { diff --git a/headers/meta.hpp/meta_detail/type_registry.hpp b/headers/meta.hpp/meta_detail/type_registry.hpp index 942f877..bb84f99 100644 --- a/headers/meta.hpp/meta_detail/type_registry.hpp +++ b/headers/meta.hpp/meta_detail/type_registry.hpp @@ -136,15 +136,17 @@ namespace meta_hpp::detail private: template < array_kind Array > [[nodiscard]] array_type_data* resolve_array_type_data() { - static array_type_data data{type_list{}}; - ensure_type(data); + static array_type_data data = ( + ensure_type(data), + array_type_data{type_list{}}); return &data; } template < class_kind Class > [[nodiscard]] class_type_data* resolve_class_type_data() { - static class_type_data data{type_list{}}; - ensure_type(data); + static class_type_data data = ( + ensure_type(data), + class_type_data{type_list{}}); return &data; } @@ -162,64 +164,73 @@ namespace meta_hpp::detail template < enum_kind Enum > [[nodiscard]] enum_type_data* resolve_enum_type_data() { - static enum_type_data data{type_list{}}; - ensure_type(data); + static enum_type_data data = ( + ensure_type(data), + enum_type_data{type_list{}}); return &data; } template < function_kind Function > [[nodiscard]] function_type_data* resolve_function_type_data() { - static function_type_data data{type_list{}}; - ensure_type(data); + static function_type_data data = ( + ensure_type(data), + function_type_data{type_list{}}); return &data; } template < member_kind Member > [[nodiscard]] member_type_data* resolve_member_type_data() { - static member_type_data data{type_list{}}; - ensure_type(data); + static member_type_data data = ( + ensure_type(data), + member_type_data{type_list{}}); return &data; } template < method_kind Method > [[nodiscard]] method_type_data* resolve_method_type_data() { - static method_type_data data{type_list{}}; - ensure_type(data); + static method_type_data data = ( + ensure_type(data), + method_type_data{type_list{}}); return &data; } template < nullptr_kind Nullptr > [[nodiscard]] nullptr_type_data* resolve_nullptr_type_data() { - static nullptr_type_data data{type_list{}}; - ensure_type(data); + static nullptr_type_data data = ( + ensure_type(data), + nullptr_type_data{type_list{}}); return &data; } template < number_kind Number > [[nodiscard]] number_type_data* resolve_number_type_data() { - static number_type_data data{type_list{}}; - ensure_type(data); + static number_type_data data = ( + ensure_type(data), + number_type_data{type_list{}}); return &data; } template < pointer_kind Pointer > [[nodiscard]] pointer_type_data* resolve_pointer_type_data() { - static pointer_type_data data{type_list{}}; - ensure_type(data); + static pointer_type_data data = ( + ensure_type(data), + pointer_type_data{type_list{}}); return &data; } template < reference_kind Reference > [[nodiscard]] reference_type_data* resolve_reference_type_data() { - static reference_type_data data{type_list{}}; - ensure_type(data); + static reference_type_data data = ( + ensure_type(data), + reference_type_data{type_list{}}); return &data; } template < void_kind Void > [[nodiscard]] void_type_data* resolve_void_type_data() { - static void_type_data data{type_list{}}; - ensure_type(data); + static void_type_data data = ( + ensure_type(data), + void_type_data{type_list{}}); return &data; } private: @@ -227,24 +238,21 @@ namespace meta_hpp::detail template < typename Type, typename TypeData > void ensure_type(TypeData& type_data) { - static std::once_flag init_flag{}; - std::call_once(init_flag, [this, &type_data](){ - const locker lock; + const locker lock; - auto&& [position, emplaced] = types_.emplace(any_type{&type_data}); - if ( !emplaced ) { - return; - } + auto&& [position, emplaced] = types_.emplace(any_type{&type_data}); + if ( !emplaced ) { + return; + } - #if !defined(META_HPP_NO_RTTI) - META_HPP_TRY { - rtti_types_.emplace(typeid(Type), any_type{&type_data}); - } META_HPP_CATCH(...) { - types_.erase(position); - META_HPP_RETHROW(); - } - #endif - }); + #if !defined(META_HPP_NO_RTTI) + META_HPP_TRY { + rtti_types_.emplace(typeid(Type), any_type{&type_data}); + } META_HPP_CATCH(...) { + types_.erase(position); + META_HPP_RETHROW(); + } + #endif } private: std::recursive_mutex mutex_;