Derive-C
Loading...
Searching...
No Matches
template.h File Reference

Go to the source code of this file.

Data Structures

struct  value_t
struct  SELF
 An allocator that prints to stdout when it allocates or frees memory. More...
struct  ITER_CONST
struct  KV_PAIR_CONST
struct  ITER
struct  KV_PAIR

Macros

#define CAPACITY   32
 A statically allocated hashmap that linearly looks up keys.
#define KEY   map_key_t
#define KEY_EQ   DC_MEM_EQ
#define KEY_DELETE   DC_NO_DELETE
#define KEY_CLONE   DC_COPY_CLONE
#define KEY_DEBUG   DC_DEFAULT_DEBUG
#define VALUE   value_t
#define VALUE_DELETE   DC_NO_DELETE
#define VALUE_CLONE   DC_COPY_CLONE
#define VALUE_DEBUG   DC_DEFAULT_DEBUG
#define BITSET   NS(NAME, bitset)
#define EXCLUSIVE_END_INDEX   CAPACITY
#define INTERNAL_NAME   BITSET
#define INDEX_TYPE   NS(BITSET, index_t)
#define INVARIANT_CHECK(self)
#define ITER_CONST   NS(SELF, iter_const)
#define KV_PAIR_CONST   NS(ITER_CONST, item)
#define ITER   NS(SELF, iter)
#define KV_PAIR   NS(ITER, item)

Functions

static size_t capacity ()
static SELF new ()
static VALUE const * try_read (SELF const *self, KEY key)
static VALUE const * read (SELF const *self, KEY key)
static VALUEtry_write (SELF *self, KEY key)
static VALUEwrite (SELF *self, KEY key)
static VALUEtry_insert (SELF *self, KEY key, VALUE value)
static VALUEinsert (SELF *self, KEY key, VALUE value)
static bool try_remove (SELF *self, KEY key, VALUE *dest)
static VALUE remove (SELF *self, KEY key)
static void delete_entry (SELF *self, KEY key)
static size_t size (SELF const *self)
static SELF clone (SELF const *self)
static void delete (SELF *self)
static void debug (SELF const *self, dc_debug_fmt fmt, FILE *stream)
static bool empty_item (KV_PAIR_CONST const *item)
static KV_PAIR_CONST next (ITER_CONST *iter)
static ITER_CONST get_iter_const (SELF const *self)
static bool empty_item (KV_PAIR const *item)
static KV_PAIR next (ITER *iter)
static ITER get_iter (SELF *self)
 DC_TRAIT_MAP (SELF)

Macro Definition Documentation

◆ BITSET

#define BITSET   NS(NAME, bitset)

Definition at line 68 of file template.h.

◆ CAPACITY

#define CAPACITY   32

A statically allocated hashmap that linearly looks up keys.

Definition at line 14 of file template.h.

◆ EXCLUSIVE_END_INDEX

#define EXCLUSIVE_END_INDEX   CAPACITY

Definition at line 70 of file template.h.

◆ INDEX_TYPE

#define INDEX_TYPE   NS(BITSET, index_t)

Definition at line 74 of file template.h.

◆ INTERNAL_NAME

#define INTERNAL_NAME   BITSET

Definition at line 71 of file template.h.

◆ INVARIANT_CHECK

#define INVARIANT_CHECK ( self)
Value:
DC_ASSUME(self);
#define DC_ASSUME(expr,...)
Definition panic.h:56

Definition at line 85 of file template.h.

◆ ITER

#define ITER   NS(SELF, iter)

Definition at line 292 of file template.h.

◆ ITER_CONST

#define ITER_CONST   NS(SELF, iter_const)

Definition at line 233 of file template.h.

◆ KEY

#define KEY   map_key_t

Definition at line 21 of file template.h.

◆ KEY_CLONE

#define KEY_CLONE   DC_COPY_CLONE

Definition at line 34 of file template.h.

◆ KEY_DEBUG

#define KEY_DEBUG   DC_DEFAULT_DEBUG

Definition at line 38 of file template.h.

◆ KEY_DELETE

#define KEY_DELETE   DC_NO_DELETE

Definition at line 30 of file template.h.

◆ KEY_EQ

#define KEY_EQ   DC_MEM_EQ

Definition at line 26 of file template.h.

◆ KV_PAIR

#define KV_PAIR   NS(ITER, item)

Definition at line 293 of file template.h.

◆ KV_PAIR_CONST

#define KV_PAIR_CONST   NS(ITER_CONST, item)

Definition at line 234 of file template.h.

◆ VALUE

#define VALUE   value_t

Definition at line 48 of file template.h.

◆ VALUE_CLONE

#define VALUE_CLONE   DC_COPY_CLONE

Definition at line 56 of file template.h.

◆ VALUE_DEBUG

#define VALUE_DEBUG   DC_DEFAULT_DEBUG

Definition at line 60 of file template.h.

◆ VALUE_DELETE

#define VALUE_DELETE   DC_NO_DELETE

Definition at line 52 of file template.h.

Function Documentation

◆ capacity()

size_t capacity ( )
static

Definition at line 66 of file template.h.

66{ return CAPACITY; };
#define CAPACITY
A very simple bump allocator making use of a provided fixed size buffer (e.g. statically allocated).
Definition template.h:17

◆ clone()

SELF clone ( SELF const * self)
static

Definition at line 182 of file template.h.

182 {
183 INVARIANT_CHECK(self);
184
185 SELF new_self = (SELF){
186 .presence = NS(BITSET, clone)(&self->presence),
187 .derive_c_map_staticlinear = dc_gdb_marker_new(),
188 .iterator_invalidation_tracker = mutation_tracker_new(),
189 };
190 for (INDEX_TYPE index = 0; index < CAPACITY; index++) {
191 if (NS(BITSET, get)(&self->presence, index)) {
192 new_self.keys[index] = KEY_CLONE(&self->keys[index]);
193 new_self.values[index] = VALUE_CLONE(&self->values[index]);
194 }
195 }
196 return new_self;
197}
#define INVARIANT_CHECK(self)
Definition template.h:88
#define VALUE_CLONE
Definition template.h:37
static SELF clone(SELF const *self)
Definition template.h:215
#define KEY_CLONE
Definition template.h:39
#define INDEX_TYPE
Definition template.h:74
#define BITSET
Definition template.h:68
static dc_gdb_marker dc_gdb_marker_new()
Definition gdb_marker.h:7
static mutation_tracker mutation_tracker_new()
#define NS(pre, post)
Definition namespace.h:4
static nullalloc get()
Definition null.h:14
#define SELF
Definition def.h:52
VALUE * values
Definition template.h:81
KEY_ENTRY * keys
Definition template.h:80

◆ DC_TRAIT_MAP()

DC_TRAIT_MAP ( SELF )

◆ debug()

void debug ( SELF const * self,
dc_debug_fmt fmt,
FILE * stream )
static

Definition at line 211 of file template.h.

211 {
212 fprintf(stream, EXPAND_STRING(SELF) "@%p {\n", self);
213 fmt = dc_debug_fmt_scope_begin(fmt);
214
215 dc_debug_fmt_print(fmt, stream, "entries: [");
216 fmt = dc_debug_fmt_scope_begin(fmt);
217 for (INDEX_TYPE index = 0; index < CAPACITY; index++) {
218 if (NS(BITSET, get)(&self->presence, index)) {
219 dc_debug_fmt_print(fmt, stream, "(index: %lu, key: ", (size_t)index);
220 KEY_DEBUG(&self->keys[index], fmt, stream);
221 dc_debug_fmt_print(fmt, stream, ", value: ");
222 VALUE_DEBUG(&self->values[index], fmt, stream);
223 dc_debug_fmt_print(fmt, stream, "), ");
224 }
225 }
226 fmt = dc_debug_fmt_scope_end(fmt);
227 dc_debug_fmt_print(fmt, stream, "],\n");
228
229 fmt = dc_debug_fmt_scope_end(fmt);
230 dc_debug_fmt_print(fmt, stream, "}");
231}
#define VALUE_DEBUG
Definition template.h:39
#define KEY_DEBUG
Definition template.h:43
dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
Definition fmt.h:39
dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
Definition fmt.h:33
static void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
Definition fmt.h:22
#define EXPAND_STRING(NAME)
Definition namespace.h:8
static FILE * stream(SELF *self)
Opens a file for.
Definition template.h:107

◆ delete()

void delete ( SELF * self)
static

Definition at line 199 of file template.h.

199 {
200 INVARIANT_CHECK(self);
201
202 for (INDEX_TYPE index = 0; index < CAPACITY; index++) {
203 if (NS(BITSET, get)(&self->presence, index)) {
204 KEY_DELETE(&self->keys[index]);
205 VALUE_DELETE(&self->values[index]);
206 }
207 }
208 NS(BITSET, delete)(&self->presence);
209}
#define VALUE_DELETE
Definition template.h:35
#define KEY_DELETE
Definition template.h:35
BITSET presence
Definition template.h:77

◆ delete_entry()

void delete_entry ( SELF * self,
KEY key )
static

Definition at line 175 of file template.h.

175 {
176 VALUE val = NS(SELF, remove)(self, key);
177 VALUE_DELETE(&val);
178}
static VALUE remove(SELF *self, INDEX index)
Definition template.h:292
#define VALUE
Definition template.h:31

◆ empty_item() [1/2]

bool empty_item ( KV_PAIR const * item)
static

Definition at line 306 of file template.h.

306 {
307 return item->key == NULL && item->value == NULL;
308}
IV_PAIR item
Definition template.h:283

◆ empty_item() [2/2]

bool empty_item ( KV_PAIR_CONST const * item)
static

Definition at line 247 of file template.h.

247 {
248 return item->key == NULL && item->value == NULL;
249}

◆ get_iter()

ITER get_iter ( SELF * self)
static

Definition at line 333 of file template.h.

333 {
334 INVARIANT_CHECK(self);
335
336 INDEX_TYPE next_index = 0;
337 while (next_index < CAPACITY && !NS(BITSET, get)(&self->presence, next_index)) {
338 next_index++;
339 }
340
341 return (ITER){
342 .map = self,
343 .next_index = next_index,
345 };
346}
#define ITER
Definition template.h:320
static mutation_version mutation_tracker_get(mutation_tracker const *self)
mutation_tracker iterator_invalidation_tracker
Definition template.h:85

◆ get_iter_const()

ITER_CONST get_iter_const ( SELF const * self)
static

Definition at line 274 of file template.h.

274 {
275 INVARIANT_CHECK(self);
276
277 INDEX_TYPE next_index = 0;
278 while (next_index < CAPACITY && !NS(BITSET, get)(&self->presence, next_index)) {
279 next_index++;
280 }
281
282 return (ITER_CONST){
283 .map = self,
284 .next_index = next_index,
285 .version = mutation_tracker_get(&self->iterator_invalidation_tracker),
286 };
287}
#define ITER_CONST
Definition template.h:398

◆ insert()

VALUE * insert ( SELF * self,
KEY key,
VALUE value )
static

Definition at line 148 of file template.h.

148 {
149 VALUE* placed = NS(SELF, try_insert)(self, key, value);
150 DC_ASSERT(placed);
151 return placed;
152}
static VALUE * try_insert(SELF *self, KEY key, VALUE value)
Definition template.h:328
#define DC_ASSERT(expr,...)
Definition panic.h:36

◆ new()

SELF new ( )
static

Definition at line 87 of file template.h.

87 {
88 return (SELF){
89 .presence = NS(BITSET, new)(),
90 .keys = {},
91 .values = {},
92 .derive_c_map_staticlinear = dc_gdb_marker_new(),
93 .iterator_invalidation_tracker = mutation_tracker_new(),
94 };
95}

◆ next() [1/2]

KV_PAIR next ( ITER * iter)
static

Definition at line 310 of file template.h.

310 {
312 INDEX_TYPE const next_index = iter->next_index;
313
314 if (next_index == CAPACITY) {
315 return (KV_PAIR){.key = NULL, .value = NULL};
316 }
317
318 iter->next_index++;
319 while (iter->next_index < CAPACITY &&
320 !NS(BITSET, get)(&iter->map->presence, iter->next_index)) {
321 iter->next_index++;
322 }
323
324 if (next_index == CAPACITY) {
325 return (KV_PAIR){.key = NULL, .value = NULL};
326 }
327 return (KV_PAIR){
328 .key = &iter->map->keys[next_index],
329 .value = &iter->map->values[next_index],
330 };
331}
#define KV_PAIR
Definition template.h:584
static void mutation_version_check(mutation_version const *self)
INDEX_TYPE next_index
Definition template.h:325
mutation_version version
Definition template.h:326
SELF * map
Definition template.h:400

◆ next() [2/2]

KV_PAIR_CONST next ( ITER_CONST * iter)
static

Definition at line 251 of file template.h.

251 {
253 INDEX_TYPE const next_index = iter->next_index;
254
255 if (next_index == CAPACITY) {
256 return (KV_PAIR_CONST){.key = NULL, .value = NULL};
257 }
258
259 iter->next_index++;
260 while (iter->next_index < CAPACITY &&
261 !NS(BITSET, get)(&iter->map->presence, iter->next_index)) {
262 iter->next_index++;
263 }
264
265 if (next_index == CAPACITY) {
266 return (KV_PAIR_CONST){.key = NULL, .value = NULL};
267 }
268 return (KV_PAIR_CONST){
269 .key = &iter->map->keys[next_index],
270 .value = &iter->map->values[next_index],
271 };
272}
#define KV_PAIR_CONST
Definition template.h:526
INDEX_TYPE next_index
Definition template.h:403
SELF const * map
Definition template.h:473
mutation_version version
Definition template.h:404

◆ read()

VALUE const * read ( SELF const * self,
KEY key )
static

Definition at line 107 of file template.h.

107 {
108 VALUE const* value = NS(SELF, try_read)(self, key);
109 DC_ASSERT(value);
110 return value;
111}
static VALUE const * try_read(SELF const *self, INDEX index)
Definition template.h:180

◆ remove()

VALUE remove ( SELF * self,
KEY key )
static

Definition at line 169 of file template.h.

169 {
170 VALUE dest;
171 DC_ASSERT(NS(SELF, try_remove)(self, key, &dest));
172 return dest;
173}
static bool try_remove(SELF *self, INDEX index, VALUE *destination)
Definition template.h:264

◆ size()

size_t size ( SELF const * self)
static

Definition at line 180 of file template.h.

180{ return (size_t)NS(BITSET, size)(&self->presence); }
static INDEX_TYPE size(SELF const *self)
Definition template.h:252

◆ try_insert()

VALUE * try_insert ( SELF * self,
KEY key,
VALUE value )
static

Definition at line 123 of file template.h.

123 {
124 INVARIANT_CHECK(self);
126
127 if (NS(BITSET, size)(&self->presence) + 1 > CAPACITY) {
128 return NULL;
129 }
130
131 VALUE const* existing_value = NS(SELF, try_read)(self, key);
132 if (existing_value) {
133 return NULL;
134 }
135
136 for (INDEX_TYPE index = 0; index < CAPACITY; index++) {
137 if (!NS(BITSET, get)(&self->presence, index)) {
138 NS(BITSET, set)(&self->presence, index, true);
139 self->keys[index] = key;
140 self->values[index] = value;
141 return &self->values[index];
142 }
143 }
144
145 DC_UNREACHABLE("A space must exist for insert");
146}
static void set(SELF *self, INDEX_TYPE index, bool value)
Definition template.h:74
static void mutation_tracker_mutate(mutation_tracker *self)
#define DC_UNREACHABLE(...)
Definition panic.h:43

◆ try_read()

VALUE const * try_read ( SELF const * self,
KEY key )
static

Definition at line 97 of file template.h.

97 {
98 INVARIANT_CHECK(self);
99 for (INDEX_TYPE index = 0; index < CAPACITY; index++) {
100 if (NS(BITSET, get)(&self->presence, index) && KEY_EQ(&self->keys[index], &key)) {
101 return &self->values[index];
102 }
103 }
104 return NULL;
105}
#define KEY_EQ
Definition template.h:31

◆ try_remove()

bool try_remove ( SELF * self,
KEY key,
VALUE * dest )
static

Definition at line 154 of file template.h.

154 {
155 INVARIANT_CHECK(self);
157
158 for (INDEX_TYPE index = 0; index < CAPACITY; index++) {
159 if (NS(BITSET, get)(&self->presence, index) && KEY_EQ(&self->keys[index], &key)) {
160 NS(BITSET, set)(&self->presence, index, false);
161 KEY_DELETE(&self->keys[index]);
162 *dest = self->values[index];
163 return true;
164 }
165 }
166 return false;
167}

◆ try_write()

VALUE * try_write ( SELF * self,
KEY key )
static

Definition at line 113 of file template.h.

113 {
114 return (VALUE*)(NS(SELF, try_read)(self, key));
115}

◆ write()

VALUE * write ( SELF * self,
KEY key )
static

Definition at line 117 of file template.h.

117 {
118 VALUE* value = NS(SELF, try_write)(self, key);
119 DC_ASSERT(value);
120 return value;
121}
static VALUE * try_write(SELF *self, INDEX index)
Definition template.h:205