From 346dc03746d71ac7223cc1d150df877b7843a4f7 Mon Sep 17 00:00:00 2001 From: Andrzej Krzemienski Date: Thu, 15 Aug 2024 11:42:42 +0200 Subject: [PATCH] Reimplement trivially semiregular trait --- .../optional/detail/experimental_traits.hpp | 23 +----- include/boost/optional/optional.hpp | 4 -- test/optional_test_experimental_traits.cpp | 70 +++++++++---------- test/optional_test_static_properties.cpp | 56 +++++++-------- 4 files changed, 65 insertions(+), 88 deletions(-) diff --git a/include/boost/optional/detail/experimental_traits.hpp b/include/boost/optional/detail/experimental_traits.hpp index 3776551..4d4abe8 100644 --- a/include/boost/optional/detail/experimental_traits.hpp +++ b/include/boost/optional/detail/experimental_traits.hpp @@ -12,8 +12,6 @@ #ifndef BOOST_OPTIONAL_DETAIL_EXPERIMENTAL_TRAITS_04NOV2017_HPP #define BOOST_OPTIONAL_DETAIL_EXPERIMENTAL_TRAITS_04NOV2017_HPP -#include -#include #include // The condition to use POD implementation @@ -22,8 +20,6 @@ # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES #elif defined BOOST_OPTIONAL_CONFIG_NO_SPEC_FOR_TRIVIAL_TYPES # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES -#elif !defined BOOST_HAS_TRIVIAL_CONSTRUCTOR -# define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES #elif !defined BOOST_HAS_TRIVIAL_MOVE_ASSIGN # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES #elif !defined BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR @@ -34,21 +30,6 @@ # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES #elif !defined BOOST_HAS_TRIVIAL_DESTRUCTOR # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES -#elif BOOST_WORKAROUND(BOOST_GCC, < 50000) -# define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES -#endif - -// GCC 5 or higher, or clang with libc++ or clang with libstdc++ 5 or higher -#if __cplusplus >= 201103L -# if BOOST_WORKAROUND(BOOST_GCC, >= 50000) -# define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS -# elif (defined BOOST_CLANG) -# if BOOST_LIB_STD_CXX > 0 -# define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS -# elif BOOST_LIB_STD_GNU >= 441200023 && BOOST_LIB_STD_GNU != 450600023 && BOOST_LIB_STD_GNU != 450600026 && BOOST_LIB_STD_GNU != 460800003 && BOOST_LIB_STD_GNU != 450400026 && BOOST_LIB_STD_GNU != 460700026 -# define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS -# endif -# endif #endif @@ -56,7 +37,7 @@ namespace boost { namespace optional_detail { #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES template -struct is_type_trivially_copyable +struct is_trivially_semiregular : boost::conditional<(boost::has_trivial_copy_constructor::value && boost::has_trivial_move_constructor::value && boost::has_trivial_destructor::value && @@ -66,7 +47,7 @@ struct is_type_trivially_copyable {}; #else template -struct is_type_trivially_copyable +struct is_trivially_semiregular : boost::conditional<(boost::is_scalar::value && !boost::is_const::value && !boost::is_volatile::value), boost::true_type, boost::false_type>::type {}; diff --git a/include/boost/optional/optional.hpp b/include/boost/optional/optional.hpp index 72fbd60..393eb43 100644 --- a/include/boost/optional/optional.hpp +++ b/include/boost/optional/optional.hpp @@ -22,10 +22,6 @@ #include #endif // BOOST_NO_IOSTREAM -#ifdef BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS -# include -#endif - #include #include #include diff --git a/test/optional_test_experimental_traits.cpp b/test/optional_test_experimental_traits.cpp index 5088b4a..eb8a736 100644 --- a/test/optional_test_experimental_traits.cpp +++ b/test/optional_test_experimental_traits.cpp @@ -43,9 +43,9 @@ struct DeletedDefault }; namespace boost { namespace optional_config { - + template <> struct optional_uses_direct_storage_for : boost::true_type {}; - + }} struct CustDtor @@ -78,47 +78,47 @@ void test_type_traits() // this only tests if type traits are implemented correctly BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for )); - + BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for )); - + BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for > )); - + BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for > )); - - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + + #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for > )); BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for, double> > )); - - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable, double> > )); - - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); -#endif + + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular, double> > )); + + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); +#endif BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for > )); - - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable > )); + + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular > )); } void test_trivial_copyability() @@ -127,16 +127,16 @@ void test_trivial_copyability() BOOST_TEST_TRAIT_TRUE((boost::is_base_of, boost::optional > )); BOOST_TEST_TRAIT_TRUE((boost::is_base_of, boost::optional > )); BOOST_TEST_TRAIT_FALSE((boost::is_base_of, boost::optional > )); - + #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable, double> > > )); - - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular, double> > > )); + + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular > )); #endif } diff --git a/test/optional_test_static_properties.cpp b/test/optional_test_static_properties.cpp index 5dc1053..90cd643 100644 --- a/test/optional_test_static_properties.cpp +++ b/test/optional_test_static_properties.cpp @@ -43,9 +43,9 @@ struct DeletedDefault }; namespace boost { namespace optional_config { - + template <> struct optional_uses_direct_storage_for : boost::true_type {}; - + }} struct CustDtor @@ -78,40 +78,40 @@ void test_type_traits() // this only tests if type traits are implemented correctly BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for )); - + BOOST_TEST_TRAIT_TRUE(( boost::optional_config::optional_uses_direct_storage_for )); - + BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for > )); - + BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for > )); - - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); + + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for > )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for, double> > )); #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES - - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable, double> > )); - -#endif + + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular, double> > )); + +#endif BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for )); BOOST_TEST_TRAIT_FALSE(( boost::optional_config::optional_uses_direct_storage_for > )); - - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable )); - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable > )); + + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular > )); } void test_trivial_copyability() @@ -120,18 +120,18 @@ void test_trivial_copyability() BOOST_TEST_TRAIT_TRUE((boost::is_base_of, boost::optional > )); BOOST_TEST_TRAIT_TRUE((boost::is_base_of, boost::optional > )); BOOST_TEST_TRAIT_FALSE((boost::is_base_of, boost::optional > )); - + #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_type_trivially_copyable > )); - - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_TRUE(( boost::optional_detail::is_trivially_semiregular > )); + + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular > )); #endif - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable > )); - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable > > )); - BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_type_trivially_copyable, double> > > )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular > )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular > > )); + BOOST_TEST_TRAIT_FALSE(( boost::optional_detail::is_trivially_semiregular, double> > > )); } #endif