1 | // Copyright 2017, 2021-2024 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&& r ) |
31 | { |
32 | if( &r != this ) |
33 | { |
34 | v_ = r.v_; |
35 | r.v_ = 0; |
36 | } |
37 | |
38 | return *this; |
39 | } |
40 | }; |
41 | |
42 | struct E |
43 | { |
44 | }; |
45 | |
46 | int f() |
47 | { |
48 | return 2; |
49 | } |
50 | |
51 | X g() |
52 | { |
53 | return { .v_: 2 }; |
54 | } |
55 | |
56 | int& h() |
57 | { |
58 | static int x = 2; |
59 | return x; |
60 | } |
61 | |
62 | int main() |
63 | { |
64 | { |
65 | result<int> r( 1 ); |
66 | |
67 | r |= f; |
68 | |
69 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 1 ); |
70 | } |
71 | |
72 | { |
73 | result<int, E> r( in_place_error ); |
74 | |
75 | r |= f; |
76 | |
77 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 2 ); |
78 | } |
79 | |
80 | { |
81 | result<Y> r( in_place_value, 1 ); |
82 | |
83 | r |= g; |
84 | |
85 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 1 ); |
86 | } |
87 | |
88 | { |
89 | result<Y, E> r( in_place_error ); |
90 | |
91 | r |= g; |
92 | |
93 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 2 ); |
94 | } |
95 | |
96 | { |
97 | int x1 = 1; |
98 | |
99 | result<int&> r( x1 ); |
100 | |
101 | r |= h; |
102 | |
103 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x1 ); |
104 | } |
105 | |
106 | { |
107 | result<int&, E> r( in_place_error ); |
108 | |
109 | r |= h; |
110 | |
111 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &h() ); |
112 | } |
113 | |
114 | return boost::report_errors(); |
115 | } |
116 | |