libcute
0.1
Loading...
Searching...
No Matches
include
object
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
64
CU_OPTIONAL_DECL
(Ptr,
void
*)
65
CU_OPTIONAL_DECL
(Int,
int
)
66
CU_OPTIONAL_DECL
(Float,
float
)
67
CU_OPTIONAL_DECL
(Double,
double
)
68
CU_OPTIONAL_DECL
(Char,
char
)
69
CU_OPTIONAL_DECL
(Bool,
bool
)
70
71
CU_OPTIONAL_DECL
(U8, uint8_t)
72
CU_OPTIONAL_DECL
(U16, uint16_t)
73
CU_OPTIONAL_DECL
(U32, uint32_t)
74
CU_OPTIONAL_DECL
(U64, uint64_t)
75
CU_OPTIONAL_DECL
(I8, int8_t)
76
CU_OPTIONAL_DECL
(I16, int16_t)
77
CU_OPTIONAL_DECL
(I32, int32_t)
78
CU_OPTIONAL_DECL
(I64, int64_t)
79
CU_OPTIONAL_DECL
(Size,
size_t
)
80
CU_OPTIONAL_DECL
(
cu_Slice
,
cu_Slice
)
macro.h
CU_OPTIONAL_DECL
#define CU_OPTIONAL_DECL(NAME, T)
Definition
optional.h:25
cu_Slice
Definition
nostd.h:27
Generated by
1.9.8