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 | |
9 | using namespace boost::system; |
10 | |
11 | struct 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 | |
25 | int X::instances = 0; |
26 | |
27 | int main() |
28 | { |
29 | { |
30 | int x = 0; |
31 | result<int&> 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 x = 0; |
41 | result<int&> 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 = 1; |
51 | result<int&, int> r( in_place_value, x ); |
52 | |
53 | BOOST_TEST( r.has_value() ); |
54 | BOOST_TEST( !r.has_error() ); |
55 | |
56 | BOOST_TEST_EQ( *r, 1 ); |
57 | } |
58 | |
59 | BOOST_TEST_EQ( X::instances, 0 ); |
60 | |
61 | { |
62 | X x( 1 ); |
63 | result<X&> r( x ); |
64 | |
65 | BOOST_TEST( r.has_value() ); |
66 | BOOST_TEST( !r.has_error() ); |
67 | |
68 | BOOST_TEST_EQ( r.value().v_, 1 ); |
69 | |
70 | BOOST_TEST_EQ( X::instances, 1 ); |
71 | } |
72 | |
73 | BOOST_TEST_EQ( X::instances, 0 ); |
74 | |
75 | { |
76 | X x( 1 ); |
77 | result<X&> r = x; |
78 | |
79 | BOOST_TEST( r.has_value() ); |
80 | BOOST_TEST( !r.has_error() ); |
81 | |
82 | BOOST_TEST_EQ( r.value().v_, 1 ); |
83 | |
84 | BOOST_TEST_EQ( X::instances, 1 ); |
85 | } |
86 | |
87 | BOOST_TEST_EQ( X::instances, 0 ); |
88 | |
89 | { |
90 | X x( 1 ); |
91 | result<X&, X> r( in_place_value, x ); |
92 | |
93 | BOOST_TEST( r.has_value() ); |
94 | BOOST_TEST( !r.has_error() ); |
95 | |
96 | BOOST_TEST_EQ( r->v_, 1 ); |
97 | |
98 | BOOST_TEST_EQ( X::instances, 1 ); |
99 | } |
100 | |
101 | BOOST_TEST_EQ( X::instances, 0 ); |
102 | |
103 | { |
104 | BOOST_TEST_TRAIT_TRUE((std::is_constructible<result<int&>, int&>)); |
105 | BOOST_TEST_TRAIT_TRUE((std::is_convertible<int&, result<int&>>)); |
106 | |
107 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int&>, int const&>)); |
108 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<int const&, result<int&>>)); |
109 | |
110 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int&>, int>)); |
111 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<int, result<int&>>)); |
112 | |
113 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int&, int>, int&>)); |
114 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int&, float>, int&>)); |
115 | |
116 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<X&>, int>)); |
117 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<int, result<X&>>)); |
118 | } |
119 | |
120 | return boost::report_errors(); |
121 | } |
122 | |