X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fresult.hpp;h=b740a0cd0c6be5ae5f44ccf0085d4a52c981fdee;hb=626b0fc7a92da537f4914afcd3ff390f855785c4;hp=fe9956bfd29dd39a84c3f5ea6009501f0f1a9ddf;hpb=54c34361d08386c751897ee215554c9ea1efd108;p=staging%2Fwindowmanager.git diff --git a/src/result.hpp b/src/result.hpp index fe9956b..b740a0c 100644 --- a/src/result.hpp +++ b/src/result.hpp @@ -6,33 +6,60 @@ #define TMCAGLWM_RESULT_HPP #include +#include namespace wm { - using std::experimental::optional; - using std::experimental::nullopt; +using std::experimental::optional; +using std::experimental::nullopt; - // We only ever return a string as an error - so just parametrize - // this over result type T - template - struct result { - char const *e; - optional t; +// We only ever return a string as an error - so just parametrize +// this over result type T +template +struct result { + char const *e; + optional t; - bool is_ok() const { return this->t != nullopt; } - bool is_err() const { return this->e != nullptr; } + bool is_ok() const { return this->t != nullopt; } + bool is_err() const { return this->e != nullptr; } - T unwrap() { return this->t.value(); } + T unwrap() { + if (this->e != nullptr) { + throw std::logic_error(this->e); + } + return this->t.value(); + } - char const *unwrap_err() { return this->e; } - }; + operator T() { + return this->unwrap(); + } - template - struct result Err(char const *e) { return result{e, nullopt}; } + char const *unwrap_err() { return this->e; } - template - struct result Ok(T t) { return result{nullptr, t}; } + optional ok() const { return this->t; } + optional err() const { return optional(this->e); } -} // namespace wm + result map_err(std::function f); +}; -#endif //TMCAGLWM_RESULT_HPP +template +struct result Err(char const *e) { + return result{e, nullopt}; +} + +template +struct result Ok(T t) { + return result{nullptr, t}; +} + +template +result result::map_err(std::function f) { + if (this->is_err()) { + return Err(f(this->e)); + } + return *this; +} + +} // namespace wm + +#endif // TMCAGLWM_RESULT_HPP