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