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

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