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 #include <boost/core/lightweight_test.hpp>
11 #include <boost/core/lightweight_test_trait.hpp>
12 #include <type_traits>
13 #include <utility>
14 #include <string>
15 
16 using namespace boost::variant2;
17 
main()18 int main()
19 {
20     {
21         variant<int> v;
22 
23         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int&>));
24         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int&&>));
25         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int*>));
26     }
27 
28     {
29         variant<int> const v;
30 
31         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
32         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
33         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
34     }
35 
36     {
37         variant<int const> v;
38 
39         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
40         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
41         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
42     }
43 
44     {
45         variant<int volatile> const v;
46 
47         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const volatile&>));
48         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const volatile&&>));
49         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const volatile*>));
50     }
51 
52     {
53         variant<int> v;
54 
55         BOOST_TEST_EQ( get<0>(v), 0 );
56         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
57 
58         BOOST_TEST_EQ( get<0>(std::move(v)), 0 );
59     }
60 
61     {
62         variant<int> const v;
63 
64         BOOST_TEST_EQ( get<0>(v), 0 );
65         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
66 
67         BOOST_TEST_EQ( get<0>(std::move(v)), 0 );
68     }
69 
70     {
71         variant<int> v( 1 );
72 
73         BOOST_TEST_EQ( get<0>(v), 1 );
74         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
75 
76         BOOST_TEST_EQ( get<0>(std::move(v)), 1 );
77     }
78 
79     {
80         variant<int> const v( 1 );
81 
82         BOOST_TEST_EQ( get<0>(v), 1 );
83         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
84 
85         BOOST_TEST_EQ( get<0>(std::move(v)), 1 );
86     }
87 
88     {
89         variant<int, float> v;
90 
91         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int&>));
92         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int&&>));
93         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int*>));
94 
95         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(v)), float&>));
96         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(std::move(v))), float&&>));
97         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<1>(&v)), float*>));
98     }
99 
100     {
101         variant<int, float> const v;
102 
103         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
104         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
105         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
106 
107         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(v)), float const&>));
108         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(std::move(v))), float const&&>));
109         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<1>(&v)), float const*>));
110     }
111 
112     {
113         variant<int const, float volatile> v;
114 
115         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
116         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
117         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
118 
119         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(v)), float volatile&>));
120         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(std::move(v))), float volatile&&>));
121         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<1>(&v)), float volatile*>));
122     }
123 
124     {
125         variant<int const, float volatile> const v;
126 
127         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(v)), int const&>));
128         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<0>(std::move(v))), int const&&>));
129         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<0>(&v)), int const*>));
130 
131         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(v)), float const volatile&>));
132         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get<1>(std::move(v))), float const volatile&&>));
133         BOOST_TEST_TRAIT_TRUE((std::is_same<decltype(get_if<1>(&v)), float const volatile*>));
134     }
135 
136     {
137         variant<int, float> v;
138 
139         BOOST_TEST_EQ( get<0>(v), 0 );
140         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
141 
142         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
143         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
144 
145         BOOST_TEST_EQ( get<0>(std::move(v)), 0 );
146     }
147 
148     {
149         variant<int, float> const v;
150 
151         BOOST_TEST_EQ( get<0>(v), 0 );
152         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
153 
154         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
155         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
156 
157         BOOST_TEST_EQ( get<0>(std::move(v)), 0 );
158     }
159 
160     {
161         variant<int, float> v( 1 );
162 
163         BOOST_TEST_EQ( get<0>(v), 1 );
164         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
165 
166         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
167         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
168 
169         BOOST_TEST_EQ( get<0>(std::move(v)), 1 );
170     }
171 
172     {
173         variant<int, float> const v( 1 );
174 
175         BOOST_TEST_EQ( get<0>(v), 1 );
176         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
177 
178         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
179         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
180 
181         BOOST_TEST_EQ( get<0>(std::move(v)), 1 );
182     }
183 
184     {
185         variant<int, float> v( 3.14f );
186 
187         BOOST_TEST_THROWS( get<0>(v), bad_variant_access );
188         BOOST_TEST_EQ( get_if<0>(&v), nullptr );
189 
190         BOOST_TEST_EQ( get<1>(v), 3.14f );
191         BOOST_TEST_EQ( get_if<1>(&v), &get<1>(v) );
192 
193         BOOST_TEST_EQ( get<1>(std::move(v)), 3.14f );
194     }
195 
196     {
197         variant<int, float> const v( 3.14f );
198 
199         BOOST_TEST_THROWS( get<0>(v), bad_variant_access );
200         BOOST_TEST_EQ( get_if<0>(&v), nullptr );
201 
202         BOOST_TEST_EQ( get<1>(v), 3.14f );
203         BOOST_TEST_EQ( get_if<1>(&v), &get<1>(v) );
204 
205         BOOST_TEST_EQ( get<1>(std::move(v)), 3.14f );
206     }
207 
208     {
209         variant<int, float, float> v;
210 
211         BOOST_TEST_EQ( get<0>(v), 0 );
212         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
213 
214         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
215         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
216 
217         BOOST_TEST_THROWS( get<2>(v), bad_variant_access );
218         BOOST_TEST_EQ( get_if<2>(&v), nullptr );
219 
220         BOOST_TEST_EQ( get<0>(std::move(v)), 0 );
221     }
222 
223     {
224         variant<int, float, float> const v;
225 
226         BOOST_TEST_EQ( get<0>(v), 0 );
227         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
228 
229         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
230         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
231 
232         BOOST_TEST_THROWS( get<2>(v), bad_variant_access );
233         BOOST_TEST_EQ( get_if<2>(&v), nullptr );
234 
235         BOOST_TEST_EQ( get<0>(std::move(v)), 0 );
236     }
237 
238     {
239         variant<int, float, float> v( 1 );
240 
241         BOOST_TEST_EQ( get<0>(v), 1 );
242         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
243 
244         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
245         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
246 
247         BOOST_TEST_THROWS( get<2>(v), bad_variant_access );
248         BOOST_TEST_EQ( get_if<2>(&v), nullptr );
249 
250         BOOST_TEST_EQ( get<0>(std::move(v)), 1 );
251     }
252 
253     {
254         variant<int, float, float> const v( 1 );
255 
256         BOOST_TEST_EQ( get<0>(v), 1 );
257         BOOST_TEST_EQ( get_if<0>(&v), &get<0>(v) );
258 
259         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
260         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
261 
262         BOOST_TEST_THROWS( get<2>(v), bad_variant_access );
263         BOOST_TEST_EQ( get_if<2>(&v), nullptr );
264 
265         BOOST_TEST_EQ( get<0>(std::move(v)), 1 );
266     }
267 
268     {
269         variant<int, int, float> v( 3.14f );
270 
271         BOOST_TEST_THROWS( get<0>(v), bad_variant_access );
272         BOOST_TEST_EQ( get_if<0>(&v), nullptr );
273 
274         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
275         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
276 
277         BOOST_TEST_EQ( get<2>(v), 3.14f );
278         BOOST_TEST_EQ( get_if<2>(&v), &get<2>(v) );
279 
280         BOOST_TEST_EQ( get<2>(std::move(v)), 3.14f );
281     }
282 
283     {
284         variant<int, int, float> const v( 3.14f );
285 
286         BOOST_TEST_THROWS( get<0>(v), bad_variant_access );
287         BOOST_TEST_EQ( get_if<0>(&v), nullptr );
288 
289         BOOST_TEST_THROWS( get<1>(v), bad_variant_access );
290         BOOST_TEST_EQ( get_if<1>(&v), nullptr );
291 
292         BOOST_TEST_EQ( get<2>(v), 3.14f );
293         BOOST_TEST_EQ( get_if<2>(&v), &get<2>(v) );
294 
295         BOOST_TEST_EQ( get<2>(std::move(v)), 3.14f );
296     }
297 
298     {
299         variant<int> * p = 0;
300         BOOST_TEST_EQ( get_if<0>(p), nullptr );
301     }
302 
303     {
304         variant<int const> * p = 0;
305         BOOST_TEST_EQ( get_if<0>(p), nullptr );
306     }
307 
308     {
309         variant<int> const * p = 0;
310         BOOST_TEST_EQ( get_if<0>(p), nullptr );
311     }
312 
313     {
314         variant<int const> const * p = 0;
315         BOOST_TEST_EQ( get_if<0>(p), nullptr );
316     }
317 
318     {
319         variant<int, float> * p = 0;
320         BOOST_TEST_EQ( get_if<0>(p), nullptr );
321     }
322 
323     {
324         variant<int, float> const * p = 0;
325         BOOST_TEST_EQ( get_if<0>(p), nullptr );
326     }
327 
328     {
329         variant<int const, float volatile> * p = 0;
330         BOOST_TEST_EQ( get_if<0>(p), nullptr );
331     }
332 
333     {
334         variant<int const, float volatile> const * p = 0;
335         BOOST_TEST_EQ( get_if<0>(p), nullptr );
336     }
337 
338     {
339         variant<int, int, float, float> * p = 0;
340         BOOST_TEST_EQ( get_if<0>(p), nullptr );
341     }
342 
343     {
344         variant<int, int, float, float> const * p = 0;
345         BOOST_TEST_EQ( get_if<0>(p), nullptr );
346     }
347 
348     return boost::report_errors();
349 }
350