1 | // Copyright 2017, 2021, 2022 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 | |
8 | using namespace boost::system; |
9 | |
10 | struct X |
11 | { |
12 | int v_; |
13 | }; |
14 | |
15 | struct Y |
16 | { |
17 | int v_; |
18 | |
19 | explicit Y( int v ): v_( v ) {} |
20 | Y( X x ): v_( x.v_) {} |
21 | |
22 | Y( Y const& ) = delete; |
23 | Y& operator=( Y const& ) = delete; |
24 | |
25 | Y( Y&& r ): v_( r.v_ ) |
26 | { |
27 | r.v_ = 0; |
28 | } |
29 | |
30 | Y& operator=( Y&& ) = delete; |
31 | }; |
32 | |
33 | struct E |
34 | { |
35 | }; |
36 | |
37 | struct E2 |
38 | { |
39 | E2() {} |
40 | E2( E ) {} |
41 | }; |
42 | |
43 | result<int, E2> fi( int x ) |
44 | { |
45 | return 2 * x + 1; |
46 | } |
47 | |
48 | result<int, E2> fi2( int ) |
49 | { |
50 | return E2(); |
51 | } |
52 | |
53 | result<void, E2> fi3( int ) |
54 | { |
55 | return {}; |
56 | } |
57 | |
58 | result<X, E2> fy( Y y ) |
59 | { |
60 | return X{ .v_: 2 * y.v_ + 1 }; |
61 | } |
62 | |
63 | result<X, E2> fy2( Y ) |
64 | { |
65 | return E2(); |
66 | } |
67 | |
68 | result<void, E2> fy3( Y ) |
69 | { |
70 | return {}; |
71 | } |
72 | |
73 | result<int, E2> fri( int& x ) |
74 | { |
75 | return x * 2 + 1; |
76 | } |
77 | |
78 | result<int&, E2> fri2( int& ) |
79 | { |
80 | return E2(); |
81 | } |
82 | |
83 | result<void, E2> fri3( int& ) |
84 | { |
85 | return {}; |
86 | } |
87 | |
88 | result<int, E2> fk() |
89 | { |
90 | return 7; |
91 | } |
92 | |
93 | result<int, E2> fk2() |
94 | { |
95 | return E2(); |
96 | } |
97 | |
98 | result<void, E2> fk3() |
99 | { |
100 | return {}; |
101 | } |
102 | |
103 | result<void, E2> fk4() |
104 | { |
105 | return E2(); |
106 | } |
107 | |
108 | int main() |
109 | { |
110 | { |
111 | result<int, E> r( 1 ); |
112 | |
113 | { |
114 | result<int, E2> r2 = r & fi; |
115 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
116 | } |
117 | |
118 | { |
119 | result<int, E2> r2 = r & fi2; |
120 | BOOST_TEST( r2.has_error() ); |
121 | } |
122 | |
123 | { |
124 | result<void, E2> r2 = r & fi3; |
125 | BOOST_TEST( r2.has_value() ); |
126 | } |
127 | } |
128 | |
129 | { |
130 | result<int, E> const r( 1 ); |
131 | |
132 | { |
133 | result<int, E2> r2 = r & fi; |
134 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
135 | } |
136 | |
137 | { |
138 | result<int, E2> r2 = r & fi2; |
139 | BOOST_TEST( r2.has_error() ); |
140 | } |
141 | |
142 | { |
143 | result<void, E2> r2 = r & fi3; |
144 | BOOST_TEST( r2.has_value() ); |
145 | } |
146 | } |
147 | |
148 | { |
149 | result<int, E2> r2 = result<int, E>( 1 ) & fi; |
150 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
151 | } |
152 | |
153 | { |
154 | result<int, E2> r2 = result<int, E>( 1 ) & fi2; |
155 | BOOST_TEST( r2.has_error() ); |
156 | } |
157 | |
158 | { |
159 | result<void, E2> r2 = result<int, E>( 1 ) & fi3; |
160 | BOOST_TEST( r2.has_value() ); |
161 | } |
162 | |
163 | { |
164 | result<int, E> r( in_place_error ); |
165 | |
166 | { |
167 | result<int, E2> r2 = r & fi; |
168 | BOOST_TEST( r2.has_error() ); |
169 | } |
170 | |
171 | { |
172 | result<int, E2> r2 = r & fi2; |
173 | BOOST_TEST( r2.has_error() ); |
174 | } |
175 | |
176 | { |
177 | result<void, E2> r2 = r & fi3; |
178 | BOOST_TEST( r2.has_error() ); |
179 | } |
180 | } |
181 | |
182 | { |
183 | result<int, E> const r( in_place_error ); |
184 | |
185 | { |
186 | result<int, E2> r2 = r & fi; |
187 | BOOST_TEST( r2.has_error() ); |
188 | } |
189 | |
190 | { |
191 | result<int, E2> r2 = r & fi2; |
192 | BOOST_TEST( r2.has_error() ); |
193 | } |
194 | |
195 | { |
196 | result<void, E2> r2 = r & fi3; |
197 | BOOST_TEST( r2.has_error() ); |
198 | } |
199 | } |
200 | |
201 | { |
202 | result<int, E2> r2 = result<int, E>( in_place_error ) & fi; |
203 | BOOST_TEST( r2.has_error() ); |
204 | } |
205 | |
206 | { |
207 | result<int, E2> r2 = result<int, E>( in_place_error ) & fi2; |
208 | BOOST_TEST( r2.has_error() ); |
209 | } |
210 | |
211 | { |
212 | result<void, E2> r2 = result<int, E>( in_place_error ) & fi3; |
213 | BOOST_TEST( r2.has_error() ); |
214 | } |
215 | |
216 | { |
217 | result<X, E2> r2 = result<Y, E>( in_place_value, 1 ) & fy; |
218 | |
219 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2->v_, 3 ); |
220 | } |
221 | |
222 | { |
223 | result<X, E2> r2 = result<Y, E>( in_place_value, 1 ) & fy2; |
224 | |
225 | BOOST_TEST( r2.has_error() ); |
226 | } |
227 | |
228 | { |
229 | result<void, E2> r2 = result<Y, E>( in_place_value, 1 ) & fy3; |
230 | |
231 | BOOST_TEST( r2.has_value() ); |
232 | } |
233 | |
234 | { |
235 | result<X, E2> r2 = result<Y, E>( in_place_error ) & fy; |
236 | |
237 | BOOST_TEST( r2.has_error() ); |
238 | } |
239 | |
240 | { |
241 | result<X, E2> r2 = result<Y, E>( in_place_error ) & fy2; |
242 | |
243 | BOOST_TEST( r2.has_error() ); |
244 | } |
245 | |
246 | { |
247 | result<void, E2> r2 = result<Y, E>( in_place_error ) & fy3; |
248 | |
249 | BOOST_TEST( r2.has_error() ); |
250 | } |
251 | |
252 | { |
253 | int x1 = 1; |
254 | result<int&, E> r( x1 ); |
255 | |
256 | { |
257 | result<int, E2> r2 = r & fri; |
258 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
259 | } |
260 | |
261 | { |
262 | result<int&, E2> r2 = r & fri2; |
263 | BOOST_TEST( r2.has_error() ); |
264 | } |
265 | |
266 | { |
267 | result<void, E2> r2 = r & fri3; |
268 | BOOST_TEST( r2.has_value() ); |
269 | } |
270 | } |
271 | |
272 | { |
273 | int x1 = 1; |
274 | result<int&, E> const r( x1 ); |
275 | |
276 | { |
277 | result<int, E2> r2 = r & fri; |
278 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
279 | } |
280 | |
281 | { |
282 | result<int&, E2> r2 = r & fri2; |
283 | BOOST_TEST( r2.has_error() ); |
284 | } |
285 | |
286 | { |
287 | result<void, E2> r2 = r & fri3; |
288 | BOOST_TEST( r2.has_value() ); |
289 | } |
290 | } |
291 | |
292 | { |
293 | int x1 = 1; |
294 | |
295 | result<int, E2> r2 = result<int&, E>( x1 ) & fri; |
296 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
297 | } |
298 | |
299 | { |
300 | int x1 = 1; |
301 | |
302 | result<int&, E2> r2 = result<int&, E>( x1 ) & fri2; |
303 | BOOST_TEST( r2.has_error() ); |
304 | } |
305 | |
306 | { |
307 | int x1 = 1; |
308 | |
309 | result<void, E2> r2 = result<int&, E>( x1 ) & fri3; |
310 | BOOST_TEST( r2.has_value() ); |
311 | } |
312 | |
313 | { |
314 | result<int&, E> r( in_place_error ); |
315 | |
316 | { |
317 | result<int, E2> r2 = r & fri; |
318 | BOOST_TEST( r2.has_error() ); |
319 | } |
320 | |
321 | { |
322 | result<int&, E2> r2 = r & fri2; |
323 | BOOST_TEST( r2.has_error() ); |
324 | } |
325 | |
326 | { |
327 | result<void, E2> r2 = r & fri3; |
328 | BOOST_TEST( r2.has_error() ); |
329 | } |
330 | } |
331 | |
332 | { |
333 | result<int&, E> const r( in_place_error ); |
334 | |
335 | { |
336 | result<int, E2> r2 = r & fri; |
337 | BOOST_TEST( r2.has_error() ); |
338 | } |
339 | |
340 | { |
341 | result<int&, E2> r2 = r & fri2; |
342 | BOOST_TEST( r2.has_error() ); |
343 | } |
344 | |
345 | { |
346 | result<void, E2> r2 = r & fri3; |
347 | BOOST_TEST( r2.has_error() ); |
348 | } |
349 | } |
350 | |
351 | { |
352 | result<int, E2> r2 = result<int&, E>( in_place_error ) & fri; |
353 | BOOST_TEST( r2.has_error() ); |
354 | } |
355 | |
356 | { |
357 | result<int&, E2> r2 = result<int&, E>( in_place_error ) & fri2; |
358 | BOOST_TEST( r2.has_error() ); |
359 | } |
360 | |
361 | { |
362 | result<void, E2> r2 = result<int&, E>( in_place_error ) & fri3; |
363 | BOOST_TEST( r2.has_error() ); |
364 | } |
365 | |
366 | { |
367 | result<void, E> r; |
368 | |
369 | { |
370 | result<int, E2> r2 = r & fk; |
371 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); |
372 | } |
373 | |
374 | { |
375 | result<int, E2> r2 = r & fk2; |
376 | BOOST_TEST( r2.has_error() ); |
377 | } |
378 | |
379 | { |
380 | result<void, E2> r2 = r & fk3; |
381 | BOOST_TEST( r2.has_value() ); |
382 | } |
383 | |
384 | { |
385 | result<void, E2> r2 = r & fk4; |
386 | BOOST_TEST( r2.has_error() ); |
387 | } |
388 | } |
389 | |
390 | { |
391 | result<void, E> const r; |
392 | |
393 | { |
394 | result<int, E2> r2 = r & fk; |
395 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); |
396 | } |
397 | |
398 | { |
399 | result<int, E2> r2 = r & fk2; |
400 | BOOST_TEST( r2.has_error() ); |
401 | } |
402 | |
403 | { |
404 | result<void, E2> r2 = r & fk3; |
405 | BOOST_TEST( r2.has_value() ); |
406 | } |
407 | |
408 | { |
409 | result<void, E2> r2 = r & fk4; |
410 | BOOST_TEST( r2.has_error() ); |
411 | } |
412 | } |
413 | |
414 | { |
415 | result<int, E2> r2 = result<void, E>() & fk; |
416 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); |
417 | } |
418 | |
419 | { |
420 | result<int, E2> r2 = result<void, E>() & fk2; |
421 | BOOST_TEST( r2.has_error() ); |
422 | } |
423 | |
424 | { |
425 | result<void, E2> r2 = result<void, E>() & fk3; |
426 | BOOST_TEST( r2.has_value() ); |
427 | } |
428 | |
429 | { |
430 | result<void, E2> r2 = result<void, E>() & fk4; |
431 | BOOST_TEST( r2.has_error() ); |
432 | } |
433 | |
434 | { |
435 | result<void, E> r( in_place_error ); |
436 | |
437 | { |
438 | result<int, E2> r2 = r & fk; |
439 | BOOST_TEST( r2.has_error() ); |
440 | } |
441 | |
442 | { |
443 | result<int, E2> r2 = r & fk2; |
444 | BOOST_TEST( r2.has_error() ); |
445 | } |
446 | |
447 | { |
448 | result<void, E2> r2 = r & fk3; |
449 | BOOST_TEST( r2.has_error() ); |
450 | } |
451 | |
452 | { |
453 | result<void, E2> r2 = r & fk4; |
454 | BOOST_TEST( r2.has_error() ); |
455 | } |
456 | } |
457 | |
458 | { |
459 | result<void, E> const r( in_place_error ); |
460 | |
461 | { |
462 | result<int, E2> r2 = r & fk; |
463 | BOOST_TEST( r2.has_error() ); |
464 | } |
465 | |
466 | { |
467 | result<int, E2> r2 = r & fk2; |
468 | BOOST_TEST( r2.has_error() ); |
469 | } |
470 | |
471 | { |
472 | result<void, E2> r2 = r & fk3; |
473 | BOOST_TEST( r2.has_error() ); |
474 | } |
475 | |
476 | { |
477 | result<void, E2> r2 = r & fk4; |
478 | BOOST_TEST( r2.has_error() ); |
479 | } |
480 | } |
481 | |
482 | { |
483 | result<int, E2> r2 = result<void, E>( in_place_error ) & fk; |
484 | BOOST_TEST( r2.has_error() ); |
485 | } |
486 | |
487 | { |
488 | result<int, E2> r2 = result<void, E>( in_place_error ) & fk2; |
489 | BOOST_TEST( r2.has_error() ); |
490 | } |
491 | |
492 | { |
493 | result<void, E2> r2 = result<void, E>( in_place_error ) & fk3; |
494 | BOOST_TEST( r2.has_error() ); |
495 | } |
496 | |
497 | { |
498 | result<void, E2> r2 = result<void, E>( in_place_error ) & fk4; |
499 | BOOST_TEST( r2.has_error() ); |
500 | } |
501 | |
502 | return boost::report_errors(); |
503 | } |
504 | |