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
8using namespace boost::system;
9
10struct X
11{
12 int v_;
13};
14
15struct 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
33struct E
34{
35};
36
37struct E2
38{
39 E2() {}
40 E2( E ) {}
41};
42
43result<int, E2> fi( int x )
44{
45 return 2 * x + 1;
46}
47
48result<int, E2> fi2( int )
49{
50 return E2();
51}
52
53result<void, E2> fi3( int )
54{
55 return {};
56}
57
58result<X, E2> fy( Y y )
59{
60 return X{ .v_: 2 * y.v_ + 1 };
61}
62
63result<X, E2> fy2( Y )
64{
65 return E2();
66}
67
68result<void, E2> fy3( Y )
69{
70 return {};
71}
72
73result<int, E2> fri( int& x )
74{
75 return x * 2 + 1;
76}
77
78result<int&, E2> fri2( int& )
79{
80 return E2();
81}
82
83result<void, E2> fri3( int& )
84{
85 return {};
86}
87
88result<int, E2> fk()
89{
90 return 7;
91}
92
93result<int, E2> fk2()
94{
95 return E2();
96}
97
98result<void, E2> fk3()
99{
100 return {};
101}
102
103result<void, E2> fk4()
104{
105 return E2();
106}
107
108int 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

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