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
7#include <derive-c/core.h>
8#include <derive-c/panic.h>
9#include <derive-c/self.h>
10
11#ifndef T
12#ifndef __clang_analyzer__
13#error "The contained type must be defined"
14#endif
15typedef struct {
16 int x;
17} derive_c_parameter_t;
18#define T derive_c_parameter_t
19static void derive_c_parameter_t_delete(derive_c_parameter_t* UNUSED(self)) {}
20#define T_DELETE derive_c_parameter_t_delete
21#endif
22
23#ifndef T_DELETE
24#define T_DELETE(value)
25#endif
26
27typedef struct {
28 union {
30 };
31 bool present;
33} SELF;
34
35static SELF NAME(SELF, from)(T value) { return (SELF){.value = value, .present = true}; }
36
37static SELF NAME(SELF, empty)() { return (SELF){.present = false}; }
38
39static T* NAME(SELF, get)(SELF* self) {
40 DEBUG_ASSERT(self);
41 if (self->present) {
42 return &self->value;
43 }
44 return NULL;
45}
46
47static T const* NAME(SELF, get_const)(SELF const* self) {
48 DEBUG_ASSERT(self);
49 if (self->present) {
50 return &self->value;
51 }
52 return NULL;
53}
54
55static bool NAME(SELF, is_present)(SELF const* self) {
56 DEBUG_ASSERT(self);
57 return self->present;
58}
59
60static void NAME(SELF, delete)(SELF* self) {
61 DEBUG_ASSERT(self);
62 if (self->present) {
63 T_DELETE(&self->value);
64 }
65}
66
67static bool NAME(SELF, replace)(SELF* self, T value) {
68 DEBUG_ASSERT(self);
69 bool was_present;
70 if (self->present) {
71 T_DELETE(&self->value);
72 was_present = true;
73 } else {
74 was_present = false;
75 }
76 self->value = value;
77 self->present = true;
78 return was_present;
79}
80
81#undef SELF
82#undef T
83#undef T_DELETE
#define T
Definition template.h:68
#define SELF
Definition template.h:70
#define UNUSED(ident)
Definition core.h:13
#define NAME(pre, post)
Definition core.h:5
static nullalloc get()
Definition null.h:20
#define DEBUG_ASSERT(expr)
Definition panic.h:23
bool present
Definition template.h:31
T value
Definition template.h:29
gdb_marker derive_c_option
Definition template.h:32
static bool empty(ITER const *iter)
Definition template.h:281
static bool replace(SELF *self, T value)
Definition template.h:67
#define T_DELETE
Definition template.h:20
static bool is_present(SELF const *self)
Definition template.h:55
static T const * get_const(SELF const *self)
Definition template.h:47
static SELF from(T value)
Definition template.h:35
#define T
Definition template.h:25