@@ -357,13 +357,16 @@ CASE( "variant: Allows to obtain the index of the current type" )
357357
358358CASE ( " variant: Allows to inspect if variant is \" valueless by exception\" " )
359359{
360- // struct S { operator int() { throw 42; } };
361- //
362- // variant<float, int> v{12.f}; // OK
363- // v.emplace<1>(S()); // v may be valueless
364- //
365- // EXPECT( v.valueless_by_exception() );
366- EXPECT ( (false && " implement" ) );
360+ #if variant_CPP11_OR_GREATER
361+ struct S { operator int () { throw 42 ; } };
362+
363+ variant< float , int > v{12 .f };
364+
365+ EXPECT_THROWS ( v.emplace <1 >( S () ) );
366+ EXPECT ( v.valueless_by_exception () );
367+ #else
368+ EXPECT ( !!" variant: emplace is not available (no C++11)" );
369+ #endif
367370}
368371
369372CASE ( " variant: Allows to swap variants (member)" )
@@ -495,14 +498,19 @@ CASE( "variant: Allows to swap variants (non-member)" )
495498// variant helper classes:
496499//
497500
498- CASE ( " variant: (monostate) " )
501+ CASE ( " monostate: Allows to make variant default-constructible " )
499502{
500- EXPECT ( (false && " implement" ) );
503+ variant<monostate, NoDefaultConstruct> var;
504+
505+ EXPECT ( true );
501506}
502507
503- CASE ( " variant: (bad_variant_access) " )
508+ CASE ( " bad_variant_access: Indicates invalid variant access " )
504509{
505- EXPECT ( (false && " implement" ) );
510+ variant< char , int > v = 7 ;
511+
512+ EXPECT_THROWS_AS ( get< 0 >( v ), bad_variant_access );
513+ EXPECT_THROWS_AS ( get<char >( v ), bad_variant_access );
506514}
507515
508516namespace {
@@ -516,7 +524,7 @@ namespace {
516524 struct t8 {};
517525}
518526
519- CASE ( " variant : Allows to obtain number of element types (non-standard: max 7)" )
527+ CASE ( " variant_size<> : Allows to obtain number of element types (non-standard: max 7)" )
520528{
521529 typedef variant<t1> var1;
522530 typedef variant<t1, t2> var2;
@@ -537,19 +545,115 @@ CASE( "variant: Allows to obtain number of element types (non-standard: max 7)"
537545// EXPECT( 8 == variant_size<var8>::value );
538546}
539547
540- CASE ( " variant: (variant_alternative)" )
548+ CASE ( " variant_size_v<>: Allows to obtain number of element types (C++14, non-standard: max 7)" )
549+ {
550+ #if variant_CPP14_OR_GREATER
551+ typedef variant<t1> var1;
552+ typedef variant<t1, t2> var2;
553+ typedef variant<t1, t2, t3> var3;
554+ typedef variant<t1, t2, t3, t4> var4;
555+ typedef variant<t1, t2, t3, t4, t5> var5;
556+ typedef variant<t1, t2, t3, t4, t5, t6> var6;
557+ typedef variant<t1, t2, t3, t4, t5, t6, t7> var7;
558+ // typedef variant<t1, t2, t3, t4, t5, t6, t7, t8> var8;
559+
560+ EXPECT ( 1u == variant_size_v<var1> );
561+ EXPECT ( 2u == variant_size_v<var2> );
562+ EXPECT ( 3u == variant_size_v<var3> );
563+ EXPECT ( 4u == variant_size_v<var4> );
564+ EXPECT ( 5u == variant_size_v<var5> );
565+ EXPECT ( 6u == variant_size_v<var6> );
566+ EXPECT ( 7u == variant_size_v<var7> );
567+ // EXPECT( 8u == variant_size_v<var8>::value );
568+ #else
569+ EXPECT ( !!" variant_size_v<>: variable templates is not available (no C++14)" );
570+ #endif
571+ }
572+
573+ CASE ( " variant_size_V(): Allows to obtain number of element types (non-standard: max 7, macro)" )
574+ {
575+ typedef variant<t1> var1;
576+ typedef variant<t1, t2> var2;
577+ typedef variant<t1, t2, t3> var3;
578+ typedef variant<t1, t2, t3, t4> var4;
579+ typedef variant<t1, t2, t3, t4, t5> var5;
580+ typedef variant<t1, t2, t3, t4, t5, t6> var6;
581+ typedef variant<t1, t2, t3, t4, t5, t6, t7> var7;
582+ // typedef variant<t1, t2, t3, t4, t5, t6, t7, t8> var8;
583+
584+ EXPECT ( 1 == variant_size_V ( var1 ) );
585+ EXPECT ( 2 == variant_size_V ( var2 ) );
586+ EXPECT ( 3 == variant_size_V ( var3 ) );
587+ EXPECT ( 4 == variant_size_V ( var4 ) );
588+ EXPECT ( 5 == variant_size_V ( var5 ) );
589+ EXPECT ( 6 == variant_size_V ( var6 ) );
590+ EXPECT ( 7 == variant_size_V ( var7 ) );
591+ // EXPECT( 8 == variant_size_V( var8 ) );
592+ }
593+
594+ CASE ( " variant_alternative<>: Allows to select type by index" )
595+ {
596+ #if variant_HAVE_STATIC_ASSERT
597+ static_assert ( std::is_same<char , typename variant_alternative< 0 , variant<char > >::type >::value, " variant_alternative<0,...>" );
598+ static_assert ( std::is_same<char , typename variant_alternative< 1 , variant<int , char > >::type >::value, " variant_alternative<1,...>" );
599+ static_assert ( std::is_same<char , typename variant_alternative< 2 , variant<int , int , char > >::type >::value, " variant_alternative<2,...>" );
600+ static_assert ( std::is_same<char , typename variant_alternative< 3 , variant<int , int , int , char > >::type >::value, " variant_alternative<3,...>" );
601+ static_assert ( std::is_same<char , typename variant_alternative< 4 , variant<int , int , int , int , char > >::type >::value, " variant_alternative<4,...>" );
602+ static_assert ( std::is_same<char , typename variant_alternative< 5 , variant<int , int , int , int , int , char > >::type >::value, " variant_alternative<5,...>" );
603+ static_assert ( std::is_same<char , typename variant_alternative< 6 , variant<int , int , int , int , int , int , char > >::type >::value, " variant_alternative<6,...>" );
604+ #else
605+ EXPECT ( !!" variant_alternative<>: static_assert is not available (no C++11)" );
606+ #endif
607+ }
608+
609+ CASE ( " variant_alternative_t<>: Allows to select type by index (C++11)" )
541610{
542- EXPECT ( (false && " implement" ) );
611+ #if variant_CPP11_OR_GREATER
612+ static_assert ( std::is_same<char , variant_alternative_t < 0 , variant<char > > >::value, " variant_alternative_t<0,...>" );
613+ static_assert ( std::is_same<char , variant_alternative_t < 1 , variant<int , char > > >::value, " variant_alternative_t<1,...>" );
614+ static_assert ( std::is_same<char , variant_alternative_t < 2 , variant<int , int , char > > >::value, " variant_alternative_t<2,...>" );
615+ static_assert ( std::is_same<char , variant_alternative_t < 3 , variant<int , int , int , char > > >::value, " variant_alternative_t<3,...>" );
616+ static_assert ( std::is_same<char , variant_alternative_t < 4 , variant<int , int , int , int , char > > >::value, " variant_alternative_t<4,...>" );
617+ static_assert ( std::is_same<char , variant_alternative_t < 5 , variant<int , int , int , int , int , char > > >::value, " variant_alternative_t<5,...>" );
618+ static_assert ( std::is_same<char , variant_alternative_t < 6 , variant<int , int , int , int , int , int , char > > >::value, " variant_alternative_t<6,...>" );
619+ #else
620+ EXPECT ( !!" variant_alternative_t<>: alias template is not available (no C++11)" );
621+ #endif
622+ }
623+
624+ CASE ( " variant_alternative_T(): Allows to select type by index (non-standard: macro)" )
625+ {
626+ #if variant_HAVE_STATIC_ASSERT
627+ // cannot use variant<int, char> in macro due to comma:
628+
629+ typedef variant<char > var0;
630+ typedef variant<int , char > var1;
631+ typedef variant<int , int , char > var2;
632+ typedef variant<int , int , int , char > var3;
633+ typedef variant<int , int , int , int , char > var4;
634+ typedef variant<int , int , int , int , int , char > var5;
635+ typedef variant<int , int , int , int , int , int , char > var6;
636+
637+ static_assert ( std::is_same<char , variant_alternative_T ( 0 , var0 ) >::value, " variant_alternative_T(0, var0)" );
638+ static_assert ( std::is_same<char , variant_alternative_T ( 1 , var1 ) >::value, " variant_alternative_T(1, var1)" );
639+ static_assert ( std::is_same<char , variant_alternative_T ( 2 , var2 ) >::value, " variant_alternative_T(2, var2)" );
640+ static_assert ( std::is_same<char , variant_alternative_T ( 3 , var3 ) >::value, " variant_alternative_T(3, var3)" );
641+ static_assert ( std::is_same<char , variant_alternative_T ( 4 , var4 ) >::value, " variant_alternative_T(4, var4)" );
642+ static_assert ( std::is_same<char , variant_alternative_T ( 5 , var5 ) >::value, " variant_alternative_T(5, var5)" );
643+ static_assert ( std::is_same<char , variant_alternative_T ( 6 , var6 ) >::value, " variant_alternative_T(6, var6)" );
644+ #else
645+ EXPECT ( !!" variant_alternative_T(): static_assert is not available (no C++11)" );
646+ #endif
543647}
544648
545- CASE ( " variant : Allows to obtain hash (C++11)" )
649+ CASE ( " std::hash<> : Allows to obtain hash (C++11)" )
546650{
547651#if variant_CPP11_OR_GREATER
548652 variant<int > var ( 7 );
549653
550654 EXPECT ( std::hash<variant<int > >()( var ) == std::hash<variant<int > >()( var ) );
551655#else
552- EXPECT ( !!" variant : std::hash<> is not available (no C++11)" );
656+ EXPECT ( !!" std::hash<> : std::hash<> is not available (no C++11)" );
553657#endif
554658}
555659
0 commit comments