#pragma once #include "log.hpp" #include "error.hpp" #include #include namespace gdpm{ template class result_t { public: result_t() = delete; result_t( std::tuple tuple, std::function ok = []() -> T{}, std::function error = [](){} ): data(tuple), fn_ok(ok), fn_error(error) { } result_t( T target, U error, std::function()> _fn_ok = []() -> std::unique_ptr{ return nullptr; }, std::function _fn_error = [](){} ): data(std::make_tuple(target, error)), fn_ok(_fn_ok), fn_error(_fn_error) {} void define( std::function ok, std::function error ){ fn_ok = ok; fn_error = error; } constexpr U get_error() const{ return std::get(data); } constexpr std::unique_ptr unwrap() const { /* First, check if ok() and error() are defined. */ if(!fn_error || !fn_ok){ log::error(error(ec::NOT_DEFINED)); return nullptr; } /* Then, attempt unwrap the data. */ U err = std::get(data); if (err.has_occurred()) if(fn_error){ fn_error(); return nullptr; } return fn_ok(); } constexpr T unwrap_or(T default_value) const { U err = std::get(data); if(err.has_occurred()) return default_value; return fn_ok(); } constexpr T unwrap_unsafe() const { return std::get(data); } private: std::tuple data; std::function()> fn_ok; std::function fn_error; }; }