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#error "The contained type must be defined"
13typedef struct {
14 int x;
15} derive_c_parameter_t;
16#define T derive_c_parameter_t
17static void derive_c_parameter_t_delete(derive_c_parameter_t*) {}
18#define T_DELETE derive_c_parameter_t_delete
19#endif
20
21#ifndef T_DELETE
22#define T_DELETE(value)
23#endif
24
25typedef struct {
26 union {
28 };
29 bool present;
31} SELF;
32
33static SELF NAME(SELF, from)(T value) { return (SELF){.value = value, .present = true}; }
34
35static SELF NAME(SELF, empty)() { return (SELF){.present = false}; }
36
37static T* NAME(SELF, get)(SELF* self) {
38 DEBUG_ASSERT(self);
39 if (self->present) {
40 return &self->value;
41 } else {
42 return NULL;
43 }
44}
45
46static T const* NAME(SELF, get_const)(SELF const* self) {
47 DEBUG_ASSERT(self);
48 if (self->present) {
49 return &self->value;
50 } else {
51 return NULL;
52 }
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
static bool empty(ITER const *iter)
Definition template.h:273
#define NAME(pre, post)
Definition core.h:5
#define T
Definition template.h:16
static bool replace(SELF *self, T value)
Definition template.h:67
static T * get(SELF *self)
Definition template.h:37
#define T_DELETE
Definition template.h:18
static bool is_present(SELF const *self)
Definition template.h:55
static T const * get_const(SELF const *self)
Definition template.h:46
static SELF from(T value)
Definition template.h:33
#define DEBUG_ASSERT(expr)
Definition panic.h:24
#define SELF
Definition self.h:4
bool present
Definition template.h:29
T value
Definition template.h:27
gdb_marker derive_c_option
Definition template.h:30
#define T
Definition template.h:18