• 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 #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