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 | |
8 | using namespace boost::system; |
9 | |
10 | struct X |
11 | { |
12 | static int instances; |
13 | |
14 | int v_; |
15 | |
16 | explicit X( int v ): v_( v ) { ++instances; } |
17 | |
18 | X( int v1, int v2 ): v_( v1+v2 ) { ++instances; } |
19 | X( int v1, int v2, int v3 ): v_( v1+v2+v3 ) { ++instances; } |
20 | |
21 | X( X const& ) = delete; |
22 | X& operator=( X const& ) = delete; |
23 | |
24 | ~X() { --instances; } |
25 | }; |
26 | |
27 | int X::instances = 0; |
28 | |
29 | int main() |
30 | { |
31 | { |
32 | using R = result<int>; |
33 | R r( R::in_place_value, 0 ); |
34 | |
35 | BOOST_TEST( r.has_value() ); |
36 | BOOST_TEST( !r.has_error() ); |
37 | |
38 | BOOST_TEST_EQ( r.value(), 0 ); |
39 | } |
40 | |
41 | { |
42 | using R = result<int, int>; |
43 | R r( R::in_place_value, 1 ); |
44 | |
45 | BOOST_TEST( r.has_value() ); |
46 | BOOST_TEST( !r.has_error() ); |
47 | |
48 | BOOST_TEST_EQ( *r, 1 ); |
49 | } |
50 | |
51 | BOOST_TEST_EQ( X::instances, 0 ); |
52 | |
53 | { |
54 | using R = result<X>; |
55 | R r( R::in_place_value, 1 ); |
56 | |
57 | BOOST_TEST( r.has_value() ); |
58 | BOOST_TEST( !r.has_error() ); |
59 | |
60 | BOOST_TEST_EQ( r.value().v_, 1 ); |
61 | |
62 | BOOST_TEST_EQ( X::instances, 1 ); |
63 | } |
64 | |
65 | BOOST_TEST_EQ( X::instances, 0 ); |
66 | |
67 | { |
68 | using R = result<X>; |
69 | R r( R::in_place_value, 1, 2 ); |
70 | |
71 | BOOST_TEST( r.has_value() ); |
72 | BOOST_TEST( !r.has_error() ); |
73 | |
74 | BOOST_TEST_EQ( r.value().v_, 1+2 ); |
75 | |
76 | BOOST_TEST_EQ( X::instances, 1 ); |
77 | } |
78 | |
79 | BOOST_TEST_EQ( X::instances, 0 ); |
80 | |
81 | { |
82 | using R = result<X>; |
83 | R r( R::in_place_value, 1, 2, 3 ); |
84 | |
85 | BOOST_TEST( r.has_value() ); |
86 | BOOST_TEST( !r.has_error() ); |
87 | |
88 | BOOST_TEST_EQ( r.value().v_, 1+2+3 ); |
89 | |
90 | BOOST_TEST_EQ( X::instances, 1 ); |
91 | } |
92 | |
93 | BOOST_TEST_EQ( X::instances, 0 ); |
94 | |
95 | { |
96 | using R = result<X, X>; |
97 | R r( R::in_place_value, 1 ); |
98 | |
99 | BOOST_TEST( r.has_value() ); |
100 | BOOST_TEST( !r.has_error() ); |
101 | |
102 | BOOST_TEST_EQ( r->v_, 1 ); |
103 | |
104 | BOOST_TEST_EQ( X::instances, 1 ); |
105 | } |
106 | |
107 | BOOST_TEST_EQ( X::instances, 0 ); |
108 | |
109 | { |
110 | using R = result<void>; |
111 | R r( R::in_place_value ); |
112 | |
113 | BOOST_TEST( r.has_value() ); |
114 | BOOST_TEST( !r.has_error() ); |
115 | } |
116 | |
117 | { |
118 | int x1 = 1; |
119 | |
120 | using R = result<int&>; |
121 | R r( R::in_place_value, x1 ); |
122 | |
123 | BOOST_TEST( r.has_value() ); |
124 | BOOST_TEST( !r.has_error() ); |
125 | |
126 | BOOST_TEST_EQ( r.value(), 1 ); |
127 | } |
128 | |
129 | { |
130 | int x1 = 1; |
131 | |
132 | using R = result<int&, int>; |
133 | R r( R::in_place_value, x1 ); |
134 | |
135 | BOOST_TEST( r.has_value() ); |
136 | BOOST_TEST( !r.has_error() ); |
137 | |
138 | BOOST_TEST_EQ( *r, 1 ); |
139 | } |
140 | |
141 | return boost::report_errors(); |
142 | } |
143 | |