• 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 #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
19 
20 struct X1
21 {
22     int v;
23 
X1X124     X1(): v(0) {}
X1X125     explicit X1(int v): v(v) {}
X1X126     X1(X1 const& r): v(r.v) {}
X1X127     X1(X1&& r): v(r.v) {}
operator =X128     X1& operator=( X1 const& r ) { v = r.v; return *this; }
operator =X129     X1& operator=( X1&& r ) { v = r.v; return *this; }
30 };
31 
operator ==(X1 const & a,X1 const & b)32 inline bool operator==( X1 const& a, X1 const& b ) { return a.v == b.v; }
33 
34 STATIC_ASSERT( !std::is_nothrow_default_constructible<X1>::value );
35 STATIC_ASSERT( !std::is_nothrow_copy_constructible<X1>::value );
36 STATIC_ASSERT( !std::is_nothrow_move_constructible<X1>::value );
37 STATIC_ASSERT( !std::is_nothrow_copy_assignable<X1>::value );
38 STATIC_ASSERT( !std::is_nothrow_move_assignable<X1>::value );
39 
40 struct X2
41 {
42     int v;
43 
X2X244     X2(): v(0) {}
X2X245     explicit X2(int v): v(v) {}
X2X246     X2(X2 const& r): v(r.v) {}
X2X247     X2(X2&& r): v(r.v) {}
operator =X248     X2& operator=( X2 const& r ) { v = r.v; return *this; }
operator =X249     X2& operator=( X2&& r ) { v = r.v; return *this; }
50 };
51 
operator ==(X2 const & a,X2 const & b)52 inline bool operator==( X2 const& a, X2 const& b ) { return a.v == b.v; }
53 
54 STATIC_ASSERT( !std::is_nothrow_default_constructible<X2>::value );
55 STATIC_ASSERT( !std::is_nothrow_copy_constructible<X2>::value );
56 STATIC_ASSERT( !std::is_nothrow_move_constructible<X2>::value );
57 STATIC_ASSERT( !std::is_nothrow_copy_assignable<X2>::value );
58 STATIC_ASSERT( !std::is_nothrow_move_assignable<X2>::value );
59 
main()60 int main()
61 {
62     {
63         variant<int> v;
64         BOOST_TEST_EQ( get<0>(v), 0 );
65 
66         v.emplace<0>( 1 );
67         BOOST_TEST_EQ( get<0>(v), 1 );
68 
69         v.emplace<0>();
70         BOOST_TEST_EQ( get<0>(v), 0 );
71     }
72 
73     {
74         variant<int, float> v;
75         BOOST_TEST_EQ( v.index(), 0 );
76         BOOST_TEST_EQ( get<0>(v), 0 );
77 
78         v.emplace<0>( 1 );
79         BOOST_TEST_EQ( v.index(), 0 );
80         BOOST_TEST_EQ( get<0>(v), 1 );
81 
82         v.emplace<1>( 3.14f );
83         BOOST_TEST_EQ( v.index(), 1 );
84         BOOST_TEST_EQ( get<1>(v), 3.14f );
85 
86         v.emplace<1>();
87         BOOST_TEST_EQ( v.index(), 1 );
88         BOOST_TEST_EQ( get<1>(v), 0 );
89 
90         v.emplace<0>();
91         BOOST_TEST_EQ( v.index(), 0 );
92         BOOST_TEST_EQ( get<0>(v), 0 );
93     }
94 
95     {
96         variant<int, int, float, std::string> v;
97         BOOST_TEST_EQ( v.index(), 0 );
98         BOOST_TEST_EQ( get<0>(v), 0 );
99 
100         v.emplace<0>( 1 );
101         BOOST_TEST_EQ( v.index(), 0 );
102         BOOST_TEST_EQ( get<0>(v), 1 );
103 
104         v.emplace<1>();
105         BOOST_TEST_EQ( v.index(), 1 );
106         BOOST_TEST_EQ( get<1>(v), 0 );
107 
108         v.emplace<1>( 1 );
109         BOOST_TEST_EQ( v.index(), 1 );
110         BOOST_TEST_EQ( get<1>(v), 1 );
111 
112         v.emplace<2>( 3.14f );
113         BOOST_TEST_EQ( v.index(), 2 );
114         BOOST_TEST_EQ( get<2>(v), 3.14f );
115 
116         v.emplace<2>();
117         BOOST_TEST_EQ( v.index(), 2 );
118         BOOST_TEST_EQ( get<2>(v), 0 );
119 
120         v.emplace<3>( "s1" );
121         BOOST_TEST_EQ( v.index(), 3 );
122         BOOST_TEST_EQ( get<3>(v), std::string("s1") );
123 
124         v.emplace<3>( "s2" );
125         BOOST_TEST_EQ( v.index(), 3 );
126         BOOST_TEST_EQ( get<3>(v), std::string("s2") );
127 
128         v.emplace<3>();
129         BOOST_TEST_EQ( v.index(), 3 );
130         BOOST_TEST_EQ( get<3>(v), std::string() );
131 
132         v.emplace<3>( { 'a', 'b' } );
133         BOOST_TEST_EQ( v.index(), 3 );
134         BOOST_TEST_EQ( get<3>(v), (std::string{ 'a', 'b'}) );
135 
136         v.emplace<3>( { 'c', 'd' }, std::allocator<char>() );
137         BOOST_TEST_EQ( v.index(), 3 );
138         BOOST_TEST_EQ( get<3>(v), (std::string{ 'c', 'd'}) );
139     }
140 
141     {
142         variant<X1, X2> v;
143         BOOST_TEST_EQ( v.index(), 0 );
144         BOOST_TEST_EQ( get<0>(v).v, 0 );
145 
146         v.emplace<0>( 1 );
147         BOOST_TEST_EQ( v.index(), 0 );
148         BOOST_TEST_EQ( get<0>(v).v, 1 );
149 
150         v.emplace<1>( 2 );
151         BOOST_TEST_EQ( v.index(), 1 );
152         BOOST_TEST_EQ( get<1>(v).v, 2 );
153 
154         v.emplace<0>();
155         BOOST_TEST_EQ( v.index(), 0 );
156         BOOST_TEST_EQ( get<0>(v).v, 0 );
157 
158         v.emplace<0>( 4 );
159         BOOST_TEST_EQ( v.index(), 0 );
160         BOOST_TEST_EQ( get<0>(v).v, 4 );
161 
162         v.emplace<1>();
163 
164         BOOST_TEST_EQ( v.index(), 1 );
165         BOOST_TEST_EQ( get<1>(v).v, 0 );
166 
167         v.emplace<1>( 6 );
168         BOOST_TEST_EQ( v.index(), 1 );
169         BOOST_TEST_EQ( get<1>(v).v, 6 );
170 
171         v.emplace<0>( 3 );
172         BOOST_TEST_EQ( v.index(), 0 );
173         BOOST_TEST_EQ( get<0>(v).v, 3 );
174 
175         v.emplace<0>( 4 );
176         BOOST_TEST_EQ( v.index(), 0 );
177         BOOST_TEST_EQ( get<0>(v).v, 4 );
178     }
179 
180     return boost::report_errors();
181 }
182