L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
result
1// vi:set ft=cpp: -*- Mode: C++ -*-
2
3#pragma once
4
5#include <assert.h>
6#include <stdlib.h>
7
8#include "type_traits"
9#include "utils"
10
11namespace cxx {
12
19class Error
20{
21 int _err;
22
23public:
24 constexpr explicit Error(int err) noexcept : _err(err) {}
25 constexpr Error(Error const &) noexcept = default;
26 constexpr Error(Error &&) noexcept = default;
27
28 constexpr int error() const noexcept
29 { return _err; }
30};
31
38template <typename T>
39class Result
40{
41 union
42 {
43 T _res;
44 int _err;
45 };
46 bool _has_result;
47
48public:
55 Result() = delete;
56
57 Result(Error err) noexcept
58 : _err(err.error()), _has_result(false)
59 {}
60
61 template<typename... Args>
62 explicit Result(in_place_t, Args&&... args)
63 noexcept(noexcept(T(cxx::forward<Args>(args)...)))
64 : _res(cxx::forward<Args>(args)...), _has_result(true)
65 {}
66
67 Result(T &&val)
68 noexcept(noexcept(T(cxx::move(val))))
69 : _res(cxx::move(val)), _has_result(true)
70 {}
71
72 Result(Result const &o)
73 noexcept(noexcept(T(o._res)))
74 : _has_result(o._has_result)
75 {
76 if (_has_result)
77 new (&_res) T(o._res);
78 else
79 _err = o._err;
80 }
81
82 Result(Result &&o)
83 noexcept(noexcept(T(cxx::move(o._res))))
84 : _has_result(o._has_result)
85 {
86 if (_has_result)
87 new (&_res) T(cxx::move(o._res));
88 else
89 _err = o._err;
90 }
91
92 ~Result()
93 {
94 if (_has_result)
95 _res.~T();
96 }
97
98 Result &operator=(Result const &o)
99 noexcept(noexcept(T(o._res)))
100 {
101 if (_has_result)
102 _res.~T();
103
104 _has_result = o._has_result;
105 if (_has_result)
106 new (&_res) T(o._res);
107 else
108 _err = o._err;
109
110 return *this;
111 }
112
113 Result &operator=(Result &&o)
114 {
115 if (_has_result)
116 {
117 if (o._has_result)
118 _res = cxx::move(o._res);
119 else
120 {
121 _res.~T();
122 _has_result = false;
123 _err = o._err;
124 }
125 }
126 else
127 {
128 if (o._has_result)
129 {
130 new (&_res) T(cxx::move(o._res));
131 _has_result = true;
132 }
133 else
134 _err = o._err;
135 }
136
137 return *this;
138 }
139
140 Result &operator=(Error err) noexcept
141 {
142 if (_has_result)
143 _res.~T();
144
145 _has_result = false;
146 _err = err.error();
147
148 return *this;
149 }
150
151 Result &operator=(T &&val)
152 {
153 if (_has_result)
154 _res = cxx::move(val);
155 else
156 {
157 new (&_res) T(cxx::move(val));
158 _has_result = true;
159 }
160
161 return *this;
162 }
163
164 explicit operator bool() const noexcept
165 { return _has_result; }
166
167 int error() const noexcept
168 { return _has_result ? 0 : _err; }
169
170 T const &result() const & noexcept
171 {
172 assert(_has_result);
173 if (!_has_result) [[unlikely]]
174 abort();
175
176 return _res;
177 }
178
179 T&& result() && noexcept
180 {
181 assert(_has_result);
182 if (!_has_result) [[unlikely]]
183 abort();
184
185 return cxx::move(_res);
186 }
187};
188
189}
Error value.
Definition result:20
Result()=delete
Prevent default construction.
Our C++ library.
Definition arith:11