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 main() |
47 | { |
48 | { |
49 | result<int> r( 1 ); |
50 | |
51 | r |= 2; |
52 | |
53 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 1 ); |
54 | } |
55 | |
56 | { |
57 | result<int, E> r( in_place_error ); |
58 | |
59 | r |= 2; |
60 | |
61 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 2 ); |
62 | } |
63 | |
64 | { |
65 | result<Y> r( in_place_value, 1 ); |
66 | |
67 | r |= X{.v_: 2}; |
68 | |
69 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 1 ); |
70 | } |
71 | |
72 | { |
73 | result<Y, E> r( in_place_error ); |
74 | |
75 | r |= X{.v_: 2}; |
76 | |
77 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 2 ); |
78 | } |
79 | |
80 | { |
81 | int x1 = 1; |
82 | int x2 = 2; |
83 | |
84 | result<int&> r( x1 ); |
85 | |
86 | r |= x2; |
87 | |
88 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x1 ); |
89 | } |
90 | |
91 | { |
92 | int x2 = 2; |
93 | |
94 | result<int&, E> r( in_place_error ); |
95 | |
96 | r |= x2; |
97 | |
98 | BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x2 ); |
99 | } |
100 | |
101 | return boost::report_errors(); |
102 | } |
103 | |