acadia/lib/glacier/status/error_or.h

42 lines
823 B
C
Raw Normal View History

2023-06-21 18:28:54 -07:00
#pragma once
#include <glacier/status/error.h>
namespace glcr {
template <typename T>
class ErrorOr {
public:
ErrorOr() = delete;
ErrorOr(const ErrorOr&) = delete;
ErrorOr(ErrorOr&&) = delete;
ErrorOr(ErrorCode code) : error_(code), ok_(false) {}
ErrorOr(T obj) : obj_(obj), ok_(true) {}
ErrorOr(T&& obj) : obj_(obj), ok_(true) {}
bool ok() { return ok_; }
operator bool() { return ok_; }
T& value() { return obj_; }
ErrorCode error() { return error_; }
private:
union {
ErrorCode error_;
T obj_;
};
bool ok_;
};
#define ASSIGN_OR_RETURN(lhs, rhs) \
\
auto e##__LINE__ = rhs; \
if (!e##__LINE__.ok()) { \
return e##__LINE__.error(); \
} \
lhs = rhs.value();
} // namespace glcr