diff --git a/include/boost/variant2/variant.hpp b/include/boost/variant2/variant.hpp index 01b49d5..e18dddb 100644 --- a/include/boost/variant2/variant.hpp +++ b/include/boost/variant2/variant.hpp @@ -590,6 +590,105 @@ template union variant_storage_impl constexpr mp11::mp_at_c, I-1> const& get( mp11::mp_size_t ) const noexcept { return rest_.get( mp11::mp_size_t() ); } }; +template union variant_storage_impl +{ + T0 t0_; + T1 t1_; + T2 t2_; + T3 t3_; + T4 t4_; + T5 t5_; + T6 t6_; + T7 t7_; + T8 t8_; + T9 t9_; + + variant_storage rest_; + + template constexpr explicit variant_storage_impl( mp11::mp_size_t<0>, A&&... a ): t0_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<1>, A&&... a ): t1_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<2>, A&&... a ): t2_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<3>, A&&... a ): t3_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<4>, A&&... a ): t4_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<5>, A&&... a ): t5_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<6>, A&&... a ): t6_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<7>, A&&... a ): t7_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<8>, A&&... a ): t8_( std::forward(a)... ) {} + template constexpr explicit variant_storage_impl( mp11::mp_size_t<9>, A&&... a ): t9_( std::forward(a)... ) {} + + template constexpr explicit variant_storage_impl( mp11::mp_size_t, A&&... a ): rest_( mp11::mp_size_t(), std::forward(a)... ) {} + + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<0>, A&&... a ) { ::new( &t0_ ) T0( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<1>, A&&... a ) { ::new( &t1_ ) T1( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<2>, A&&... a ) { ::new( &t2_ ) T2( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<3>, A&&... a ) { ::new( &t3_ ) T3( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<4>, A&&... a ) { ::new( &t4_ ) T4( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<5>, A&&... a ) { ::new( &t5_ ) T5( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<6>, A&&... a ) { ::new( &t6_ ) T6( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<7>, A&&... a ) { ::new( &t7_ ) T7( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<8>, A&&... a ) { ::new( &t8_ ) T8( std::forward(a)... ); } + template void emplace_impl( mp11::mp_false, mp11::mp_size_t<9>, A&&... a ) { ::new( &t9_ ) T9( std::forward(a)... ); } + + template BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t, A&&... a ) + { + rest_.emplace( mp11::mp_size_t(), std::forward(a)... ); + } + + template BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_true, mp11::mp_size_t, A&&... a ) + { + *this = variant_storage_impl( mp11::mp_size_t(), std::forward(a)... ); + } + + template BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t, A&&... a ) + { + this->emplace_impl( mp11::mp_all< + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable, + detail::is_trivially_move_assignable...>(), mp11::mp_size_t(), std::forward(a)... ); + } + + BOOST_CXX14_CONSTEXPR T0& get( mp11::mp_size_t<0> ) noexcept { return t0_; } + constexpr T0 const& get( mp11::mp_size_t<0> ) const noexcept { return t0_; } + + BOOST_CXX14_CONSTEXPR T1& get( mp11::mp_size_t<1> ) noexcept { return t1_; } + constexpr T1 const& get( mp11::mp_size_t<1> ) const noexcept { return t1_; } + + BOOST_CXX14_CONSTEXPR T2& get( mp11::mp_size_t<2> ) noexcept { return t2_; } + constexpr T2 const& get( mp11::mp_size_t<2> ) const noexcept { return t2_; } + + BOOST_CXX14_CONSTEXPR T3& get( mp11::mp_size_t<3> ) noexcept { return t3_; } + constexpr T3 const& get( mp11::mp_size_t<3> ) const noexcept { return t3_; } + + BOOST_CXX14_CONSTEXPR T4& get( mp11::mp_size_t<4> ) noexcept { return t4_; } + constexpr T4 const& get( mp11::mp_size_t<4> ) const noexcept { return t4_; } + + BOOST_CXX14_CONSTEXPR T5& get( mp11::mp_size_t<5> ) noexcept { return t5_; } + constexpr T5 const& get( mp11::mp_size_t<5> ) const noexcept { return t5_; } + + BOOST_CXX14_CONSTEXPR T6& get( mp11::mp_size_t<6> ) noexcept { return t6_; } + constexpr T6 const& get( mp11::mp_size_t<6> ) const noexcept { return t6_; } + + BOOST_CXX14_CONSTEXPR T7& get( mp11::mp_size_t<7> ) noexcept { return t7_; } + constexpr T7 const& get( mp11::mp_size_t<7> ) const noexcept { return t7_; } + + BOOST_CXX14_CONSTEXPR T8& get( mp11::mp_size_t<8> ) noexcept { return t8_; } + constexpr T8 const& get( mp11::mp_size_t<8> ) const noexcept { return t8_; } + + BOOST_CXX14_CONSTEXPR T9& get( mp11::mp_size_t<9> ) noexcept { return t9_; } + constexpr T9 const& get( mp11::mp_size_t<9> ) const noexcept { return t9_; } + + template BOOST_CXX14_CONSTEXPR mp11::mp_at_c, I-10>& get( mp11::mp_size_t ) noexcept { return rest_.get( mp11::mp_size_t() ); } + template constexpr mp11::mp_at_c, I-10> const& get( mp11::mp_size_t ) const noexcept { return rest_.get( mp11::mp_size_t() ); } +}; + // resolve_overload_* template struct overload;