diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-03-12 16:44:02 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-03-12 16:44:02 +0200 |
commit | b7f5d7565a19efbfebd72f2877444c552e4230c8 (patch) | |
tree | e17ec2edc3be86672442ca1ab854f21cb566b598 /libk/result.h | |
parent | vmm: map multiboot structs (diff) | |
download | kernel.cpp-b7f5d7565a19efbfebd72f2877444c552e4230c8.tar.xz |
libk: add Result<T, E> class
Diffstat (limited to 'libk/result.h')
-rw-r--r-- | libk/result.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libk/result.h b/libk/result.h new file mode 100644 index 0000000..8077baf --- /dev/null +++ b/libk/result.h @@ -0,0 +1,23 @@ +#pragma once +#include <types.h> + +// TODO T&& constructor +// TODO T&& Result::take() with consumed semantics + +template <typename T, error_enum_t E> +class Result { +public: + explicit constexpr Result(T t) : is_ok(true), data{.t = t} {}; + explicit constexpr Result(E e) : is_ok(false), data{.e = e} {}; + + constexpr operator bool() const { return is_ok; } + constexpr E error() const { return is_ok ? E::NoError : data.e; } + constexpr T value() const { return is_ok ? data.t : T{}; } + +private: + const bool is_ok; + union { + T t; + E e; + } data; +}; |