• 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/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 
18 struct X
19 {
20     X() = default;
21     X( in_place_index_t<0> ) = delete;
22 };
23 
main()24 int main()
25 {
26     {
27         variant<int> v( in_place_index_t<0>{} );
28 
29         BOOST_TEST_EQ( v.index(), 0 );
30         BOOST_TEST_EQ( get<0>(v), 0 );
31     }
32 
33     {
34         variant<X> v( in_place_index_t<0>{} );
35 
36         BOOST_TEST_EQ( v.index(), 0 );
37     }
38 
39     {
40         variant<int> v( in_place_index_t<0>{}, 1 );
41 
42         BOOST_TEST_EQ( v.index(), 0 );
43         BOOST_TEST_EQ( get<0>(v), 1 );
44     }
45 
46     {
47         variant<int, float> v( in_place_index_t<0>{} );
48 
49         BOOST_TEST_EQ( v.index(), 0 );
50         BOOST_TEST_EQ( get<0>(v), 0 );
51     }
52 
53     {
54         variant<int, float> v( in_place_index_t<0>{}, 1 );
55 
56         BOOST_TEST_EQ( v.index(), 0 );
57         BOOST_TEST_EQ( get<0>(v), 1 );
58     }
59 
60     {
61         variant<int, float> v( in_place_index_t<1>{} );
62 
63         BOOST_TEST_EQ( v.index(), 1 );
64         BOOST_TEST_EQ( get<1>(v), 0 );
65     }
66 
67     {
68         variant<int, float> v( in_place_index_t<1>{}, 3.14f );
69 
70         BOOST_TEST_EQ( v.index(), 1 );
71         BOOST_TEST_EQ( get<1>(v), 3.14f );
72     }
73 
74     {
75         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<0>{}, 1 );
76 
77         BOOST_TEST_EQ( v.index(), 0 );
78         BOOST_TEST_EQ( get<0>(v), 1 );
79     }
80 
81     {
82         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<1>{}, 1 );
83 
84         BOOST_TEST_EQ( v.index(), 1 );
85         BOOST_TEST_EQ( get<1>(v), 1 );
86     }
87 
88     {
89         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<2>{}, 3.14f );
90 
91         BOOST_TEST_EQ( v.index(), 2 );
92         BOOST_TEST_EQ( get<2>(v), 3.14f );
93     }
94 
95     {
96         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<3>{}, 3.14f );
97 
98         BOOST_TEST_EQ( v.index(), 3 );
99         BOOST_TEST_EQ( get<3>(v), 3.14f );
100     }
101 
102     {
103         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<4>{}, "text" );
104 
105         BOOST_TEST_EQ( v.index(), 4 );
106         BOOST_TEST_EQ( get<4>(v), std::string("text") );
107     }
108 
109     {
110         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<5>{}, "text" );
111 
112         BOOST_TEST_EQ( v.index(), 5 );
113         BOOST_TEST_EQ( get<5>(v), std::string("text") );
114     }
115 
116     {
117         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<5>{}, 4, 'a' );
118 
119         BOOST_TEST_EQ( v.index(), 5 );
120         BOOST_TEST_EQ( get<5>(v), std::string( 4, 'a' ) );
121     }
122 
123     {
124         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<4>{}, { 'a', 'b', 'c' } );
125 
126         BOOST_TEST_EQ( v.index(), 4 );
127         BOOST_TEST_EQ( get<4>(v), (std::string{ 'a', 'b', 'c' }) );
128     }
129 
130     {
131         variant<int, int, float, float, std::string, std::string> v( in_place_index_t<5>{}, { 'a', 'b', 'c' }, std::allocator<char>() );
132 
133         BOOST_TEST_EQ( v.index(), 5 );
134         BOOST_TEST_EQ( get<5>(v), (std::string{ 'a', 'b', 'c' }) );
135     }
136 
137     return boost::report_errors();
138 }
139