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/mp11.hpp>
11 #include <boost/core/lightweight_test.hpp>
12 #include <boost/core/lightweight_test_trait.hpp>
13 #include <type_traits>
14 #include <cstddef>
15
16 using namespace boost::variant2;
17 using namespace boost::mp11;
18
19 template<class T> using var_size_t = mp_size_t<variant_size<T>::value>;
20
main()21 int main()
22 {
23 BOOST_TEST_EQ( (variant_size<variant<>>::value), 0 );
24 BOOST_TEST_EQ( (variant_size<variant<> const>::value), 0 );
25 BOOST_TEST_EQ( (variant_size<variant<> volatile>::value), 0 );
26 BOOST_TEST_EQ( (variant_size<variant<> const volatile>::value), 0 );
27
28 BOOST_TEST_EQ( (variant_size<variant<>&>::value), 0 );
29 BOOST_TEST_EQ( (variant_size<variant<> const&>::value), 0 );
30 BOOST_TEST_EQ( (variant_size<variant<>&&>::value), 0 );
31 BOOST_TEST_EQ( (variant_size<variant<> const&&>::value), 0 );
32
33 BOOST_TEST_EQ( (variant_size<variant<void>>::value), 1 );
34 BOOST_TEST_EQ( (variant_size<variant<void> const>::value), 1 );
35 BOOST_TEST_EQ( (variant_size<variant<void> volatile>::value), 1 );
36 BOOST_TEST_EQ( (variant_size<variant<void> const volatile>::value), 1 );
37
38 BOOST_TEST_EQ( (variant_size<variant<void>&>::value), 1 );
39 BOOST_TEST_EQ( (variant_size<variant<void> const&>::value), 1 );
40 BOOST_TEST_EQ( (variant_size<variant<void>&&>::value), 1 );
41 BOOST_TEST_EQ( (variant_size<variant<void> const&&>::value), 1 );
42
43 BOOST_TEST_EQ( (variant_size<variant<void, void>>::value), 2 );
44 BOOST_TEST_EQ( (variant_size<variant<void, void> const>::value), 2 );
45 BOOST_TEST_EQ( (variant_size<variant<void, void> volatile>::value), 2 );
46 BOOST_TEST_EQ( (variant_size<variant<void, void> const volatile>::value), 2 );
47
48 BOOST_TEST_EQ( (variant_size<variant<void, void>&>::value), 2 );
49 BOOST_TEST_EQ( (variant_size<variant<void, void> const&>::value), 2 );
50 BOOST_TEST_EQ( (variant_size<variant<void, void>&&>::value), 2 );
51 BOOST_TEST_EQ( (variant_size<variant<void, void> const&&>::value), 2 );
52
53 BOOST_TEST_EQ( (variant_size<variant<void, void, void>>::value), 3 );
54 BOOST_TEST_EQ( (variant_size<variant<void, void, void> const>::value), 3 );
55 BOOST_TEST_EQ( (variant_size<variant<void, void, void> volatile>::value), 3 );
56 BOOST_TEST_EQ( (variant_size<variant<void, void, void> const volatile>::value), 3 );
57
58 BOOST_TEST_EQ( (variant_size<variant<void, void, void>&>::value), 3 );
59 BOOST_TEST_EQ( (variant_size<variant<void, void, void> const&>::value), 3 );
60 BOOST_TEST_EQ( (variant_size<variant<void, void, void>&&>::value), 3 );
61 BOOST_TEST_EQ( (variant_size<variant<void, void, void> const&&>::value), 3 );
62
63 BOOST_TEST_EQ( (variant_size<variant<void, void, void, void>>::value), 4 );
64 BOOST_TEST_EQ( (variant_size<variant<void, void, void, void> const>::value), 4 );
65 BOOST_TEST_EQ( (variant_size<variant<void, void, void, void> volatile>::value), 4 );
66 BOOST_TEST_EQ( (variant_size<variant<void, void, void, void> const volatile>::value), 4 );
67
68 BOOST_TEST_EQ( (variant_size<variant<void, void, void, void>&>::value), 4 );
69 BOOST_TEST_EQ( (variant_size<variant<void, void, void, void> const&>::value), 4 );
70 BOOST_TEST_EQ( (variant_size<variant<void, void, void, void>&&>::value), 4 );
71 BOOST_TEST_EQ( (variant_size<variant<void, void, void, void> const&&>::value), 4 );
72
73 variant_size<void>();
74 variant_size<void const>();
75 variant_size<void volatile>();
76 variant_size<void const volatile>();
77
78 variant_size<int&>();
79 variant_size<int const&>();
80 variant_size<int&&>();
81 variant_size<int const&&>();
82
83 BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, void>));
84 BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, void const>));
85 BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, void volatile>));
86 BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, void const volatile>));
87
88 BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, int&>));
89 BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, int const&>));
90 BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, int&&>));
91 BOOST_TEST_TRAIT_FALSE((mp_valid<var_size_t, int const&&>));
92
93 BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<>>));
94 BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<> const>));
95 BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<> volatile>));
96 BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<> const volatile>));
97
98 BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<>&>));
99 BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<> const&>));
100 BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<>&&>));
101 BOOST_TEST_TRAIT_TRUE((mp_valid<var_size_t, variant<> const&&>));
102
103 return boost::report_errors();
104 }
105