summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AK/Error.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/AK/Error.h b/AK/Error.h
new file mode 100644
index 0000000000..b91721920d
--- /dev/null
+++ b/AK/Error.h
@@ -0,0 +1,53 @@
+#pragma once
+
+#include <AK/Platform.h>
+
+namespace AK {
+
+template <typename T, auto NoErrorValue>
+class CONSUMABLE(unknown) Error {
+public:
+ RETURN_TYPESTATE(unknown)
+ Error()
+ : t(NoErrorValue)
+ {}
+
+ RETURN_TYPESTATE(unknown)
+ Error(T t)
+ : t(t)
+ {}
+
+ RETURN_TYPESTATE(unknown)
+ Error(Error&& other)
+ : t(move(other.t))
+ {
+ }
+
+ RETURN_TYPESTATE(unknown)
+ Error(const Error& other)
+ : t(other.t)
+ {
+ }
+
+ CALLABLE_WHEN("unknown", "consumed")
+ ~Error() {}
+
+ SET_TYPESTATE(consumed)
+ bool failed() const {
+ return t != NoErrorValue;
+ }
+
+ [[deprecated]]
+ SET_TYPESTATE(consumed)
+ void ignore() {}
+
+ const T& value() const { return t; }
+
+ bool operator==(const Error& o) { return t == o.t; }
+ bool operator!=(const Error& o) { return t != o.t; }
+ T t;
+};
+
+}
+
+using AK::Error;