1// Copyright 2017, 2021 Peter Dimov.
2// Distributed under the Boost Software License, Version 1.0.
3// https://www.boost.org/LICENSE_1_0.txt
4
5#include <boost/system/result.hpp>
6#include <boost/core/lightweight_test.hpp>
7#include <iosfwd>
8#include <cerrno>
9
10using namespace boost::system;
11
12struct X
13{
14 static int instances;
15
16 int v_;
17
18 explicit X( int v ): v_( v ) { ++instances; }
19
20 X( X const& r ) = delete;
21 X( X&& r ): v_( r.v_ ) { r.v_ = 0; ++instances; }
22
23 X& operator=( X const& ) = delete;
24
25 X& operator=( X&& r )
26 {
27 v_ = r.v_;
28 r.v_ = 0;
29
30 return *this;
31 }
32
33 ~X() { --instances; }
34};
35
36bool operator==( X const & x1, X const & x2 )
37{
38 return x1.v_ == x2.v_;
39}
40
41std::ostream& operator<<( std::ostream& os, X const & x )
42{
43 os << "X:" << x.v_;
44 return os;
45}
46
47int X::instances = 0;
48
49struct Y
50{
51 static int instances;
52
53 int v_;
54
55 explicit Y( int v = 0 ): v_( v ) { ++instances; }
56
57 Y( Y const& r ) noexcept: v_( r.v_ ) { ++instances; }
58 Y( Y&& r ) noexcept: v_( r.v_ ) { r.v_ = 0; ++instances; }
59
60 Y& operator=( Y const& ) = default;
61
62 Y& operator=( Y&& r )
63 {
64 v_ = r.v_;
65 r.v_ = 0;
66
67 return *this;
68 }
69
70 ~Y() { --instances; }
71};
72
73bool operator==( Y const & y1, Y const & y2 )
74{
75 return y1.v_ == y2.v_;
76}
77
78std::ostream& operator<<( std::ostream& os, Y const & y )
79{
80 os << "Y:" << y.v_;
81 return os;
82}
83
84int Y::instances = 0;
85
86int main()
87{
88 {
89 result<int> r1( 1 ), r1c( r1 );
90 result<int> r2( 2 ), r2c( r2 );
91
92 r1.swap( r&: r2 );
93
94 BOOST_TEST_EQ( r1, r2c );
95 BOOST_TEST_EQ( r2, r1c );
96
97 swap( r1, r2 );
98
99 BOOST_TEST_EQ( r1, r1c );
100 BOOST_TEST_EQ( r2, r2c );
101 }
102
103 {
104 result<int> r1( 1, generic_category() ), r1c( r1 );
105 result<int> r2( 2, generic_category() ), r2c( r2 );
106
107 r1.swap( r&: r2 );
108
109 BOOST_TEST_EQ( r1, r2c );
110 BOOST_TEST_EQ( r2, r1c );
111
112 swap( r1, r2 );
113
114 BOOST_TEST_EQ( r1, r1c );
115 BOOST_TEST_EQ( r2, r2c );
116 }
117
118 {
119 result<int> r1( 1 ), r1c( r1 );
120 result<int> r2( 2, generic_category() ), r2c( r2 );
121
122 r1.swap( r&: r2 );
123
124 BOOST_TEST_EQ( r1, r2c );
125 BOOST_TEST_EQ( r2, r1c );
126
127 swap( r1, r2 );
128
129 BOOST_TEST_EQ( r1, r1c );
130 BOOST_TEST_EQ( r2, r2c );
131 }
132
133 BOOST_TEST_EQ( X::instances, 0 );
134 BOOST_TEST_EQ( Y::instances, 0 );
135
136 {
137 result<X, Y> r1( in_place_value, 1 ), r1c( in_place_value, 1 );
138 result<X, Y> r2( in_place_value, 2 ), r2c( in_place_value, 2 );
139
140 BOOST_TEST_EQ( X::instances, 4 );
141 BOOST_TEST_EQ( Y::instances, 0 );
142
143 r1.swap( r&: r2 );
144
145 BOOST_TEST_EQ( r1, r2c );
146 BOOST_TEST_EQ( r2, r1c );
147
148 BOOST_TEST_EQ( X::instances, 4 );
149 BOOST_TEST_EQ( Y::instances, 0 );
150
151 swap( r1, r2 );
152
153 BOOST_TEST_EQ( r1, r1c );
154 BOOST_TEST_EQ( r2, r2c );
155
156 BOOST_TEST_EQ( X::instances, 4 );
157 BOOST_TEST_EQ( Y::instances, 0 );
158 }
159
160 BOOST_TEST_EQ( X::instances, 0 );
161 BOOST_TEST_EQ( Y::instances, 0 );
162
163 {
164 result<X, Y> r1( in_place_error, 1 ), r1c( in_place_error, 1 );
165 result<X, Y> r2( in_place_error, 2 ), r2c( in_place_error, 2 );
166
167 BOOST_TEST_EQ( X::instances, 0 );
168 BOOST_TEST_EQ( Y::instances, 4 );
169
170 r1.swap( r&: r2 );
171
172 BOOST_TEST_EQ( r1, r2c );
173 BOOST_TEST_EQ( r2, r1c );
174
175 BOOST_TEST_EQ( X::instances, 0 );
176 BOOST_TEST_EQ( Y::instances, 4 );
177
178 swap( r1, r2 );
179
180 BOOST_TEST_EQ( r1, r1c );
181 BOOST_TEST_EQ( r2, r2c );
182
183 BOOST_TEST_EQ( X::instances, 0 );
184 BOOST_TEST_EQ( Y::instances, 4 );
185 }
186
187 BOOST_TEST_EQ( X::instances, 0 );
188 BOOST_TEST_EQ( Y::instances, 0 );
189
190 {
191 result<X, Y> r1( in_place_value, 1 ), r1c( in_place_value, 1 );
192 result<X, Y> r2( in_place_error, 2 ), r2c( in_place_error, 2 );
193
194 BOOST_TEST_EQ( X::instances, 2 );
195 BOOST_TEST_EQ( Y::instances, 2 );
196
197 r1.swap( r&: r2 );
198
199 BOOST_TEST_EQ( r1, r2c );
200 BOOST_TEST_EQ( r2, r1c );
201
202 BOOST_TEST_EQ( X::instances, 2 );
203 BOOST_TEST_EQ( Y::instances, 2 );
204
205 swap( r1, r2 );
206
207 BOOST_TEST_EQ( r1, r1c );
208 BOOST_TEST_EQ( r2, r2c );
209
210 BOOST_TEST_EQ( X::instances, 2 );
211 BOOST_TEST_EQ( Y::instances, 2 );
212 }
213
214 BOOST_TEST_EQ( X::instances, 0 );
215 BOOST_TEST_EQ( Y::instances, 0 );
216
217 {
218 result<void> r1, r1c( r1 );
219 result<void> r2, r2c( r2 );
220
221 r1.swap( r&: r2 );
222
223 BOOST_TEST_EQ( r1, r2c );
224 BOOST_TEST_EQ( r2, r1c );
225
226 swap( r1, r2 );
227
228 BOOST_TEST_EQ( r1, r1c );
229 BOOST_TEST_EQ( r2, r2c );
230 }
231
232 {
233 result<void> r1( 1, generic_category() ), r1c( r1 );
234 result<void> r2( 2, generic_category() ), r2c( r2 );
235
236 r1.swap( r&: r2 );
237
238 BOOST_TEST_EQ( r1, r2c );
239 BOOST_TEST_EQ( r2, r1c );
240
241 swap( r1, r2 );
242
243 BOOST_TEST_EQ( r1, r1c );
244 BOOST_TEST_EQ( r2, r2c );
245 }
246
247 {
248 result<void> r1, r1c( r1 );
249 result<void> r2( 2, generic_category() ), r2c( r2 );
250
251 r1.swap( r&: r2 );
252
253 BOOST_TEST_EQ( r1, r2c );
254 BOOST_TEST_EQ( r2, r1c );
255
256 swap( r1, r2 );
257
258 BOOST_TEST_EQ( r1, r1c );
259 BOOST_TEST_EQ( r2, r2c );
260 }
261
262 {
263 int x1 = 1;
264 int x2 = 2;
265
266 result<int&> r1( x1 ), r1c( r1 );
267 result<int&> r2( x2 ), r2c( r2 );
268
269 r1.swap( r&: r2 );
270
271 BOOST_TEST_EQ( r1, r2c );
272 BOOST_TEST_EQ( r2, r1c );
273
274 swap( r1, r2 );
275
276 BOOST_TEST_EQ( r1, r1c );
277 BOOST_TEST_EQ( r2, r2c );
278 }
279
280 {
281 result<int&> r1( 1, generic_category() ), r1c( r1 );
282 result<int&> r2( 2, generic_category() ), r2c( r2 );
283
284 r1.swap( r&: r2 );
285
286 BOOST_TEST_EQ( r1, r2c );
287 BOOST_TEST_EQ( r2, r1c );
288
289 swap( r1, r2 );
290
291 BOOST_TEST_EQ( r1, r1c );
292 BOOST_TEST_EQ( r2, r2c );
293 }
294
295 {
296 int x1 = 1;
297
298 result<int&> r1( x1 ), r1c( r1 );
299 result<int&> r2( 2, generic_category() ), r2c( r2 );
300
301 r1.swap( r&: r2 );
302
303 BOOST_TEST_EQ( r1, r2c );
304 BOOST_TEST_EQ( r2, r1c );
305
306 swap( r1, r2 );
307
308 BOOST_TEST_EQ( r1, r1c );
309 BOOST_TEST_EQ( r2, r2c );
310 }
311
312 return boost::report_errors();
313}
314

source code of boost/libs/system/test/result_swap.cpp