1// Copyright 2017, 2021, 2023 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 explicit X( int v ): v_( v ) { ++instances; }
18
19 X( X const& ) = delete;
20 X& operator=( X const& ) = delete;
21
22 ~X() { --instances; }
23};
24
25int X::instances = 0;
26
27int main()
28{
29 {
30 int x = 0;
31 result<int const&> r( x );
32
33 BOOST_TEST( r.has_value() );
34 BOOST_TEST( !r.has_error() );
35
36 BOOST_TEST_EQ( r.value(), 0 );
37 }
38
39 {
40 int const x = 0;
41 result<int const&> r( x );
42
43 BOOST_TEST( r.has_value() );
44 BOOST_TEST( !r.has_error() );
45
46 BOOST_TEST_EQ( r.value(), 0 );
47 }
48
49 {
50 int x = 0;
51 result<int const&> r = x;
52
53 BOOST_TEST( r.has_value() );
54 BOOST_TEST( !r.has_error() );
55
56 BOOST_TEST_EQ( r.value(), 0 );
57 }
58
59 {
60 int const x = 0;
61 result<int const&> r = x;
62
63 BOOST_TEST( r.has_value() );
64 BOOST_TEST( !r.has_error() );
65
66 BOOST_TEST_EQ( r.value(), 0 );
67 }
68
69 {
70 int x = 1;
71 result<int const&, int> r( in_place_value, x );
72
73 BOOST_TEST( r.has_value() );
74 BOOST_TEST( !r.has_error() );
75
76 BOOST_TEST_EQ( *r, 1 );
77 }
78
79 {
80 int const x = 1;
81 result<int const&, int> r( in_place_value, x );
82
83 BOOST_TEST( r.has_value() );
84 BOOST_TEST( !r.has_error() );
85
86 BOOST_TEST_EQ( *r, 1 );
87 }
88
89 BOOST_TEST_EQ( X::instances, 0 );
90
91 {
92 X x( 1 );
93 result<X const&> r( x );
94
95 BOOST_TEST( r.has_value() );
96 BOOST_TEST( !r.has_error() );
97
98 BOOST_TEST_EQ( r.value().v_, 1 );
99
100 BOOST_TEST_EQ( X::instances, 1 );
101 }
102
103 BOOST_TEST_EQ( X::instances, 0 );
104
105 {
106 X const x( 1 );
107 result<X const&> r( x );
108
109 BOOST_TEST( r.has_value() );
110 BOOST_TEST( !r.has_error() );
111
112 BOOST_TEST_EQ( r.value().v_, 1 );
113
114 BOOST_TEST_EQ( X::instances, 1 );
115 }
116
117 BOOST_TEST_EQ( X::instances, 0 );
118
119 {
120 X x( 1 );
121 result<X const&> r = x;
122
123 BOOST_TEST( r.has_value() );
124 BOOST_TEST( !r.has_error() );
125
126 BOOST_TEST_EQ( r.value().v_, 1 );
127
128 BOOST_TEST_EQ( X::instances, 1 );
129 }
130
131 BOOST_TEST_EQ( X::instances, 0 );
132
133 {
134 X const x( 1 );
135 result<X const&> r = x;
136
137 BOOST_TEST( r.has_value() );
138 BOOST_TEST( !r.has_error() );
139
140 BOOST_TEST_EQ( r.value().v_, 1 );
141
142 BOOST_TEST_EQ( X::instances, 1 );
143 }
144
145 BOOST_TEST_EQ( X::instances, 0 );
146
147 {
148 X x( 1 );
149 result<X const&, X> r( in_place_value, x );
150
151 BOOST_TEST( r.has_value() );
152 BOOST_TEST( !r.has_error() );
153
154 BOOST_TEST_EQ( r->v_, 1 );
155
156 BOOST_TEST_EQ( X::instances, 1 );
157 }
158
159 BOOST_TEST_EQ( X::instances, 0 );
160
161 {
162 X const x( 1 );
163 result<X const&, X> r( in_place_value, x );
164
165 BOOST_TEST( r.has_value() );
166 BOOST_TEST( !r.has_error() );
167
168 BOOST_TEST_EQ( r->v_, 1 );
169
170 BOOST_TEST_EQ( X::instances, 1 );
171 }
172
173 BOOST_TEST_EQ( X::instances, 0 );
174
175 {
176 BOOST_TEST_TRAIT_TRUE((std::is_constructible<result<int const&>, int&>));
177 BOOST_TEST_TRAIT_TRUE((std::is_convertible<int&, result<int const&>>));
178
179 BOOST_TEST_TRAIT_TRUE((std::is_constructible<result<int const&>, int const&>));
180 BOOST_TEST_TRAIT_TRUE((std::is_convertible<int const&, result<int const&>>));
181
182 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&>, int>));
183 BOOST_TEST_TRAIT_FALSE((std::is_convertible<int, result<int const&>>));
184
185 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<double const&>, int&>));
186 BOOST_TEST_TRAIT_FALSE((std::is_convertible<int&, result<double const&>>));
187
188 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<double const&>, int const&>));
189 BOOST_TEST_TRAIT_FALSE((std::is_convertible<int const&, result<double const&>>));
190
191 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<double const&>, int>));
192 BOOST_TEST_TRAIT_FALSE((std::is_convertible<int, result<double const&>>));
193
194 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&, int>, int&>));
195 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&, float>, int&>));
196
197 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&, int>, int const&>));
198 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&, float>, int const&>));
199
200 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&, int>, int>));
201 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&, float>, int>));
202
203 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<X const&>, int>));
204 BOOST_TEST_TRAIT_FALSE((std::is_convertible<int, result<X const&>>));
205
206 BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<X const&>, X const>));
207 BOOST_TEST_TRAIT_FALSE((std::is_convertible<X const, result<X const&>>));
208 }
209
210 return boost::report_errors();
211}
212

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