diff options
author | Thomas Lively <tlively@google.com> | 2023-08-14 15:50:34 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-14 15:50:34 -0700 |
commit | c37bda1d06a4c81c443f89572bdc6d2b443ed40c (patch) | |
tree | 12938bb4326afbddf210bcced87363d78048f229 /src/wat-parser.h | |
parent | 616c08bc1ec604a822d354cbb0353b7994cec72d (diff) | |
download | binaryen-c37bda1d06a4c81c443f89572bdc6d2b443ed40c.tar.gz binaryen-c37bda1d06a4c81c443f89572bdc6d2b443ed40c.tar.bz2 binaryen-c37bda1d06a4c81c443f89572bdc6d2b443ed40c.zip |
[NFC] Factor `Result` and `MaybeResult` into a utility header (#5878)
Allow them to be used for more than just the new text parser.
Diffstat (limited to 'src/wat-parser.h')
-rw-r--r-- | src/wat-parser.h | 50 |
1 files changed, 1 insertions, 49 deletions
diff --git a/src/wat-parser.h b/src/wat-parser.h index ebeb566c4..bb31ed0b1 100644 --- a/src/wat-parser.h +++ b/src/wat-parser.h @@ -19,59 +19,11 @@ #include <string_view> +#include "support/result.h" #include "wasm.h" namespace wasm::WATParser { -struct Ok {}; - -struct None {}; - -struct Err { - std::string msg; -}; - -template<typename T = Ok> struct Result { - std::variant<T, Err> val; - - Result(Result<T>& other) = default; - Result(Result<T>&& other) = default; - Result(const Err& e) : val(std::in_place_type<Err>, e) {} - Result(Err&& e) : val(std::in_place_type<Err>, std::move(e)) {} - template<typename U = T> - Result(U&& u) : val(std::in_place_type<T>, std::forward<U>(u)) {} - - Err* getErr() { return std::get_if<Err>(&val); } - T& operator*() { return *std::get_if<T>(&val); } - T* operator->() { return std::get_if<T>(&val); } -}; - -template<typename T = Ok> struct MaybeResult { - std::variant<T, None, Err> val; - - MaybeResult() : val(None{}) {} - MaybeResult(MaybeResult<T>& other) = default; - MaybeResult(MaybeResult<T>&& other) = default; - MaybeResult(const Err& e) : val(std::in_place_type<Err>, e) {} - MaybeResult(Err&& e) : val(std::in_place_type<Err>, std::move(e)) {} - template<typename U = T> - MaybeResult(U&& u) : val(std::in_place_type<T>, std::forward<U>(u)) {} - template<typename U = T> - MaybeResult(Result<U>&& u) - : val(u.getErr() ? std::variant<T, None, Err>{*u.getErr()} - : std::variant<T, None, Err>{*u}) {} - - // Whether we have an error or a value. Useful for assignment in loops and if - // conditions where errors should not get lost. - operator bool() const { return !std::holds_alternative<None>(val); } - - Err* getErr() { return std::get_if<Err>(&val); } - T& operator*() { return *std::get_if<T>(&val); } - T* operator->() { return std::get_if<T>(&val); } - - T* getPtr() { return std::get_if<T>(&val); } -}; - // Parse a single WAT module. Result<> parseModule(Module& wasm, std::string_view in); |