aboutsummaryrefslogtreecommitdiff
path: root/libk/result.h
diff options
context:
space:
mode:
Diffstat (limited to 'libk/result.h')
-rw-r--r--libk/result.h23
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;
+};