diff --git a/include/boost/variant2/variant.hpp b/include/boost/variant2/variant.hpp index 4e44611..260411c 100644 --- a/include/boost/variant2/variant.hpp +++ b/include/boost/variant2/variant.hpp @@ -283,6 +283,35 @@ template constexpr std::add_pointer_t get_if(varia namespace detail { +// trivially_* + +#if defined( BOOST_LIBSTDCXX_VERSION ) && BOOST_LIBSTDCXX_VERSION < 50000 + +template struct is_trivially_copy_constructible: mp_bool::value && std::has_trivial_copy_constructor::value> +{ +}; + +template struct is_trivially_copy_assignable: mp_bool::value && std::has_trivial_copy_assign::value> +{ +}; + +template struct is_trivially_move_constructible: mp_bool::value && std::is_trivial::value> +{ +}; + +template struct is_trivially_move_assignable: mp_bool::value && std::is_trivial::value> +{ +}; + +#else + +using std::is_trivially_copy_constructible; +using std::is_trivially_copy_assignable; +using std::is_trivially_move_constructible; +using std::is_trivially_move_assignable; + +#endif + // variant_storage template union variant_storage_impl; @@ -359,15 +388,7 @@ template union variant_storage_impl template constexpr void emplace( mp_size_t, A&&... a ) { -#if defined( BOOST_LIBSTDCXX_VERSION ) && BOOST_LIBSTDCXX_VERSION < 50000 - - this->emplace_impl( mp_all, std::is_trivial, std::is_move_assignable..., std::is_trivial...>(), mp_size_t(), std::forward(a)... ); - -#else - - this->emplace_impl( mp_all, std::is_trivially_move_assignable...>(), mp_size_t(), std::forward(a)... ); - -#endif + this->emplace_impl( mp_all, variant2::detail::is_trivially_move_assignable...>(), mp_size_t(), std::forward(a)... ); } constexpr T1& get( mp_size_t<0> ) noexcept { return first_; } @@ -503,15 +524,7 @@ template struct variant_base_impl std::size_t const J = I+1; using U = mp_at_c, I>; -#if defined( BOOST_LIBSTDCXX_VERSION ) && BOOST_LIBSTDCXX_VERSION < 50000 - - this->emplace_impl( std::is_nothrow_constructible(), mp_all, std::is_move_assignable..., std::is_trivial...>(), std::forward(a)... ); - -#else - - this->emplace_impl( std::is_nothrow_constructible(), mp_all, std::is_trivially_move_assignable...>(), std::forward(a)... ); - -#endif + this->emplace_impl( std::is_nothrow_constructible(), mp_all, variant2::detail::is_trivially_move_assignable...>(), std::forward(a)... ); } }; @@ -869,7 +882,7 @@ public: } template...>, E1> + class E2 = mp_if...>, E1> > constexpr variant( variant const& r ) noexcept : variant_base( static_cast(r) ) @@ -877,7 +890,7 @@ public: } template...>>, E1>, + class E2 = mp_if...>>, E1>, class E3 = mp_if...>, E1> > variant( variant const& r ) @@ -891,7 +904,7 @@ public: } template...>, E1> + class E2 = mp_if...>, E1> > constexpr variant( variant && r ) noexcept : variant_base( static_cast(r) ) @@ -899,7 +912,7 @@ public: } template...>>, E1>, + class E2 = mp_if...>>, E1>, class E3 = mp_if...>, E1> > variant( variant && r ) @@ -946,7 +959,7 @@ public: // assignment template..., std::is_trivially_copy_assignable...>, E1> + class E2 = mp_if..., variant2::detail::is_trivially_copy_assignable...>, E1> > constexpr variant& operator=( variant const & r ) noexcept { @@ -955,7 +968,7 @@ public: } template..., std::is_trivially_copy_assignable...>>, E1>, + class E2 = mp_if..., variant2::detail::is_trivially_copy_assignable...>>, E1>, class E3 = mp_if..., std::is_copy_assignable...>, E1> > constexpr variant& operator=( variant const & r ) @@ -978,7 +991,7 @@ public: } template..., std::is_trivially_move_assignable...>, E1> + class E2 = mp_if..., variant2::detail::is_trivially_move_assignable...>, E1> > constexpr variant& operator=( variant && r ) noexcept { @@ -987,7 +1000,7 @@ public: } template..., std::is_trivially_move_assignable...>>, E1>, + class E2 = mp_if..., variant2::detail::is_trivially_move_assignable...>>, E1>, class E3 = mp_if..., std::is_move_assignable...>, E1> > variant& operator=( variant && r )