Add more constexpr. Refs #53.

This commit is contained in:
Peter Dimov
2025-10-17 22:24:26 +03:00
parent 28d23c14f6
commit e708866c65

View File

@@ -30,6 +30,15 @@
//
// constexpr destructors
#if defined(__cpp_constexpr_dynamic_alloc) && __cpp_constexpr_dynamic_alloc >= 201907L
# define BOOST_VARIANT2_CXX20_CONSTEXPR constexpr
#else
# define BOOST_VARIANT2_CXX20_CONSTEXPR
#endif
//
namespace boost
{
@@ -557,16 +566,16 @@ template<class T1, class... T> union variant_storage_impl<mp11::mp_false, T1, T.
{
}
~variant_storage_impl()
BOOST_VARIANT2_CXX20_CONSTEXPR ~variant_storage_impl()
{
}
template<class... A> void emplace( mp11::mp_size_t<0>, A&&... a )
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<0>, A&&... a )
{
::new( &first_ ) T1( std::forward<A>(a)... );
}
template<std::size_t I, class... A> void emplace( mp11::mp_size_t<I>, A&&... a )
template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<I>, A&&... a )
{
rest_.emplace( mp11::mp_size_t<I-1>(), std::forward<A>(a)... );
}
@@ -606,22 +615,22 @@ template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, c
template<std::size_t I, class... A> constexpr variant_storage_impl( mp11::mp_size_t<I>, A&&... a ): rest_( mp11::mp_size_t<I-10>(), std::forward<A>(a)... ) {}
~variant_storage_impl()
BOOST_VARIANT2_CXX20_CONSTEXPR ~variant_storage_impl()
{
}
template<class... A> void emplace( mp11::mp_size_t<0>, A&&... a ) { ::new( &t0_ ) T0( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<1>, A&&... a ) { ::new( &t1_ ) T1( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<2>, A&&... a ) { ::new( &t2_ ) T2( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<3>, A&&... a ) { ::new( &t3_ ) T3( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<4>, A&&... a ) { ::new( &t4_ ) T4( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<5>, A&&... a ) { ::new( &t5_ ) T5( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<6>, A&&... a ) { ::new( &t6_ ) T6( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<7>, A&&... a ) { ::new( &t7_ ) T7( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<8>, A&&... a ) { ::new( &t8_ ) T8( std::forward<A>(a)... ); }
template<class... A> void emplace( mp11::mp_size_t<9>, A&&... a ) { ::new( &t9_ ) T9( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<0>, A&&... a ) { ::new( &t0_ ) T0( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<1>, A&&... a ) { ::new( &t1_ ) T1( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<2>, A&&... a ) { ::new( &t2_ ) T2( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<3>, A&&... a ) { ::new( &t3_ ) T3( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<4>, A&&... a ) { ::new( &t4_ ) T4( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<5>, A&&... a ) { ::new( &t5_ ) T5( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<6>, A&&... a ) { ::new( &t6_ ) T6( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<7>, A&&... a ) { ::new( &t7_ ) T7( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<8>, A&&... a ) { ::new( &t8_ ) T8( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<9>, A&&... a ) { ::new( &t9_ ) T9( std::forward<A>(a)... ); }
template<std::size_t I, class... A> void emplace( mp11::mp_size_t<I>, A&&... a )
template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<I>, A&&... a )
{
rest_.emplace( mp11::mp_size_t<I-10>(), std::forward<A>(a)... );
}
@@ -674,7 +683,7 @@ template<class T1, class... T> union variant_storage_impl<mp11::mp_true, T1, T..
{
}
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<0>, A&&... a )
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<0>, A&&... a )
{
::new( &first_ ) T1( std::forward<A>(a)... );
}
@@ -742,16 +751,16 @@ template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, c
template<std::size_t I, class... A> constexpr variant_storage_impl( mp11::mp_size_t<I>, A&&... a ): rest_( mp11::mp_size_t<I-10>(), std::forward<A>(a)... ) {}
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<0>, A&&... a ) { ::new( &t0_ ) T0( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<1>, A&&... a ) { ::new( &t1_ ) T1( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<2>, A&&... a ) { ::new( &t2_ ) T2( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<3>, A&&... a ) { ::new( &t3_ ) T3( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<4>, A&&... a ) { ::new( &t4_ ) T4( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<5>, A&&... a ) { ::new( &t5_ ) T5( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<6>, A&&... a ) { ::new( &t6_ ) T6( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<7>, A&&... a ) { ::new( &t7_ ) T7( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<8>, A&&... a ) { ::new( &t8_ ) T8( std::forward<A>(a)... ); }
template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<9>, A&&... a ) { ::new( &t9_ ) T9( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<0>, A&&... a ) { ::new( &t0_ ) T0( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<1>, A&&... a ) { ::new( &t1_ ) T1( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<2>, A&&... a ) { ::new( &t2_ ) T2( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<3>, A&&... a ) { ::new( &t3_ ) T3( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<4>, A&&... a ) { ::new( &t4_ ) T4( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<5>, A&&... a ) { ::new( &t5_ ) T5( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<6>, A&&... a ) { ::new( &t6_ ) T6( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<7>, A&&... a ) { ::new( &t7_ ) T7( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<8>, A&&... a ) { ::new( &t8_ ) T8( std::forward<A>(a)... ); }
template<class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<9>, A&&... a ) { ::new( &t9_ ) T9( std::forward<A>(a)... ); }
template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<I>, A&&... a )
{
@@ -890,7 +899,7 @@ template<class... T> struct variant_base_impl<true, true, T...>
}
// requires: ix_ == 0
template<class I, class... A> void _replace( I, A&&... a )
template<class I, class... A> BOOST_CXX14_CONSTEXPR void _replace( I, A&&... a )
{
::new( &st_ ) variant_storage<none, T...>( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... );
@@ -974,7 +983,7 @@ template<class... T> struct variant_base_impl<true, false, T...>
}
// requires: ix_ == 0
template<class I, class... A> void _replace( I, A&&... a )
template<class I, class... A> BOOST_CXX14_CONSTEXPR void _replace( I, A&&... a )
{
::new( &st_[ 0 ] ) variant_storage<none, T...>( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... );
@@ -1042,7 +1051,7 @@ template<class... T> struct variant_base_impl<false, true, T...>
}
// requires: ix_ == 0
template<class I, class... A> void _replace( I, A&&... a )
template<class I, class... A> BOOST_CXX14_CONSTEXPR void _replace( I, A&&... a )
{
::new( &st_ ) variant_storage<none, T...>( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... );
@@ -1059,14 +1068,14 @@ template<class... T> struct variant_base_impl<false, true, T...>
{
variant_base_impl * this_;
template<class I> void operator()( I ) const noexcept
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I ) const noexcept
{
using U = mp11::mp_at<mp11::mp_list<none, T...>, I>;
this_->st_.get( I() ).~U();
}
};
void _destroy() noexcept
BOOST_CXX14_CONSTEXPR void _destroy() noexcept
{
if( ix_ > 0 )
{
@@ -1074,7 +1083,7 @@ template<class... T> struct variant_base_impl<false, true, T...>
}
}
~variant_base_impl() noexcept
BOOST_VARIANT2_CXX20_CONSTEXPR ~variant_base_impl() noexcept
{
_destroy();
}
@@ -1102,7 +1111,7 @@ template<class... T> struct variant_base_impl<false, true, T...>
return st_.get( mp11::mp_size_t<I+1>() );
}
template<std::size_t I, class... A> void emplace( A&&... a )
template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace( A&&... a )
{
std::size_t const J = I+1;
@@ -1182,7 +1191,7 @@ template<class... T> struct variant_base_impl<false, false, T...>
#endif
// requires: ix_ == 0
template<class I, class... A> void _replace( I, A&&... a )
template<class I, class... A> BOOST_CXX14_CONSTEXPR void _replace( I, A&&... a )
{
::new( &storage( 0 ) ) variant_storage<none, T...>( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... );
@@ -1200,19 +1209,19 @@ template<class... T> struct variant_base_impl<false, false, T...>
variant_base_impl * this_;
unsigned i2_;
template<class I> void operator()( I ) const noexcept
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I ) const noexcept
{
using U = mp11::mp_at<mp11::mp_list<none, T...>, I>;
this_->storage( i2_ ).get( I() ).~U();
}
};
void _destroy() noexcept
BOOST_CXX14_CONSTEXPR void _destroy() noexcept
{
mp11::mp_with_index<1 + sizeof...(T)>( ix_ / 2, _destroy_L1{ this, static_cast<unsigned>( ix_ & 1 ) } );
}
~variant_base_impl() noexcept
BOOST_VARIANT2_CXX20_CONSTEXPR ~variant_base_impl() noexcept
{
_destroy();
}
@@ -1242,7 +1251,7 @@ template<class... T> struct variant_base_impl<false, false, T...>
return storage( ix_ & 1 ).get( mp11::mp_size_t<I+1>() );
}
template<std::size_t I, class... A> void emplace( A&&... a )
template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace( A&&... a )
{
std::size_t const J = I+1;
@@ -1403,7 +1412,7 @@ private:
variant_base * this_;
variant_base const & r;
template<class I> void operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I i ) const
{
this_->_replace( i, r._get_impl( i ) );
}
@@ -1411,7 +1420,7 @@ private:
public:
variant_cc_base_impl( variant_cc_base_impl const& r )
BOOST_CXX14_CONSTEXPR variant_cc_base_impl( variant_cc_base_impl const& r )
noexcept( mp11::mp_all<std::is_nothrow_copy_constructible<T>...>::value )
: variant_base()
{
@@ -1483,7 +1492,7 @@ private:
variant_base * this_;
variant_base const & r;
template<class I> void operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I i ) const
{
this_->template emplace<I::value>( r._get_impl( i ) );
}
@@ -1557,7 +1566,7 @@ private:
variant_base * this_;
variant_base & r;
template<class I> void operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I i ) const
{
this_->_replace( i, std::move( r._get_impl( i ) ) );
}
@@ -1565,7 +1574,7 @@ private:
public:
variant_mc_base_impl( variant_mc_base_impl && r )
BOOST_CXX14_CONSTEXPR variant_mc_base_impl( variant_mc_base_impl && r )
noexcept( mp11::mp_all<std::is_nothrow_move_constructible<T>...>::value )
{
mp11::mp_with_index<sizeof...(T)>( r.index(), L2{ this, r } );
@@ -1636,7 +1645,7 @@ private:
variant_base * this_;
variant_base & r;
template<class I> void operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I i ) const
{
this_->template emplace<I::value>( std::move( r._get_impl( i ) ) );
}
@@ -1644,7 +1653,7 @@ private:
public:
variant_ma_base_impl& operator=( variant_ma_base_impl && r )
BOOST_CXX14_CONSTEXPR variant_ma_base_impl& operator=( variant_ma_base_impl && r )
noexcept( mp11::mp_all<std::is_nothrow_move_constructible<T>...>::value )
{
mp11::mp_with_index<sizeof...(T)>( r.index(), L4{ this, r } );
@@ -1790,7 +1799,7 @@ private:
variant * this_;
variant & r;
template<class I> void operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I i ) const
{
using std::swap;
swap( this_->_get_impl( i ), r._get_impl( i ) );
@@ -1799,7 +1808,7 @@ private:
public:
void swap( variant& r ) noexcept( mp11::mp_all<std::is_nothrow_move_constructible<T>..., detail::is_nothrow_swappable<T>...>::value )
BOOST_CXX14_CONSTEXPR void swap( variant& r ) noexcept( mp11::mp_all<std::is_nothrow_move_constructible<T>..., detail::is_nothrow_swappable<T>...>::value )
{
if( index() == r.index() )
{
@@ -1826,7 +1835,7 @@ private:
variant_base * this_;
variant<U...> const & r;
template<class I> void operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I i ) const
{
using J = mp11::mp_find<mp11::mp_list<T...>, mp11::mp_at<mp11::mp_list<U...>, I>>;
this_->_replace( J{}, r._get_impl( i ) );
@@ -1837,7 +1846,7 @@ public:
template<class... U,
class E2 = mp11::mp_if<mp11::mp_all<std::is_copy_constructible<U>..., mp11::mp_contains<mp11::mp_list<T...>, U>...>, void> >
variant( variant<U...> const& r )
BOOST_CXX14_CONSTEXPR variant( variant<U...> const& r )
noexcept( mp11::mp_all<std::is_nothrow_copy_constructible<U>...>::value )
{
mp11::mp_with_index<sizeof...(U)>( r.index(), L6<U...>{ this, r } );
@@ -1850,7 +1859,7 @@ private:
variant_base * this_;
variant<U...> & r;
template<class I> void operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR void operator()( I i ) const
{
using J = mp11::mp_find<mp11::mp_list<T...>, mp11::mp_at<mp11::mp_list<U...>, I>>;
this_->_replace( J{}, std::move( r._get_impl( i ) ) );
@@ -1861,7 +1870,7 @@ public:
template<class... U,
class E2 = mp11::mp_if<mp11::mp_all<std::is_move_constructible<U>..., mp11::mp_contains<mp11::mp_list<T...>, U>...>, void> >
variant( variant<U...> && r )
BOOST_CXX14_CONSTEXPR variant( variant<U...> && r )
noexcept( mp11::mp_all<std::is_nothrow_move_constructible<U>...>::value )
{
mp11::mp_with_index<sizeof...(U)>( r.index(), L7<U...>{ this, r } );
@@ -1887,7 +1896,7 @@ private:
{
variant * this_;
template<class I> variant<U...> operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR variant<U...> operator()( I i ) const
{
using J = mp11::mp_find<mp11::mp_list<U...>, mp11::mp_at<mp11::mp_list<T...>, I>>;
return this_->_subset_impl<U...>( J{}, this_->_get_impl( i ) );
@@ -1909,7 +1918,7 @@ private:
{
variant const * this_;
template<class I> variant<U...> operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR variant<U...> operator()( I i ) const
{
using J = mp11::mp_find<mp11::mp_list<U...>, mp11::mp_at<mp11::mp_list<T...>, I>>;
return this_->_subset_impl<U...>( J{}, this_->_get_impl( i ) );
@@ -1931,7 +1940,7 @@ private:
{
variant * this_;
template<class I> variant<U...> operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR variant<U...> operator()( I i ) const
{
using J = mp11::mp_find<mp11::mp_list<U...>, mp11::mp_at<mp11::mp_list<T...>, I>>;
return this_->_subset_impl<U...>( J{}, std::move( this_->_get_impl( i ) ) );
@@ -1957,7 +1966,7 @@ private:
{
variant const * this_;
template<class I> variant<U...> operator()( I i ) const
template<class I> BOOST_CXX14_CONSTEXPR variant<U...> operator()( I i ) const
{
using J = mp11::mp_find<mp11::mp_list<U...>, mp11::mp_at<mp11::mp_list<T...>, I>>;
return this_->_subset_impl<U...>( J{}, std::move( this_->_get_impl( i ) ) );
@@ -2293,7 +2302,7 @@ template<class R = detail::deduced, class F, class V1, class V2, class... V> con
// specialized algorithms
template<class... T,
class E = typename std::enable_if<mp11::mp_all<std::is_move_constructible<T>..., detail::is_swappable<T>...>::value>::type>
void swap( variant<T...> & v, variant<T...> & w )
BOOST_CXX14_CONSTEXPR void swap( variant<T...> & v, variant<T...> & w )
noexcept( noexcept(v.swap(w)) )
{
v.swap( w );