aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--optional.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/optional.h b/optional.h
new file mode 100644
index 0000000..ca1f732
--- /dev/null
+++ b/optional.h
@@ -0,0 +1,29 @@
+/**
+ * optional.h - some macros for optional types
+ *
+ * 2023 Yaroslav de la Peña Smirnov
+ *
+ */
+#ifndef OPTIONAL_H
+#define OPTIONAL_H
+
+#include <stdbool.h>
+
+#define OPTIONAL(T, name) struct { bool has; T data; } name
+
+#define OPTNONE { .has = false }
+#define OPTSOME(d) { .has = true, .data = d }
+
+#define optional_set_none(opt) opt.has = false
+
+#define optional_set_some(opt, d) \
+ (opt.has = true, opt.data = d)
+
+#define optional_has(opt) (opt.has)
+
+#define optional_hasnt(opt) (!opt.has)
+
+#define optional_unwrap(src, dst) \
+ (optional_has(src) ? (dst = src.data, true) : (false))
+
+#endif