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&> 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

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