43 lines
1.4 KiB
C++
43 lines
1.4 KiB
C++
|
#pragma once
|
||
|
|
||
|
#include <utility>
|
||
|
|
||
|
#include "error.hpp"
|
||
|
|
||
|
template <class T>
|
||
|
class Result {
|
||
|
public:
|
||
|
Result(const T& res) : _value(res) {}
|
||
|
Result(T&& res) : _value(std::move(res)) {}
|
||
|
Result(ErrorCode err) : _error(err) {}
|
||
|
|
||
|
bool has_error() { return _error != ErrorCode::Success; }
|
||
|
bool has_value() { return !has_error(); }
|
||
|
|
||
|
T& value() { return _value; }
|
||
|
T& operator*() { return _value; }
|
||
|
T release_value() { return std::move(_value); }
|
||
|
ErrorCode error() { return _error; }
|
||
|
|
||
|
private:
|
||
|
T _value;
|
||
|
ErrorCode _error;
|
||
|
};
|
||
|
|
||
|
#define TRY(m) \
|
||
|
(({ \
|
||
|
auto ___res = (m); \
|
||
|
if (!___res.has_value()) return ___res.error(); \
|
||
|
std::move(___res); \
|
||
|
}).release_value())
|
||
|
|
||
|
#define DIEIF(m) \
|
||
|
(({ \
|
||
|
auto ___res = (m); \
|
||
|
if (!___res.has_value()) { \
|
||
|
fprintf(stderr, "%s:%d assertion failed\n", __FILE__, __LINE__); \
|
||
|
exit(EXIT_FAILURE); \
|
||
|
} \
|
||
|
std::move(___res); \
|
||
|
}).release_value())
|