@@ -23,48 +23,72 @@ namespace lambda_runtime {
23
23
template <typename TResult, typename TFailure>
24
24
class outcome {
25
25
public:
26
- outcome (TResult const & s) : s(s), m_success(true ) {}
26
+ outcome (TResult const & s) : m_s(s), m_success(true ) {}
27
+ outcome (TResult&& s) : m_s(std::move(s)), m_success(true ) {}
27
28
28
- outcome (TFailure const & f) : f(f), m_success(false ) {}
29
+ outcome (TFailure const & f) : m_f(f), m_success(false ) {}
30
+ outcome (TFailure&& f) : m_f(std::move(f)), m_success(false ) {}
31
+
32
+ outcome (outcome const & other) : m_success(other.m_success)
33
+ {
34
+ if (m_success) {
35
+ new (&m_s) TResult (other.m_s );
36
+ }
37
+ else {
38
+ new (&m_f) TFailure (other.m_f );
39
+ }
40
+ }
29
41
30
42
outcome (outcome&& other) noexcept : m_success(other.m_success)
31
43
{
32
44
if (m_success) {
33
- s = std::move (other.s );
45
+ new (&m_s) TResult ( std::move (other.m_s ) );
34
46
}
35
47
else {
36
- f = std::move (other.f );
48
+ new (&m_f) TFailure ( std::move (other.m_f ) );
37
49
}
38
50
}
39
51
40
52
~outcome ()
41
53
{
42
54
if (m_success) {
43
- s .~TResult ();
55
+ m_s .~TResult ();
44
56
}
45
57
else {
46
- f .~TFailure ();
58
+ m_f .~TFailure ();
47
59
}
48
60
}
49
61
50
- TResult const & get_result () const
62
+ TResult const & get_result () const &
51
63
{
52
64
assert (m_success);
53
- return s;
65
+ return m_s;
66
+ }
67
+
68
+ TResult&& get_result() &&
69
+ {
70
+ assert (m_success);
71
+ return std::move (m_s);
72
+ }
73
+
74
+ TFailure const & get_failure () const &
75
+ {
76
+ assert (!m_success);
77
+ return m_f;
54
78
}
55
79
56
- TFailure const & get_failure () const
80
+ TFailure&& get_failure() &&
57
81
{
58
82
assert (!m_success);
59
- return f ;
83
+ return std::move (m_f) ;
60
84
}
61
85
62
86
bool is_success () const { return m_success; }
63
87
64
88
private:
65
89
union {
66
- TResult s ;
67
- TFailure f ;
90
+ TResult m_s ;
91
+ TFailure m_f ;
68
92
};
69
93
bool m_success;
70
94
};
0 commit comments