]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/leaf/test/handle_basic_test.cpp
1 // Copyright (c) 2018-2020 Emil Dotchevski and Reverge Studios, Inc.
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #include <boost/leaf/detail/config.hpp>
7 #include <boost/leaf/handle_errors.hpp>
8 #include <boost/leaf/pred.hpp>
9 #include <boost/leaf/result.hpp>
10 #include "lightweight_test.hpp"
12 namespace leaf
= boost::leaf
;
14 template <int Tag
> struct info
{ int value
;};
23 struct error1_tag
{ };
24 struct error2_tag
{ };
25 struct error3_tag
{ };
27 leaf::result
<int> compute_answer( int what_to_do
) noexcept
34 return leaf::new_error(error_code::error1
);
36 return leaf::new_error(error_code::error2
);
38 return leaf::new_error(error_code::error3
);
40 return leaf::new_error(error1_tag
{}, error_code::error1
);
42 return leaf::new_error(error2_tag
{}, error_code::error2
);
44 BOOST_LEAF_ASSERT(what_to_do
==6);
45 return leaf::new_error(error3_tag
{}, error_code::error3
);
49 leaf::result
<int> handle_some_errors( int what_to_do
)
51 return leaf::try_handle_some(
54 return compute_answer(what_to_do
);
56 []( error1_tag
, leaf::match
<error_code
, error_code::error1
> )
60 []( leaf::match
<error_code
, error_code::error1
> )
66 leaf::result
<float> handle_some_errors_float( int what_to_do
)
68 return leaf::try_handle_some(
69 [=]() -> leaf::result
<float>
71 return compute_answer(what_to_do
);
73 []( error2_tag
, leaf::match
<error_code
, error_code::error2
> )
77 []( leaf::match
<error_code
, error_code::error2
> )
83 leaf::result
<void> handle_some_errors_void( int what_to_do
)
85 return leaf::try_handle_some(
86 [=]() -> leaf::result
<void>
88 BOOST_LEAF_AUTO(answer
, compute_answer(what_to_do
));
92 []( leaf::match
<error_code
, error_code::error3
> )
100 int r
= leaf::try_handle_all(
101 []() -> leaf::result
<int>
103 return leaf::try_handle_some(
104 []() -> leaf::result
<int>
106 return leaf::try_handle_some(
107 []() -> leaf::result
<int>
109 return leaf::new_error(40);
111 []( leaf::error_info
const & ei
, int & v
)
117 []( leaf::error_info
const & ei
, int & v
)
125 BOOST_TEST_EQ(v
, 42);
135 int r
= leaf::try_handle_all(
136 []() -> leaf::result
<int>
138 return leaf::try_handle_some(
139 []() -> leaf::result
<int>
141 return leaf::try_handle_some(
142 []() -> leaf::result
<int>
144 return leaf::new_error(40);
146 []( leaf::error_info
const & ei
, int * v
)
152 []( leaf::error_info
const & ei
, int * v
)
160 BOOST_TEST_EQ(v
, 42);
170 ///////////////////////////
172 BOOST_TEST_EQ(handle_some_errors(0).value(), 42);
173 BOOST_TEST_EQ(handle_some_errors(1).value(), -2);
174 BOOST_TEST_EQ(handle_some_errors(4).value(), -1);
176 int r
= leaf::try_handle_all(
177 []() -> leaf::result
<int>
179 BOOST_LEAF_AUTO(answer
, handle_some_errors(3));
183 []( leaf::match
<error_code
, error_code::error3
> )
194 ///////////////////////////
196 BOOST_TEST_EQ(handle_some_errors_float(0).value(), 42.0f
);
197 BOOST_TEST_EQ(handle_some_errors_float(2).value(), -2.0f
);
198 BOOST_TEST_EQ(handle_some_errors_float(5).value(), -1.0f
);
200 int r
= leaf::try_handle_all(
201 []() -> leaf::result
<int>
203 BOOST_LEAF_AUTO(answer
, handle_some_errors_float(1));
207 []( leaf::match
<error_code
, error_code::error1
> )
218 ///////////////////////////
220 BOOST_TEST(handle_some_errors_void(0));
221 BOOST_TEST(handle_some_errors_void(3));
223 int r
= leaf::try_handle_all(
224 []() -> leaf::result
<int>
226 BOOST_LEAF_CHECK(handle_some_errors_void(2));
229 []( leaf::match
<error_code
, error_code::error2
> )
240 ///////////////////////////
242 #ifndef BOOST_LEAF_NO_EXCEPTIONS
244 int r
= leaf::try_handle_all(
245 []() -> leaf::result
<int>
247 BOOST_LEAF_CHECK(handle_some_errors_void(2));
250 []( std::exception
const & )
262 ///////////////////////////
265 int r
= leaf::try_handle_all(
266 []() -> leaf::result
<int>
268 return leaf::new_error( info
<1>{42} );
270 []( info
<1> const & i1
)
272 BOOST_TEST_EQ(i1
.value
, 42);
273 int r
= leaf::try_handle_all(
274 []() -> leaf::result
<int>
276 return leaf::new_error( info
<1>{43} );
282 BOOST_TEST_EQ(r
, -1);
283 BOOST_TEST_EQ(i1
.value
, 42);
293 ///////////////////////////
296 int r
= leaf::try_handle_all(
297 []() -> leaf::result
<int>
299 return leaf::new_error( info
<1>{42} );
301 []( info
<1> const & i1
)
303 BOOST_TEST_EQ(i1
.value
, 42);
304 int r
= leaf::try_handle_all(
305 []() -> leaf::result
<int>
307 return leaf::new_error( info
<1>{43} );
309 []( info
<1> const & i1
)
311 BOOST_TEST_EQ(i1
.value
, 43);
318 BOOST_TEST_EQ(r
, -1);
319 BOOST_TEST_EQ(i1
.value
, 42);
329 ///////////////////////////
332 int r
= leaf::try_handle_all(
333 []() -> leaf::result
<int>
335 return leaf::try_handle_some(
336 []() -> leaf::result
<int>
338 return leaf::new_error( info
<1>{1} );
340 []( leaf::error_info
const & err
, info
<1> const & i1
, info
<2> const * i2
)
342 //We have space for info<2> in the context but i2 is null.
343 BOOST_TEST_EQ(i1
.value
, 1);
345 return err
.error().load(info
<2>{2});
348 []( info
<1> const & i1
, info
<2> const & i2
)
350 BOOST_TEST_EQ(i1
.value
, 1);
351 BOOST_TEST_EQ(i2
.value
, 2);
361 ///////////////////////////
364 int r
= leaf::try_handle_all(
365 []() -> leaf::result
<int>
367 return leaf::try_handle_some(
368 []() -> leaf::result
<int>
370 return leaf::new_error( info
<1>{1}, info
<2>{-2} );
372 []( leaf::error_info
const & err
, info
<1> const & i1
, info
<2> const & i2
)
374 BOOST_TEST_EQ(i1
.value
, 1);
375 BOOST_TEST_EQ(i2
.value
, -2);
376 return err
.error().load(info
<2>{2});
379 []( info
<1> const & i1
, info
<2> const & i2
)
381 BOOST_TEST_EQ(i1
.value
, 1);
382 BOOST_TEST_EQ(i2
.value
, 2);
392 ///////////////////////////
394 return boost::report_errors();