Derive-C
Loading...
Searching...
No Matches
template.h
Go to the documentation of this file.
1
2// for access
3
4#include <stdbool.h>
5#include <stddef.h>
6
9
11
12#if !defined ITEM
13 #if !defined __clang_analyzer__
14 #error "The contained type must be defined"
15 #endif
16typedef struct {
17 int x;
18} item_t;
19 #define ITEM item_t
20static void item_delete(item_t* UNUSED(self)) {}
21 #define ITEM_DELETE item_delete
22static item_t item_clone(item_t const* self) { return *self; }
23 #define ITEM_CLONE item_clone
24static bool item_eq(item_t const* a, item_t const* b) { return a->x == b->x; }
25 #define ITEM_EQ item_eq
26#endif
27
28#if !defined ITEM_DELETE
29 #define ITEM_DELETE(value)
30#endif
31
32#if !defined ITEM_CLONE
33 #define ITEM_CLONE(value) (*(value))
34#endif
35
36typedef struct {
37 union {
39 };
40 bool present;
42} SELF;
43
44static SELF NS(SELF, from)(ITEM value) { return (SELF){.item = value, .present = true}; }
45
46static SELF NS(SELF, empty)() { return (SELF){.present = false}; }
47
48static SELF NS(SELF, clone)(SELF const* self) {
49 DEBUG_ASSERT(self);
50 if (self->present) {
51 return NS(SELF, from)(ITEM_CLONE(&self->item));
52 }
53 return NS(SELF, empty)();
54}
55
56static ITEM* NS(SELF, get)(SELF* self) {
57 DEBUG_ASSERT(self);
58 if (self->present) {
59 return &self->item;
60 }
61 return NULL;
62}
63
64static ITEM const* NS(SELF, get_const)(SELF const* self) {
65 DEBUG_ASSERT(self);
66 if (self->present) {
67 return &self->item;
68 }
69 return NULL;
70}
71
72static ITEM const* NS(SELF, get_const_or)(SELF const* self, ITEM const* default_value) {
73 DEBUG_ASSERT(self);
74 if (self->present) {
75 return &self->item;
76 }
77 return default_value;
78}
79
80static bool NS(SELF, is_present)(SELF const* self) {
81 DEBUG_ASSERT(self);
82 return self->present;
83}
84
85static void NS(SELF, delete)(SELF* self) {
86 DEBUG_ASSERT(self);
87 if (self->present) {
88 ITEM_DELETE(&self->item);
89 }
90}
91
92static bool NS(SELF, replace)(SELF* self, ITEM value) {
93 DEBUG_ASSERT(self);
94 bool was_present;
95 if (self->present) {
96 ITEM_DELETE(&self->item);
97 was_present = true;
98 } else {
99 was_present = false;
100 }
101 self->item = value;
102 self->present = true;
103 return was_present;
104}
105
106#undef ITEM
107#undef ITEM_DELETE
108#undef ITEM_CLONE
109
#define ITEM
Definition template.h:55
#define UNUSED(ident)
Definition helpers.h:16
#define NS(pre, post)
Definition helpers.h:6
static nullalloc get()
Definition null.h:19
#define DEBUG_ASSERT(expr)
Definition panic.h:34
#define SELF
Definition def.h:51
bool present
Definition template.h:40
ITEM item
Definition template.h:38
gdb_marker derive_c_option
Definition template.h:41
A queue comprised of an extendable circular buffer.
Definition template.h:19
int x
Definition template.h:20
static bool empty(ITER const *iter)
Definition template.h:293
static SELF clone(SELF const *self)
Definition template.h:195
#define ITEM_DELETE
Definition template.h:24
static void item_delete(item_t *UNUSED(self))
Definition template.h:23
#define ITEM_CLONE
Definition template.h:26
static item_t item_clone(item_t const *self)
Definition template.h:25
static bool item_eq(item_t const *a, item_t const *b)
Definition template.h:24
static bool is_present(SELF const *self)
Definition template.h:80
static bool replace(SELF *self, ITEM value)
Definition template.h:92
static ITEM const * get_const_or(SELF const *self, ITEM const *default_value)
Definition template.h:72
static SELF from(ITEM value)
Definition template.h:44
static ITEM const * get_const(SELF const *self)
Definition template.h:64
#define ITEM
Definition template.h:22