BAN: Errors are now moved around with TRY()

This commit is contained in:
Bananymous 2023-02-26 02:54:34 +02:00
parent 9439582154
commit dc1a4614fb
1 changed files with 5 additions and 21 deletions

View File

@ -12,7 +12,7 @@
#error "NOT IMPLEMENTED" #error "NOT IMPLEMENTED"
#endif #endif
#define TRY(expr) ({ auto e = expr; if (e.is_error()) return e.error(); e.release_value(); }) #define TRY(expr) ({ auto e = expr; if (e.is_error()) return e.release_error(); e.release_value(); })
namespace BAN namespace BAN
{ {
@ -54,32 +54,14 @@ namespace BAN
ErrorOr(Error&& error) ErrorOr(Error&& error)
: m_data(move(error)) : m_data(move(error))
{} {}
template<typename U>
ErrorOr(const ErrorOr<U>& other)
: m_data(other.m_data)
{}
template<typename U>
ErrorOr(ErrorOr<U>&& other)
: m_data(move(other.m_data))
{}
template<typename U>
ErrorOr<T>& operator=(const ErrorOr<U>& other)
{
m_data = other.m_data;
return *this;
}
template<typename U>
ErrorOr<T>& operator=(ErrorOr<U>&& other)
{
m_data = move(other.m_data);
return *this;
}
bool is_error() const { return m_data.template is<Error>(); } bool is_error() const { return m_data.template is<Error>(); }
const Error& error() const { return m_data.template get<Error>(); } const Error& error() const { return m_data.template get<Error>(); }
Error& error() { return m_data.template get<Error>(); } Error& error() { return m_data.template get<Error>(); }
const T& value() const { return m_data.template get<T>(); } const T& value() const { return m_data.template get<T>(); }
T& value() { return m_data.template get<T>(); } T& value() { return m_data.template get<T>(); }
Error release_error() { return move(error()); m_data.clear(); }
T release_value() { return move(value()); m_data.clear(); } T release_value() { return move(value()); m_data.clear(); }
private: private:
@ -98,6 +80,8 @@ namespace BAN
Error& error() { return m_data; } Error& error() { return m_data; }
const Error& error() const { return m_data; } const Error& error() const { return m_data; }
void value() { } void value() { }
Error release_error() { return move(m_data); m_data = Error(); }
void release_value() { m_data = Error(); } void release_value() { m_data = Error(); }
private: private: