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 | int f( int x ) |
38 | { |
39 | return x * 2 + 1; |
40 | } |
41 | |
42 | X g( Y y ) |
43 | { |
44 | return X{ .v_: y.v_ * 2 + 1 }; |
45 | } |
46 | |
47 | int& h( int& ) |
48 | { |
49 | static int x = 2; |
50 | return x; |
51 | } |
52 | |
53 | int k() |
54 | { |
55 | return 7; |
56 | } |
57 | |
58 | int main() |
59 | { |
60 | { |
61 | result<int> r( 1 ); |
62 | result<int> r2 = r & f; |
63 | |
64 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
65 | } |
66 | |
67 | { |
68 | result<int> const r( 1 ); |
69 | result<int> r2 = r & f; |
70 | |
71 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
72 | } |
73 | |
74 | { |
75 | result<int> r2 = result<int>( 1 ) & f; |
76 | |
77 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); |
78 | } |
79 | |
80 | { |
81 | result<int, E> r( in_place_error ); |
82 | result<int, E> r2 = r & f; |
83 | |
84 | BOOST_TEST( r2.has_error() ); |
85 | } |
86 | |
87 | { |
88 | result<int, E> const r( in_place_error ); |
89 | result<int, E> r2 = r & f; |
90 | |
91 | BOOST_TEST( r2.has_error() ); |
92 | } |
93 | |
94 | { |
95 | result<int, E> r2 = result<int, E>( in_place_error ) & f; |
96 | |
97 | BOOST_TEST( r2.has_error() ); |
98 | } |
99 | |
100 | { |
101 | result<X> r2 = result<Y>( in_place_value, 1 ) & g; |
102 | |
103 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2->v_, 3 ); |
104 | } |
105 | |
106 | { |
107 | result<X, E> r2 = result<Y, E>( in_place_error ) & g; |
108 | |
109 | BOOST_TEST( r2.has_error() ); |
110 | } |
111 | |
112 | { |
113 | int x1 = 1; |
114 | |
115 | result<int&> r( x1 ); |
116 | |
117 | result<int&> r2 = r & h; |
118 | |
119 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &h( x1 ) ); |
120 | } |
121 | |
122 | { |
123 | int x1 = 1; |
124 | |
125 | result<int&> const r( x1 ); |
126 | |
127 | result<int&> r2 = r & h; |
128 | |
129 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &h( x1 ) ); |
130 | } |
131 | |
132 | { |
133 | int x1 = 1; |
134 | |
135 | result<int&> r2 = result<int&>( x1 ) & h; |
136 | |
137 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &h( x1 ) ); |
138 | } |
139 | |
140 | { |
141 | result<int&, E> r( in_place_error ); |
142 | |
143 | result<int&, E> r2 = r & h; |
144 | |
145 | BOOST_TEST( r2.has_error() ); |
146 | } |
147 | |
148 | { |
149 | result<int&, E> const r( in_place_error ); |
150 | |
151 | result<int&, E> r2 = r & h; |
152 | |
153 | BOOST_TEST( r2.has_error() ); |
154 | } |
155 | |
156 | { |
157 | result<int&, E> r2 = result<int&, E>( in_place_error ) & h; |
158 | |
159 | BOOST_TEST( r2.has_error() ); |
160 | } |
161 | |
162 | { |
163 | result<void> r; |
164 | result<int> r2 = r & k; |
165 | |
166 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); |
167 | } |
168 | |
169 | { |
170 | result<void> const r; |
171 | result<int> r2 = r & k; |
172 | |
173 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); |
174 | } |
175 | |
176 | { |
177 | result<int> r2 = result<void>() & k; |
178 | |
179 | BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); |
180 | } |
181 | |
182 | { |
183 | result<void, E> r( in_place_error ); |
184 | result<int, E> r2 = r & k; |
185 | |
186 | BOOST_TEST( r2.has_error() ); |
187 | } |
188 | |
189 | { |
190 | result<void, E> const r( in_place_error ); |
191 | result<int, E> r2 = r & k; |
192 | |
193 | BOOST_TEST( r2.has_error() ); |
194 | } |
195 | |
196 | { |
197 | result<int, E> r2 = result<void, E>( in_place_error ) & k; |
198 | |
199 | BOOST_TEST( r2.has_error() ); |
200 | } |
201 | |
202 | return boost::report_errors(); |
203 | } |
204 | |