47 void *
operator new (size_t,
void *p)
noexcept {
return p; }
48 void operator delete (
void *) {}
50 template<
typename... Args>
51 Holder(Args&&... args)
52 noexcept(
noexcept(T(cxx::forward<Args>(args)...)))
53 : value(cxx::forward<Args>(args)...) {}
73 : _err(err.error()), _has_result(
false)
76 template<
typename... Args>
77 explicit Result(in_place_t, Args&&... args)
78 noexcept(
noexcept(T(cxx::forward<Args>(args)...)))
79 : _res(
cxx::forward<Args>(args)...), _has_result(true)
83 noexcept(
noexcept(T(cxx::move(val))))
84 : _res(
cxx::move(val)), _has_result(true)
88 noexcept(
noexcept(T(o._res.value)))
89 : _has_result(o._has_result)
92 new (&_res) Holder(o._res.value);
98 noexcept(
noexcept(T(cxx::move(o._res.value))))
99 : _has_result(o._has_result)
102 new (&_res) Holder(cxx::move(o._res.value));
114 noexcept(
noexcept(T(o._res.value)))
119 _has_result = o._has_result;
121 new (&_res) Holder(o._res.value);
133 _res.value = cxx::move(o._res.value);
145 new (&_res) Holder(cxx::move(o._res.value));
155 Result &operator=(Error err)
noexcept
166 Result &operator=(T &&val)
169 _res.value = cxx::move(val);
172 new (&_res) Holder(cxx::move(val));
179 explicit operator bool() const noexcept
180 {
return _has_result; }
182 int error() const noexcept
183 {
return _has_result ? 0 : _err; }
185 T
const &result() const & noexcept
188 if (!_has_result) [[unlikely]]
194 T&& result() &&
noexcept
197 if (!_has_result) [[unlikely]]
200 return cxx::move(_res.value);