libcute 0.1
Loading...
Searching...
No Matches
optional.h
Go to the documentation of this file.
1#pragma once
2
5#include <stdbool.h>
6#include <stdint.h>
7
8#include "macro.h"
9#include <nostd.h>
10
12#define CU_OPTIONAL_NAME(NAME) NAME##_Optional
14#define CU_OPTIONAL_FN(NAME, SUFFIX) CU_CONCAT(CU_OPTIONAL_NAME(NAME), SUFFIX)
15
17#define CU_OPTIONAL_HEADER(NAME, T) \
18 CU_OPTIONAL_NAME(NAME) CU_OPTIONAL_FN(NAME, _some)(T value); \
19 CU_OPTIONAL_NAME(NAME) CU_OPTIONAL_FN(NAME, _none)(void); \
20 bool CU_OPTIONAL_FN(NAME, _is_some)(const CU_OPTIONAL_NAME(NAME) * opt); \
21 bool CU_OPTIONAL_FN(NAME, _is_none)(const CU_OPTIONAL_NAME(NAME) * opt); \
22 T CU_OPTIONAL_FN(NAME, _unwrap)(CU_OPTIONAL_NAME(NAME) * opt);
23
25#define CU_OPTIONAL_DECL(NAME, T) \
26 typedef struct { \
27 T value; \
28 bool isSome; \
29 } CU_OPTIONAL_NAME(NAME); \
30 CU_OPTIONAL_HEADER(NAME, T)
31
33#define CU_OPTIONAL_IMPL(NAME, T) \
34 CU_OPTIONAL_NAME(NAME) CU_OPTIONAL_FN(NAME, _some)(T value) { \
35 CU_OPTIONAL_NAME(NAME) opt; \
36 cu_Memory_memset(&opt, 0, sizeof(opt)); \
37 opt.value = value; \
38 opt.isSome = true; \
39 return opt; \
40 } \
41 \
42 CU_OPTIONAL_NAME(NAME) CU_OPTIONAL_FN(NAME, _none)(void) { \
43 CU_OPTIONAL_NAME(NAME) opt; \
44 cu_Memory_memset(&opt, 0, sizeof(opt)); \
45 opt.isSome = false; \
46 return opt; \
47 } \
48 \
49 bool CU_OPTIONAL_FN(NAME, _is_some)(const CU_OPTIONAL_NAME(NAME) * opt) { \
50 return opt->isSome; \
51 } \
52 \
53 bool CU_OPTIONAL_FN(NAME, _is_none)(const CU_OPTIONAL_NAME(NAME) * opt) { \
54 return !opt->isSome; \
55 } \
56 \
57 T CU_OPTIONAL_FN(NAME, _unwrap)(CU_OPTIONAL_NAME(NAME) * opt) { \
58 if (!opt->isSome) { \
59 CU_DIE("Attempted to unwrap a None optional"); \
60 } \
61 return opt->value; \
62 }
63
64CU_OPTIONAL_DECL(Ptr, void *)
65CU_OPTIONAL_DECL(Int, int)
66CU_OPTIONAL_DECL(Float, float)
67CU_OPTIONAL_DECL(Double, double)
68CU_OPTIONAL_DECL(Char, char)
69CU_OPTIONAL_DECL(Bool, bool)
70
71CU_OPTIONAL_DECL(U8, uint8_t)
72CU_OPTIONAL_DECL(U16, uint16_t)
73CU_OPTIONAL_DECL(U32, uint32_t)
74CU_OPTIONAL_DECL(U64, uint64_t)
75CU_OPTIONAL_DECL(I8, int8_t)
76CU_OPTIONAL_DECL(I16, int16_t)
77CU_OPTIONAL_DECL(I32, int32_t)
78CU_OPTIONAL_DECL(I64, int64_t)
79CU_OPTIONAL_DECL(Size, size_t)
#define CU_OPTIONAL_DECL(NAME, T)
Definition optional.h:25
Definition nostd.h:27