#pragma once #include #include "error.hpp" template 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())