10 #ifndef NONSTD_VARIANT_LITE_HPP 11 #define NONSTD_VARIANT_LITE_HPP 13 #define variant_lite_MAJOR 2
14 #define variant_lite_MINOR 0
15 #define variant_lite_PATCH 0
20 #define variant_STRINGIFY_( x ) #x 24 #define variant_VARIANT_DEFAULT 0
25 #define variant_VARIANT_NONSTD 1
26 #define variant_VARIANT_STD 2
31 # if __has_include
(<nonstd/variant.tweak.hpp>) 32 # include <nonstd/variant.tweak.hpp> 34 #define variant_HAVE_TWEAK_HEADER 1
36 #define variant_HAVE_TWEAK_HEADER 0
42 #ifndef variant_CONFIG_OMIT_VARIANT_SIZE_V_MACRO 43 # define variant_CONFIG_OMIT_VARIANT_SIZE_V_MACRO 0
46 #ifndef variant_CONFIG_OMIT_VARIANT_ALTERNATIVE_T_MACRO 47 # define variant_CONFIG_OMIT_VARIANT_ALTERNATIVE_T_MACRO 0
52 #ifndef variant_CONFIG_NO_EXCEPTIONS 53 # if defined(__cpp_exceptions
) || defined(__EXCEPTIONS) || defined(_CPPUNWIND
) 54 # define variant_CONFIG_NO_EXCEPTIONS 0
56 # define variant_CONFIG_NO_EXCEPTIONS 1
63 #ifndef variant_CPLUSPLUS 64 # if defined(_MSVC_LANG
) && !defined(__clang__
) 65 # define variant_CPLUSPLUS (_MSC_VER == 1900
? 201103L
: _MSVC_LANG ) 67 # define variant_CPLUSPLUS __cplusplus
81 # if __has_include( <variant> ) 82 # define variant_HAVE_STD_VARIANT 1
84 # define variant_HAVE_STD_VARIANT 0
87 # define variant_HAVE_STD_VARIANT 0
90 #if !defined( variant_CONFIG_SELECT_VARIANT ) 100 #ifndef nonstd_lite_HAVE_IN_PLACE_TYPES 101 #define nonstd_lite_HAVE_IN_PLACE_TYPES 1
112 using std::in_place_type;
113 using std::in_place_index;
114 using std::in_place_t;
115 using std::in_place_type_t;
116 using std::in_place_index_t;
118 #define nonstd_lite_in_place_t( T) std::in_place_t 119 #define nonstd_lite_in_place_type_t( T) std::in_place_type_t<T> 120 #define nonstd_lite_in_place_index_t(K) std::in_place_index_t<K> 122 #define nonstd_lite_in_place( T) std::in_place_t{} 123 #define nonstd_lite_in_place_type( T) std::in_place_type_t<T>{} 124 #define nonstd_lite_in_place_index(K) std::in_place_index_t<K>{} 138 template< std::size_t K >
151 template< std::size_t K >
163 template< std::size_t K >
171 #define nonstd_lite_in_place_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T> ) 172 #define nonstd_lite_in_place_type_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T> ) 173 #define nonstd_lite_in_place_index_t(K) nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag<K> ) 175 #define nonstd_lite_in_place( T) nonstd::in_place_type<T> 176 #define nonstd_lite_in_place_type( T) nonstd::in_place_type<T> 177 #define nonstd_lite_in_place_index(K) nonstd::in_place_index<K> 190 template< std::size_t K >
193 template< std::size_t K >
196 #define variant_index_tag_t(K) void(&)( nonstd::variants::detail::index_tag_t<K> ) 197 #define variant_index_tag(K) nonstd::variants::detail::index_tag<K> 209 #include <functional> 212 #if ! variant_CONFIG_OMIT_VARIANT_SIZE_V_MACRO 213 # define variant_size_V(T) nonstd::variant_size<T>::value 216 #if ! variant_CONFIG_OMIT_VARIANT_ALTERNATIVE_T_MACRO 217 # define variant_alternative_T(K,T) typename nonstd::variant_alternative<K,T >::type 223 using std::monostate;
224 using std::bad_variant_access;
225 using std::variant_size;
226 using std::variant_size_v;
227 using std::variant_alternative;
228 using std::variant_alternative_t;
232 using std::holds_alternative;
235 using std::operator==;
236 using std::operator!=;
237 using std::operator<;
238 using std::operator<=;
239 using std::operator>;
240 using std::operator>=;
243 constexpr auto variant_npos = std::variant_npos;
256 # include <stdexcept> 261 #define variant_CONFIG_MAX_TYPE_COUNT 16
262 #define variant_CONFIG_MAX_VISITOR_ARG_COUNT 5
266 #ifndef variant_CONFIG_MAX_ALIGN_HACK 267 # define variant_CONFIG_MAX_ALIGN_HACK 0
270 #ifndef variant_CONFIG_ALIGN_AS 274 #ifndef variant_CONFIG_ALIGN_AS_FALLBACK 275 # define variant_CONFIG_ALIGN_AS_FALLBACK double 279 #define variant_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) ) 295 #if defined(_MSC_VER
) && !defined(__clang__
) 296 # define variant_COMPILER_MSVC_VER (_MSC_VER ) 297 # define variant_COMPILER_MSVC_VERSION (_MSC_VER / 10
- 10
* ( 5
+ (_MSC_VER < 1900
) ) ) 299 # define variant_COMPILER_MSVC_VER 0
300 # define variant_COMPILER_MSVC_VERSION 0
303 #define variant_COMPILER_VERSION( major, minor, patch ) ( 10
* ( 10
* (major) + (minor) ) + (patch) ) 305 #if defined(__clang__
) 306 # define variant_COMPILER_CLANG_VERSION variant_COMPILER_VERSION(__clang_major__
, __clang_minor__
, __clang_patchlevel__
) 308 # define variant_COMPILER_CLANG_VERSION 0
311 #if defined(__GNUC__) && !defined(__clang__
) 312 # define variant_COMPILER_GNUC_VERSION variant_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) 314 # define variant_COMPILER_GNUC_VERSION 0
318 # pragma warning( push ) 319 # pragma warning( disable: 4345
) 324 #define variant_HAVE( feature ) ( variant_HAVE_##feature ) 327 # define variant_HAS_CPP0X _HAS_CPP0X 329 # define variant_HAS_CPP0X 0
335 # undef variant_CPP11_OR_GREATER 336 # define variant_CPP11_OR_GREATER 1
380 # define variant_constexpr constexpr 382 # define variant_constexpr 386 # define variant_constexpr14 constexpr 388 # define variant_constexpr14 392 # define variant_noexcept noexcept 394 # define variant_noexcept 398 # define variant_nullptr nullptr 400 # define variant_nullptr NULL 404 # define variant_override override 406 # define variant_override 412 # include <functional> 416 # include <initializer_list> 420 # include <type_traits> 421 #elif variant_HAVE_TR1_TYPE_TRAITS 422 # include <tr1/type_traits> 439 #elif variant_HAVE_TR1_ADD_POINTER 498 template<
bool B,
class T =
void >
512 template<
class T,
class U >
530 #define variant_REQUIRES_T(...) 531 , typename std::enable_if< (__VA_ARGS__), int >::type = 0
533 #define variant_REQUIRES_R(R, ...) 534 typename std::enable_if< (__VA_ARGS__), R>::type 536 #define variant_REQUIRES_A(...) 537 , typename std::enable_if< (__VA_ARGS__), void*>::type = nullptr 541 #define variant_REQUIRES_0(...) 542 template< bool B = (__VA_ARGS__), typename std11::enable_if<B, int>::type = 0
> 544 #define variant_REQUIRES_B(...) 545 , bool B = (__VA_ARGS__), typename std11::enable_if<B, int>::type = 0
564 template<
typename T,
typename =
decltype( swap( std::declval<T&>(), std::declval<T&>() ) ) >
565 static std::true_type test(
int );
568 static std::false_type test(...);
571 struct is_nothrow_swappable
575 template<
typename T >
576 static constexpr bool test()
578 return noexcept( swap( std::declval<T&>(), std::declval<T&>() ) );
581 template<
typename T >
582 static auto test(
int ) -> std::integral_constant<
bool, test<T>()>{}
585 static std::false_type test(...);
592 template<
typename T >
593 struct is_swappable :
decltype( detail::is_swappable::test<T>(0) ){};
595 template<
typename T >
596 struct is_nothrow_swappable :
decltype( detail::is_nothrow_swappable::test<T>(0) ){};
608 #define variant_TL1( T1 ) detail::typelist< T1, detail::nulltype > 609 #define variant_TL2( T1, T2) detail::typelist< T1, variant_TL1( T2) > 610 #define variant_TL3( T1, T2, T3) detail::typelist< T1, variant_TL2( T2, T3) > 611 #define variant_TL4( T1, T2, T3, T4) detail::typelist< T1, variant_TL3( T2, T3, T4) > 612 #define variant_TL5( T1, T2, T3, T4, T5) detail::typelist< T1, variant_TL4( T2, T3, T4, T5) > 613 #define variant_TL6( T1, T2, T3, T4, T5, T6) detail::typelist< T1, variant_TL5( T2, T3, T4, T5, T6) > 614 #define variant_TL7( T1, T2, T3, T4, T5, T6, T7) detail::typelist< T1, variant_TL6( T2, T3, T4, T5, T6, T7) > 615 #define variant_TL8( T1, T2, T3, T4, T5, T6, T7, T8) detail::typelist< T1, variant_TL7( T2, T3, T4, T5, T6, T7, T8) > 616 #define variant_TL9( T1, T2, T3, T4, T5, T6, T7, T8, T9) detail::typelist< T1, variant_TL8( T2, T3, T4, T5, T6, T7, T8, T9) > 617 #define variant_TL10( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) detail::typelist< T1, variant_TL9( T2, T3, T4, T5, T6, T7, T8, T9, T10) > 618 #define variant_TL11( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) detail::typelist< T1, variant_TL10( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) > 619 #define variant_TL12( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) detail::typelist< T1, variant_TL11( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) > 620 #define variant_TL13( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) detail::typelist< T1, variant_TL12( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) > 621 #define variant_TL14( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) detail::typelist< T1, variant_TL13( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) > 622 #define variant_TL15( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) detail::typelist< T1, variant_TL14( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) > 623 #define variant_TL16( T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) detail::typelist< T1, variant_TL15( T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) > 639 template<
class U >
inline TX<T>
operator* ( U
const & )
const {
return TX<
T>(); }
640 template<
class U >
inline TX<T>
operator/ ( U
const & )
const {
return TX<
T>(); }
642 template<
class U >
inline TX<T>
operator% ( U
const & )
const {
return TX<
T>(); }
643 template<
class U >
inline TX<T>
operator+ ( U
const & )
const {
return TX<
T>(); }
644 template<
class U >
inline TX<T>
operator- ( U
const & )
const {
return TX<
T>(); }
646 template<
class U >
inline TX<T> operator<<( U
const & )
const {
return TX<
T>(); }
647 template<
class U >
inline TX<T>
operator>>( U
const & )
const {
return TX<
T>(); }
649 inline bool operator==( T
const & )
const {
return false; }
650 inline bool operator< ( T
const & )
const {
return false; }
652 template<
class U >
inline TX<T>
operator& ( U
const & )
const {
return TX<
T>(); }
653 template<
class U >
inline TX<T>
operator| ( U
const & )
const {
return TX<
T>(); }
654 template<
class U >
inline TX<T>
operator^ ( U
const & )
const {
return TX<
T>(); }
656 template<
class U >
inline TX<T>
operator&&( U
const & )
const {
return TX<
T>(); }
657 template<
class U >
inline TX<T>
operator||( U
const & )
const {
return TX<
T>(); }
680 template<
class Head,
class Tail >
689 template<
class List >
699 template<
class Head,
class Tail >
710 typedef typename std11::conditional< (
sizeof( Head ) > tail_value), Head, tail_type>::type type;
717 template<
class List >
718 struct typelist_max_alignof;
721 struct typelist_max_alignof<
nulltype >
723 enum V { value = 0 } ;
726 template<
class Head,
class Tail >
727 struct typelist_max_alignof<
typelist<Head, Tail> >
730 enum TV { tail_value = size_t( typelist_max_alignof<Tail>::value ) };
733 enum V { value = (
alignof( Head ) > tail_value) ?
alignof( Head ) : std::size_t( tail_value ) };
740 template<
class List >
766 template<
class Head,
class Tail >
774 template<
class List,
class T >
775 struct typelist_index_of;
783 template<
class Tail,
class T >
789 template<
class Head,
class Tail,
class T >
790 struct typelist_index_of<
typelist<Head, Tail>, T >
793 enum TV {
nextVal = typelist_index_of<Tail, T>::value };
801 template<
class List, std::size_t i>
802 struct typelist_type_at;
804 template<
class Head,
class Tail >
810 template<
class Head,
class Tail, std::size_t i >
813 typedef typename typelist_type_at<Tail, i - 1>::
type type;
818 template<
class List, std::size_t CmpIndex, std::size_t LastChecked =
typelist_size<List>::value >
823 typedef typename typelist_type_at<List, LastChecked - 1>::
type cur_type;
830 template<
class List, std::size_t CmpIndex >
836 template<
class List,
class T >
845 #define variant_UNIQUE( name ) variant_UNIQUE2( name, __LINE__ ) 846 #define variant_UNIQUE2( name, line ) variant_UNIQUE3( name, line ) 847 #define variant_UNIQUE3( name, line ) name ## line 849 #define variant_ALIGN_TYPE( type ) 850 type variant_UNIQUE( _t ); struct_t< type > variant_UNIQUE( _st ) 873 #ifdef HAVE_LONG_LONG 888 #undef variant_UNIQUE 889 #undef variant_UNIQUE2 890 #undef variant_UNIQUE3 892 #undef variant_ALIGN_TYPE 894 #elif defined( variant_CONFIG_ALIGN_AS ) 898 #define variant_ALIGN_AS( unused ) 899 variant_CONFIG_ALIGN_AS 905 #define variant_ALIGN_AS( to_align ) 906 typename detail::type_of_size< detail::alignment_types, detail::alignment_of< to_align >::value >::type 908 template<
typename T >
911 template<
typename T >
919 template< size_t A, size_t S >
922 enum V { value = A < S ? A : S };
925 template<
typename T >
932 template<
typename List, size_t N >
947 template<
typename T>
950 #define variant_ALIGN_TYPE( type ) 951 typelist< type , typelist< struct_t< type > 977 > > > > > > > > > > > > > >
978 > > > > > > > > > > > > > >
982 #undef variant_ALIGN_TYPE 988 template<
typename T>
989 inline std::size_t hash( T
const & v )
994 inline std::size_t hash( T0
const & ) {
return 0; }
995 inline std::size_t hash( T1
const & ) {
return 0; }
996 inline std::size_t hash( T2
const & ) {
return 0; }
997 inline std::size_t hash( T3
const & ) {
return 0; }
998 inline std::size_t hash( T4
const & ) {
return 0; }
999 inline std::size_t hash( T5
const & ) {
return 0; }
1000 inline std::size_t hash( T6
const & ) {
return 0; }
1001 inline std::size_t hash( T7
const & ) {
return 0; }
1002 inline std::size_t hash( T8
const & ) {
return 0; }
1003 inline std::size_t hash( T9
const & ) {
return 0; }
1004 inline std::size_t hash( T10
const & ) {
return 0; }
1005 inline std::size_t hash( T11
const & ) {
return 0; }
1006 inline std::size_t hash( T12
const & ) {
return 0; }
1007 inline std::size_t hash( T13
const & ) {
return 0; }
1008 inline std::size_t hash( T14
const & ) {
return 0; }
1009 inline std::size_t hash( T15
const & ) {
return 0; }
1018 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
1022 typedef variant_TL16( T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 ) variant_types;
1025 static U *
as(
void * data )
1027 return reinterpret_cast<
U*>(
data );
1031 static U
const *
as(
void const * data )
1033 return reinterpret_cast<
const U*>(
data );
1066 template<
class T,
class... Args >
1067 static type_index_t construct_t(
void * data, Args&&... args )
1074 template< std::size_t K,
class... Args >
1075 static type_index_t construct_i(
void * data, Args&&... args )
1192 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
1213 struct variant_size;
1215 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
1216 struct variant_size<
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> >
1218 enum _ {
value =
detail::
typelist_size<
variant_TL16(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) >::value };
1227 # define variant_size_V(T) nonstd::variant_size<T>::value 1232 template< std::size_t K,
class T >
1233 struct variant_alternative;
1235 template< std::size_t K,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
1236 struct variant_alternative< K,
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> >
1238 typedef typename detail::typelist_type_at<
variant_TL16(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), K>::
type type;
1242 template< std::size_t K,
class T >
1243 using variant_alternative_t =
typename variant_alternative<K, T>::type;
1247 # define variant_alternative_T(K,T) typename nonstd::variant_alternative<K,T >::type 1265 class bad_variant_access :
public std::exception
1271 virtual const char* what()
const throw()
1274 return "bad variant access";
1302 typedef detail::
helper< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 >
helper_type;
1303 typedef variant_TL16( T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 ) variant_types;
1511 template<
class T,
class...
Args 1520 template<
class T,
class U,
class...
Args 1751 template<
class T,
class...
Args 1764 template<
class T,
class U,
class...
Args 1884 return *
as<
const T>();
1917 return reinterpret_cast<
U*>(
ptr() );
1923 return reinterpret_cast<
U const *>(
ptr() );
1929 return static_cast<std::size_t>( index );
1934 return static_cast<type_index_t>( -1 );
1987 template< std::size_t K,
class T >
1988 variant & assign_value( T && value )
2006 template< std::size_t K,
class T >
2053 enum { data_align =
detail::typelist_max_alignof< variant_types >::value };
2056 aligned_storage_t data;
2058 #elif variant_CONFIG_MAX_ALIGN_HACK 2082 template<
class T,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2083 inline bool holds_alternative(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
const & v )
variant_noexcept 2085 return v.
index() ==
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>::
template index_of<
T>();
2088 template<
class R,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2089 inline R &
get(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> & v,
nonstd_lite_in_place_type_t(R) =
nonstd_lite_in_place_type(R) )
2091 return v.
template get<
R>();
2094 template<
class R,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2095 inline R
const &
get(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
const & v,
nonstd_lite_in_place_type_t(R) =
nonstd_lite_in_place_type(R) )
2097 return v.
template get<
R>();
2100 template< std::size_t K,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2101 inline typename variant_alternative< K,
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> >::
type &
2102 get(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> & v,
nonstd_lite_in_place_index_t(K) =
nonstd_lite_in_place_index(K) )
2112 return v.
template get<
K>();
2115 template< std::size_t K,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2116 inline typename variant_alternative< K,
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> >::
type const &
2117 get(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
const & v,
nonstd_lite_in_place_index_t(K) =
nonstd_lite_in_place_index(K) )
2127 return v.
template get<
K>();
2132 template<
class R,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2133 inline R && get(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> && v,
nonstd_lite_in_place_type_t(R) =
nonstd_lite_in_place_type(R) )
2138 template<
class R,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2139 inline R
const && get(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
const && v,
nonstd_lite_in_place_type_t(R) =
nonstd_lite_in_place_type(R) )
2144 template< std::size_t K,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2145 inline typename variant_alternative< K,
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> >::type &&
2146 get(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> && v,
nonstd_lite_in_place_index_t(K) =
nonstd_lite_in_place_index(K) )
2159 template< std::size_t K,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2160 inline typename variant_alternative< K,
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> >::type
const &&
2161 get(
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
const && v,
nonstd_lite_in_place_index_t(K) =
nonstd_lite_in_place_index(K) )
2176 template<
class T,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2178 get_if(
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> *
pv,
nonstd_lite_in_place_type_t(
T) =
nonstd_lite_in_place_type(
T) )
2180 return (
pv->
index() ==
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>::
template index_of<
T>() ) ? &
get<
T>( *
pv ) :
variant_nullptr;
2183 template<
class T,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2185 get_if(
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const *
pv,
nonstd_lite_in_place_type_t(
T) =
nonstd_lite_in_place_type(
T))
2187 return (
pv->
index() ==
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>::
template index_of<
T>() ) ? &
get<
T>( *
pv ) :
variant_nullptr;
2190 template<
std::
size_t K,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2191 inline typename std11::
add_pointer<
typename variant_alternative<
K,
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> >::
type >::
type 2192 get_if(
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> *
pv,
nonstd_lite_in_place_index_t(
K) =
nonstd_lite_in_place_index(
K) )
2197 template<
std::
size_t K,
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2198 inline typename std11::
add_pointer<
const typename variant_alternative<
K,
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> >::
type >::
type 2199 get_if(
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const *
pv,
nonstd_lite_in_place_index_t(
K) =
nonstd_lite_in_place_index(
K) )
2206 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 2229 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> &
a,
2230 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> &
b )
2232 noexcept(
noexcept(
a.
swap(
b ) ) )
2245 template<
typename R,
typename VT >
2248 template<
typename Visitor,
typename T >
2255 template<
typename R,
typename VT >
2258 template<
typename Visitor,
typename T >
2266 template<
typename R>
2269 template<
typename R,
typename Visitor,
typename V1 >
2279 template<
typename R,
typename Visitor,
typename T2 >
2292 template<
typename T>
2299 template<
typename R,
typename Visitor,
typename T2,
typename T3 >
2314 template<
typename T>
2321 template<
typename R,
typename Visitor,
typename T2,
typename T3,
typename T4 >
2338 template<
typename T>
2345 template<
typename R,
typename Visitor,
typename T2,
typename T3,
typename T4,
typename T5 >
2364 template<
typename T>
2373 template<
typename R,
typename Visitor,
typename V2>
2386 template<
typename T1 >
2393 template<
typename T1,
typename T2 >
2400 template<
typename T1,
typename T2,
typename T3 >
2407 template<
typename T1,
typename T2,
typename T3,
typename T4 >
2414 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5 >
2424 template<
typename R>
2467 template<
typename Visitor,
typename V1,
typename V2,
typename ...
V>
2476 template<
typename Visitor,
typename V1,
typename V2 >
2484 template<
typename Visitor,
typename V1,
typename V2,
typename V3 >
2492 template<
typename Visitor,
typename V1,
typename V2,
typename V3,
typename V4 >
2500 template<
typename Visitor,
typename V1,
typename V2,
typename V3,
typename V4,
typename V5 >
2523 template<
typename Visitor,
typename ...
V >
2531 template<
typename R,
typename Visitor,
typename V1 >
2537 template<
typename R,
typename Visitor,
typename V1,
typename V2 >
2543 template<
typename R,
typename Visitor,
typename V1,
typename V2,
typename V3 >
2549 template<
typename R,
typename Visitor,
typename V1,
typename V2,
typename V3,
typename V4 >
2555 template<
typename R,
typename Visitor,
typename V1,
typename V2,
typename V3,
typename V4,
typename V5 >
2574 case 0:
return get<0>(
v ) ==
get<0>(
w );
2575 case 1:
return get<1>(
v ) ==
get<1>(
w );
2576 case 2:
return get<2>(
v ) ==
get<2>(
w );
2577 case 3:
return get<3>(
v ) ==
get<3>(
w );
2578 case 4:
return get<4>(
v ) ==
get<4>(
w );
2579 case 5:
return get<5>(
v ) ==
get<5>(
w );
2580 case 6:
return get<6>(
v ) ==
get<6>(
w );
2581 case 7:
return get<7>(
v ) ==
get<7>(
w );
2582 case 8:
return get<8>(
v ) ==
get<8>(
w );
2583 case 9:
return get<9>(
v ) ==
get<9>(
w );
2584 case 10:
return get<10>(
v ) ==
get<10>(
w );
2585 case 11:
return get<11>(
v ) ==
get<11>(
w );
2586 case 12:
return get<12>(
v ) ==
get<12>(
w );
2587 case 13:
return get<13>(
v ) ==
get<13>(
w );
2588 case 14:
return get<14>(
v ) ==
get<14>(
w );
2589 case 15:
return get<15>(
v ) ==
get<15>(
w );
2591 default:
return false;
2599 case 0:
return get<0>(
v ) <
get<0>(
w );
2600 case 1:
return get<1>(
v ) <
get<1>(
w );
2601 case 2:
return get<2>(
v ) <
get<2>(
w );
2602 case 3:
return get<3>(
v ) <
get<3>(
w );
2603 case 4:
return get<4>(
v ) <
get<4>(
w );
2604 case 5:
return get<5>(
v ) <
get<5>(
w );
2605 case 6:
return get<6>(
v ) <
get<6>(
w );
2606 case 7:
return get<7>(
v ) <
get<7>(
w );
2607 case 8:
return get<8>(
v ) <
get<8>(
w );
2608 case 9:
return get<9>(
v ) <
get<9>(
w );
2609 case 10:
return get<10>(
v ) <
get<10>(
w );
2610 case 11:
return get<11>(
v ) <
get<11>(
w );
2611 case 12:
return get<12>(
v ) <
get<12>(
w );
2612 case 13:
return get<13>(
v ) <
get<13>(
w );
2613 case 14:
return get<14>(
v ) <
get<14>(
w );
2614 case 15:
return get<15>(
v ) <
get<15>(
w );
2616 default:
return false;
2623 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2625 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
v,
2626 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
w )
2630 else return detail::
Comparator<
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> >::
equal(
v,
w );
2633 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2635 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
v,
2636 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
w )
2638 return ! (
v ==
w );
2641 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2643 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
v,
2644 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
w )
2650 else return detail::
Comparator<
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> >::
less_than(
v,
w );
2653 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2655 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
v,
2656 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
w )
2661 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2663 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
v,
2664 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
w )
2669 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2671 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
v,
2672 variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
w )
2690 struct hash< nonstd::monostate >
2698 template<
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15 >
2699 struct hash<
nonstd::
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15> >
2701 std::
size_t operator()(
nonstd::
variant<
T0,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15>
const &
v )
const variant_noexcept 2734 # pragma warning( pop )
#define variant_CPP11_OR_GREATER
static variant_constexpr std::size_t to_size_t(U index)
#define variant_TL16(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)
#define variant_CPP11_120
#define variant_TL15(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
#define variant_TL2(T1, T2)
#define variant_REQUIRES_B(...)
nonstd::variants::variant_size< variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > >::value
#define variant_HAVE_REMOVE_CV
bool operator<(T const &) const
#define variant_lite_MINOR
variant_constexpr type_index_t variant_npos_internal() const variant_noexcept
#define variant_TL8(T1, T2, T3, T4, T5, T6, T7, T8)
typelist_type_at< List, LastChecked - 1 >::type cur_type
R const & get(variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > const &v, nonstd_lite_in_place_type_t(R)=nonstd_lite_in_place_type(R))
void index_tag(index_tag_t< K >=index_tag_t< K >())
#define variant_HAVE_OVERRIDE
variant_constexpr bool operator>=(monostate, monostate) variant_noexcept
TX< T > operator-(U const &) const
#define variant_CPP14_000
#define variant_VARIANT_STD
#define variant_COMPILER_MSVC_VER
#define variant_VARIANT_DEFAULT
#define variant_HAVE_STD_VARIANT
#define variant_COMPILER_VERSION(major, minor, patch)
#define variant_TL9(T1, T2, T3, T4, T5, T6, T7, T8, T9)
TX< T > operator &&(U const &) const
#define variant_CPLUSPLUS
R & get(variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > &v, nonstd_lite_in_place_type_t(R)=nonstd_lite_in_place_type(R))
bool operator>=(variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > const &v, variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > const &w)
in_place_t in_place(detail::in_place_index_tag< K >=detail::in_place_index_tag< K >())
#define variant_TL10(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
#define variant_TL5(T1, T2, T3, T4, T5)
TX< T > operator/(U const &) const
TX< T > operator+(U const &) const
typelist_type_at< List, CmpIndex >::type cmp_type
#define variant_HAVE_CONSTEXPR_14
TX< T > operator|(U const &) const
#define variant_VARIANT_NONSTD
variant_alternative< K, variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > >::type & get(variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > &v, nonstd_lite_in_place_index_t(K)=nonstd_lite_in_place_index(K))
variant_constexpr bool operator<(monostate, monostate) variant_noexcept
#define variant_STRINGIFY( x)
#define variant_HAVE_NOEXCEPT
#define variant_CPP11_100
TX< T > operator-() const
TX< T > operator>>(U const &) const
TX< T > * operator &() const
#define variant_TL3(T1, T2, T3)
#define variant_TL13(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)
in_place_t in_place_index(detail::in_place_index_tag< K >=detail::in_place_index_tag< K >())
TX< T > operator||(U const &) const
#define variant_BETWEEN(v, lo, hi)
nonstd::variants::variant_alternative< K, variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > >::type detail::typelist_type_at< variant_TL16(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), K >::type type
#define variant_COMPILER_GNUC_VERSION
void const * ptr() const variant_noexcept
variant & copy_assign(variant const &other)
#define variant_TL11(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
#define nonstd_lite_in_place_index_t(K)
variant_constexpr bool operator>(monostate, monostate) variant_noexcept
#define variant_TL4(T1, T2, T3, T4)
#define variant_HAVE_CONDITIONAL
TX< T > operator+() const
variant_CONFIG_ALIGN_AS_FALLBACK type
typelist_type_at< Tail, i - 1 >::type type
static type_index_t copy_assign(type_index_t const from_index, const void *from_value, void *to_value)
#define variant_CONFIG_ALIGN_AS_FALLBACK
#define nonstd_lite_in_place_type(T)
#define variant_HAVE_STD_ADD_POINTER
TX< T > operator%(U const &) const
variant & assign_value(T const &value)
#define variant_CPP17_OR_GREATER
#define variant_HAVE_IS_SAME
static type_index_t copy_construct(type_index_t const from_index, const void *from_value, void *to_value)
#define variant_index_tag_t(K)
#define variant_HAVE_INITIALIZER_LIST
std11::conditional< N==sizeof(typename List::head), typename List::head, typename type_of_size< typename List::tail, N >::type >::type type
static U const * as(void const *data)
#define variant_CONFIG_OMIT_VARIANT_ALTERNATIVE_T_MACRO
#define variant_TL6(T1, T2, T3, T4, T5, T6)
variant_constexpr bool operator<=(monostate, monostate) variant_noexcept
TX< T > operator*(U const &) const
#define variant_constexpr
TX< T > operator!() const
variant_constexpr bool operator==(monostate, monostate) variant_noexcept
#define variant_HAVE_ENABLE_IF
#define variant_HAVE_NULLPTR
#define variant_STRINGIFY_(x)
#define variant_TL12(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
#define variant_lite_MAJOR
TX< T > operator^(U const &) const
constexpr result_type operator()(argument_type const &arg) const
static void destroy(type_index_t index, void *data)
#define variant_TL14(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)
#define variant_TL7(T1, T2, T3, T4, T5, T6, T7)
static type_index_t to_index_t(std::size_t index)
static U * as(void *data)
#define variant_CONFIG_NO_EXCEPTIONS
#define nonstd_lite_in_place_index(K)
#define variant_CONFIG_SELECT_VARIANT
#define variant_HAVE_TYPE_TRAITS
#define nonstd_lite_in_place_type_t(T)
in_place_t in_place_type(detail::in_place_type_tag< T >=detail::in_place_type_tag< T >())
variant_constexpr bool operator!=(monostate, monostate) variant_noexcept
bool holds_alternative(variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > const &v) variant_noexcept
#define variant_CONFIG_OMIT_VARIANT_SIZE_V_MACRO
#define variant_index_tag(K)
#define variant_CONFIG_MAX_ALIGN_HACK
#define variant_CPP11_OR_GREATER_
TX< T > operator &(U const &) const
void * ptr() variant_noexcept
bool operator==(T const &) const
#define variant_lite_PATCH
typedef variant_ALIGN_AS(max_type) align_as_type
typelist_max< Tail >::type tail_type
detail::helper< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > helper_type
void swap_value(type_index_t index, variant &other)
#define variant_USES_STD_VARIANT
variant_alternative< K, variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > >::type const & get(variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > const &v, nonstd_lite_in_place_index_t(K)=nonstd_lite_in_place_index(K))
#define variant_ALIGN_TYPE(type)
#define variant_CPP14_OR_GREATER
TX< T > operator~() const
#define variant_CPP11_140
#define variant_HAVE_CONSTEXPR_11
in_place_t in_place(detail::in_place_type_tag< T >=detail::in_place_type_tag< T >())
nonstd::variants::variant_size< variant< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > >::_ _