• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 // Copyright 2017 Peter Dimov.
3 //
4 // Distributed under the Boost Software License, Version 1.0.
5 //
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
8 
9 #include <boost/variant2/variant.hpp>
10 
11 using namespace boost::variant2;
12 
13 struct X
14 {
operator intX15     constexpr operator int() const { return 2; }
16 };
17 
18 #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
19 
main()20 int main()
21 {
22     {
23         constexpr variant<int> v( 1 );
24 
25         STATIC_ASSERT( v.index() == 0 );
26         STATIC_ASSERT( get<0>(v) == 1 );
27     }
28 
29     {
30         constexpr variant<int> v( 'a' );
31 
32         STATIC_ASSERT( v.index() == 0 );
33         STATIC_ASSERT( get<0>(v) == 'a' );
34     }
35 
36     {
37         constexpr variant<int> v( X{} );
38 
39         STATIC_ASSERT( v.index() == 0 );
40         STATIC_ASSERT( get<0>(v) == 2 );
41     }
42 
43     {
44         constexpr variant<int const> v( 1 );
45 
46         STATIC_ASSERT( v.index() == 0 );
47         STATIC_ASSERT( get<0>(v) == 1 );
48     }
49 
50     {
51         constexpr variant<int const> v( 'a' );
52 
53         STATIC_ASSERT( v.index() == 0 );
54         STATIC_ASSERT( get<0>(v) == 'a' );
55     }
56 
57     {
58         constexpr variant<int const> v( X{} );
59 
60         STATIC_ASSERT( v.index() == 0 );
61         STATIC_ASSERT( get<0>(v) == 2 );
62     }
63 
64     {
65         constexpr variant<int, float, X> v( 1 );
66 
67         STATIC_ASSERT( v.index() == 0 );
68         STATIC_ASSERT( holds_alternative<int>(v) );
69         STATIC_ASSERT( get<0>(v) == 1 );
70     }
71 
72     {
73         constexpr variant<int, float, X> v( 'a' );
74 
75         STATIC_ASSERT( v.index() == 0 );
76         STATIC_ASSERT( holds_alternative<int>(v) );
77         STATIC_ASSERT( get<0>(v) == 'a' );
78     }
79 
80     {
81         constexpr variant<int, float, X> v( 3.14f );
82 
83         STATIC_ASSERT( v.index() == 1 );
84         STATIC_ASSERT( holds_alternative<float>(v) );
85         STATIC_ASSERT( get<1>(v) == 3.14f );
86     }
87 
88     {
89         constexpr variant<int, float, X> v( X{} );
90 
91         STATIC_ASSERT( v.index() == 2 );
92         STATIC_ASSERT( holds_alternative<X>(v) );
93     }
94 
95     {
96         constexpr variant<int, int, float, X> v( 3.14f );
97 
98         STATIC_ASSERT( v.index() == 2 );
99         STATIC_ASSERT( holds_alternative<float>(v) );
100         STATIC_ASSERT( get<2>(v) == 3.14f );
101     }
102 
103     {
104         constexpr variant<int, int, float, X> v( X{} );
105 
106         STATIC_ASSERT( v.index() == 3 );
107         STATIC_ASSERT( holds_alternative<X>(v) );
108     }
109 }
110