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
8using namespace boost::system;
9
10struct X
11{
12 int v_;
13};
14
15struct 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
42struct E
43{
44};
45
46struct E2
47{
48 E2() {}
49 E2( E ) {}
50};
51
52result<int, E> fi( int x )
53{
54 return 2 * x + 1;
55}
56
57result<int, E2> fi2( int )
58{
59 return E2();
60}
61
62result<X, E> fy( Y y )
63{
64 return X{ .v_: 2 * y.v_ + 1 };
65}
66
67result<Y, E2> fy2( Y )
68{
69 return E2();
70}
71
72result<int&, E> fri( int& )
73{
74 static int x = 2;
75 return x;
76}
77
78result<int&, E2> fri2( int& )
79{
80 return E2();
81}
82
83result<void, E2> fv()
84{
85 return {};
86}
87
88result<void, E2> fv2()
89{
90 return E2();
91}
92
93int main()
94{
95 {
96 result<int, E2> r( 1 );
97
98 r &= fi;
99 BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 3 );
100
101 r &= fi2;
102 BOOST_TEST( r.has_error() );
103
104 r &= fi;
105 BOOST_TEST( r.has_error() );
106 }
107
108 {
109 result<Y, E2> r( in_place_value, 1 );
110
111 r &= fy;
112 BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 3 );
113
114 r &= fy2;
115 BOOST_TEST( r.has_error() );
116
117 r &= fy;
118 BOOST_TEST( r.has_error() );
119 }
120
121 {
122 int x1 = 1;
123 result<int&, E2> r( x1 );
124
125 r &= fri;
126 BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &*fri( x1 ) );
127
128 r &= fri2;
129 BOOST_TEST( r.has_error() );
130
131 r &= fri;
132 BOOST_TEST( r.has_error() );
133 }
134
135 {
136 result<void, E2> r;
137
138 r &= fv;
139 BOOST_TEST( r.has_value() );
140
141 r &= fv2;
142 BOOST_TEST( r.has_error() );
143
144 r &= fv;
145 BOOST_TEST( r.has_error() );
146 }
147
148 return boost::report_errors();
149}
150

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