X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fresult.hpp;h=e14f92b253b726b6a14fa3727de4855aaeff9a6b;hb=refs%2Ftags%2F5.0.0;hp=fe9956bfd29dd39a84c3f5ea6009501f0f1a9ddf;hpb=54c34361d08386c751897ee215554c9ea1efd108;p=staging%2Fwindowmanager.git diff --git a/src/result.hpp b/src/result.hpp index fe9956b..e14f92b 100644 --- a/src/result.hpp +++ b/src/result.hpp @@ -1,38 +1,77 @@ -// -// Created by mfritzsc on 7/12/17. -// +/* + * Copyright (C) 2017 Mentor Graphics Development (Deutschland) GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #ifndef TMCAGLWM_RESULT_HPP #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 const &ok() const { return this->t; } + optional err() const { + return this->e ? optional(this->e) : nullopt; + } -} // 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