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

Go to the source code of this file.

Data Structures

struct  item_t
 A queue comprised of an extendable circular buffer. More...
struct  SELF
 An allocator that prints to stdout when it allocates or frees memory. More...
struct  ITER
struct  ITER_CONST

Macros

#define ITEM   item_t
#define ITEM_DELETE   item_delete
#define ITEM_CLONE   item_clone
#define ITEM_DEBUG   item_debug
#define CAPACITY   8
#define INVARIANT_CHECK(self)
#define ITER   NS(SELF, iter)
#define ITER_CONST   NS(SELF, iter_const)

Typedefs

typedef ITEMitem

Functions

static void ITEM_DELETE (item_t *)
static item_t ITEM_CLONE (item_t const *self)
static void ITEM_DEBUG (ITEM const *, dc_debug_fmt, FILE *)
static SELF new ()
static DC_PUBLIC SELF clone (SELF const *self)
static DC_PUBLIC ITEM const * try_read (SELF const *self, INDEX_TYPE index)
static DC_PUBLIC ITEM const * read (SELF const *self, INDEX_TYPE index)
static DC_PUBLIC ITEMtry_write (SELF *self, INDEX_TYPE index)
static DC_PUBLIC ITEMwrite (SELF *self, INDEX_TYPE index)
static DC_PUBLIC ITEMtry_push (SELF *self, ITEM item)
static DC_PUBLIC ITEMtry_insert_at (SELF *self, INDEX_TYPE at, ITEM const *items, INDEX_TYPE count)
static DC_PUBLIC void remove_at (SELF *self, INDEX_TYPE at, INDEX_TYPE count)
static DC_PUBLIC ITEMpush (SELF *self, ITEM item)
static DC_PUBLIC bool try_pop (SELF *self, ITEM *destination)
static DC_PUBLIC ITEM pop (SELF *self)
static DC_PUBLIC INDEX_TYPE size (SELF const *self)
static DC_PUBLIC void delete (SELF *self)
static DC_PUBLIC bool empty_item (ITEM *const *item)
static DC_PUBLIC ITEMnext (ITER *iter)
static DC_PUBLIC INDEX_TYPE position (ITER const *iter)
static DC_PUBLIC bool empty (ITER const *iter)
static DC_PUBLIC ITER get_iter (SELF *self)
static DC_PUBLIC bool empty_item (ITEM const *const *item)
static DC_PUBLIC ITEM const * next (ITER_CONST *iter)
static DC_PUBLIC INDEX_TYPE position (ITER_CONST const *iter)
static DC_PUBLIC bool empty (ITER_CONST const *iter)
static DC_PUBLIC ITER_CONST get_iter_const (SELF const *self)
static DC_PUBLIC void debug (SELF const *self, dc_debug_fmt fmt, FILE *stream)
 DC_TRAIT_VECTOR (SELF)

Variables

DC_STATIC_CONSTANT size_t max_size = CAPACITY

Macro Definition Documentation

◆ CAPACITY

#define CAPACITY   8

Definition at line 50 of file template.h.

◆ INVARIANT_CHECK

#define INVARIANT_CHECK ( self)
Value:
DC_ASSUME(self); \
DC_ASSUME((self->size) <= CAPACITY);
#define CAPACITY
A hybrid of a bump allocator on a statically allocated buffer, and any other allocator.
Definition template.h:18
#define DC_ASSUME(expr,...)
Definition panic.h:57

Definition at line 73 of file template.h.

73#define INVARIANT_CHECK(self) \
74 DC_ASSUME(self); \
75 DC_ASSUME((self->size) <= CAPACITY);

◆ ITEM

#define ITEM   item_t

Definition at line 25 of file template.h.

◆ ITEM_CLONE

#define ITEM_CLONE   item_clone

Definition at line 28 of file template.h.

◆ ITEM_DEBUG

#define ITEM_DEBUG   item_debug

Definition at line 30 of file template.h.

◆ ITEM_DELETE

#define ITEM_DELETE   item_delete

Definition at line 26 of file template.h.

◆ ITER

#define ITER   NS(SELF, iter)

Definition at line 218 of file template.h.

◆ ITER_CONST

#define ITER_CONST   NS(SELF, iter_const)

Definition at line 261 of file template.h.

Typedef Documentation

◆ item

typedef ITEM const* item

Definition at line 219 of file template.h.

Function Documentation

◆ clone()

DC_PUBLIC SELF clone ( SELF const * self)
static

Definition at line 88 of file template.h.

88 {
89 SELF new_self = NS(SELF, new)();
90 new_self.size = self->size;
91
92 for (INDEX_TYPE i = 0; i < self->size; i++) {
93 new_self.data[i] = ITEM_CLONE(&self->data[i]);
94 }
95
96 return new_self;
97}
#define ITEM_CLONE
Definition template.h:22
#define SELF
Definition def.h:52
#define NS(pre, post)
Definition namespace.h:14
size_t size
Definition template.h:75
ITEM * data
Definition template.h:44

◆ DC_TRAIT_VECTOR()

DC_TRAIT_VECTOR ( SELF )

◆ debug()

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

Definition at line 304 of file template.h.

304 {
305 fprintf(stream, DC_EXPAND_STRING(SELF) "@%p {\n", (void*)self);
306 fmt = dc_debug_fmt_scope_begin(fmt);
307 dc_debug_fmt_print(fmt, stream, "capacity: %lu,\n", (size_t)CAPACITY);
308 dc_debug_fmt_print(fmt, stream, "size: %lu,\n", (size_t)self->size);
309
310 dc_debug_fmt_print(fmt, stream, "items: @%p [\n", (void*)self->data);
311 fmt = dc_debug_fmt_scope_begin(fmt);
312 ITER_CONST iter = NS(SELF, get_iter_const)(self);
313 ITEM const* item;
314 while ((item = NS(ITER_CONST, next)(&iter))) {
316 ITEM_DEBUG(item, fmt, stream);
317 fprintf(stream, ",\n");
318 }
319 fmt = dc_debug_fmt_scope_end(fmt);
320 dc_debug_fmt_print(fmt, stream, "],\n");
321 fmt = dc_debug_fmt_scope_end(fmt);
322 dc_debug_fmt_print(fmt, stream, "}");
323}
#define ITEM
Definition template.h:36
static DC_PUBLIC IV_PAIR next(ITER *iter)
Definition template.h:355
#define ITER_CONST
Definition template.h:411
static DC_PUBLIC ITER_CONST get_iter_const(SELF const *self)
Definition template.h:464
IV_PAIR item
Definition template.h:281
#define ITEM_DEBUG
Definition template.h:24
static DC_PUBLIC void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
Definition fmt.h:32
static DC_PUBLIC void dc_debug_fmt_print_indents(dc_debug_fmt fmt, FILE *stream)
Definition fmt.h:20
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
Definition fmt.h:57
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
Definition fmt.h:50
#define DC_EXPAND_STRING(NAME)
Definition namespace.h:6
static DC_PUBLIC FILE * stream(SELF *self)
Definition template.h:108

◆ delete()

DC_PUBLIC void delete ( SELF * self)
static

Definition at line 211 of file template.h.

211 {
212 INVARIANT_CHECK(self);
213 for (INDEX_TYPE i = 0; i < self->size; i++) {
214 ITEM_DELETE(&self->data[i]);
215 }
216}
#define INVARIANT_CHECK(self)
Definition template.h:90
#define ITEM_DELETE
Definition template.h:20

◆ empty() [1/2]

DC_PUBLIC bool empty ( ITER const * iter)
static

Definition at line 246 of file template.h.

246 {
247 DC_ASSUME(iter);
248 mutation_version_check(&iter->version);
249 return iter->pos >= iter->vec->size;
250}
static DC_PUBLIC void mutation_version_check(mutation_version const *self)

◆ empty() [2/2]

DC_PUBLIC bool empty ( ITER_CONST const * iter)
static

Definition at line 289 of file template.h.

289 {
290 DC_ASSUME(iter);
291 mutation_version_check(&iter->version);
292 return iter->pos >= iter->vec->size;
293}

◆ empty_item() [1/2]

DC_PUBLIC bool empty_item ( ITEM *const * item)
static

Definition at line 221 of file template.h.

221{ return *item == NULL; }

◆ empty_item() [2/2]

DC_PUBLIC bool empty_item ( ITEM const *const * item)
static

Definition at line 264 of file template.h.

264{ return *item == NULL; }

◆ get_iter()

DC_PUBLIC ITER get_iter ( SELF * self)
static

Definition at line 252 of file template.h.

252 {
253 DC_ASSUME(self);
254 return (ITER){.vec = self,
255 .pos = 0,
257}
#define ITER
Definition template.h:322
static DC_PUBLIC mutation_version mutation_tracker_get(mutation_tracker const *self)
mutation_tracker iterator_invalidation_tracker
Definition template.h:87

◆ get_iter_const()

DC_PUBLIC ITER_CONST get_iter_const ( SELF const * self)
static

Definition at line 295 of file template.h.

295 {
296 DC_ASSUME(self);
297 return (ITER_CONST){
298 .vec = self,
299 .pos = 0,
300 .version = mutation_tracker_get(&self->iterator_invalidation_tracker),
301 };
302}

◆ ITEM_CLONE()

item_t ITEM_CLONE ( item_t const * self)
static

Definition at line 29 of file template.h.

29{ return *self; }

◆ ITEM_DEBUG()

void ITEM_DEBUG ( ITEM const * ,
dc_debug_fmt ,
FILE *  )
static

Definition at line 31 of file template.h.

31{}

◆ ITEM_DELETE()

void ITEM_DELETE ( item_t * )
static

Definition at line 27 of file template.h.

27{}

◆ new()

SELF new ( )
static

Definition at line 77 of file template.h.

77 {
78 SELF self = {
79 .size = 0,
80 .derive_c_staticvec = dc_gdb_marker_new(),
81 .iterator_invalidation_tracker = mutation_tracker_new(),
82 };
83 return self;
84}
static DC_PUBLIC dc_gdb_marker dc_gdb_marker_new()
Definition gdb_marker.h:8
static DC_PUBLIC mutation_tracker mutation_tracker_new()

◆ next() [1/2]

DC_PUBLIC ITEM * next ( ITER * iter)
static

Definition at line 229 of file template.h.

229 {
230 DC_ASSUME(iter);
232 if (iter->pos < iter->vec->size) {
233 ITEM* item = &iter->vec->data[iter->pos];
234 iter->pos++;
235 return item;
236 }
237 return NULL;
238}
mutation_version version
Definition template.h:328
SELF * vec
Definition template.h:224
size_t pos
Definition template.h:233

◆ next() [2/2]

DC_PUBLIC ITEM const * next ( ITER_CONST * iter)
static

Definition at line 272 of file template.h.

272 {
273 DC_ASSUME(iter);
275 if (iter->pos < iter->vec->size) {
276 ITEM const* item = &iter->vec->data[iter->pos];
277 iter->pos++;
278 return item;
279 }
280 return NULL;
281}
size_t pos
Definition template.h:280
mutation_version version
Definition template.h:417
SELF const * vec
Definition template.h:267

◆ pop()

DC_PUBLIC ITEM pop ( SELF * self)
static

Definition at line 199 of file template.h.

199 {
200 ITEM entry;
201 DC_ASSERT(NS(SELF, try_pop)(self, &entry), "Cannot pop, already empty {size=%lu}",
202 (size_t)self->size);
203 return entry;
204}
static DC_PUBLIC bool try_pop(SELF *self, ITEM *destination)
Definition template.h:270
#define DC_ASSERT(expr,...)
Definition panic.h:37

◆ position() [1/2]

DC_PUBLIC INDEX_TYPE position ( ITER const * iter)
static

Definition at line 240 of file template.h.

240 {
241 DC_ASSUME(iter);
242 mutation_version_check(&iter->version);
243 return iter->pos;
244}

◆ position() [2/2]

DC_PUBLIC INDEX_TYPE position ( ITER_CONST const * iter)
static

Definition at line 283 of file template.h.

283 {
284 DC_ASSUME(iter);
285 mutation_version_check(&iter->version);
286 return iter->pos;
287}

◆ push()

DC_PUBLIC ITEM * push ( SELF * self,
ITEM item )
static

Definition at line 181 of file template.h.

181 {
182 ITEM* slot = NS(SELF, try_push)(self, item);
183 DC_ASSERT(slot, "Cannot push, already at max capacity {capacity=%d, item=%s}", CAPACITY,
185 return slot;
186}
#define ITEM_DEBUG
Definition template.h:39
static DC_PUBLIC ITEM * try_push(SELF *self, ITEM item)
Definition template.h:232
#define DC_DEBUG(DEBUG_FN, DEBUG_PTR)
Definition dump.h:92

◆ read()

DC_PUBLIC ITEM const * read ( SELF const * self,
INDEX_TYPE index )
static

Definition at line 107 of file template.h.

107 {
108 ITEM const* value = NS(SELF, try_read)(self, index);
109 DC_ASSERT(value, "Cannot read, index out of bounds {index=%lu, size=%lu}", (size_t)index,
110 (size_t)self->size);
111 return value;
112}
static DC_PUBLIC VALUE const * try_read(SELF const *self, INDEX index)
Definition template.h:180

◆ remove_at()

DC_PUBLIC void remove_at ( SELF * self,
INDEX_TYPE at,
INDEX_TYPE count )
static

Definition at line 163 of file template.h.

163 {
164 INVARIANT_CHECK(self);
165 DC_ASSERT(at + count <= self->size,
166 "Cannot remove at, index out of bounds {at=%lu, count=%lu, size=%lu}", (size_t)at,
167 (size_t)count, (size_t)self->size);
168
169 if (count == 0) {
170 return;
171 }
172
173 for (INDEX_TYPE i = at; i < at + count; i++) {
174 ITEM_DELETE(&self->data[i]);
175 }
176
177 memmove(&self->data[at], &self->data[at + count], (self->size - (at + count)) * sizeof(ITEM));
178 self->size -= count;
179}
static DC_PUBLIC size_t size(SELF const *self)
Definition template.h:252

◆ size()

DC_PUBLIC INDEX_TYPE size ( SELF const * self)
static

Definition at line 206 of file template.h.

206 {
207 INVARIANT_CHECK(self);
208 return self->size;
209}

◆ try_insert_at()

DC_PUBLIC ITEM * try_insert_at ( SELF * self,
INDEX_TYPE at,
ITEM const * items,
INDEX_TYPE count )
static

Definition at line 141 of file template.h.

142 {
143 INVARIANT_CHECK(self);
144 DC_ASSUME(items);
145 DC_ASSERT(at <= self->size, "Cannot insert at, index out of bounds {at=%lu, size=%lu}",
146 (size_t)at, (size_t)self->size);
148
149 if (self->size + count > CAPACITY) {
150 return NULL;
151 }
152
153 if (count == 0) {
154 return NULL;
155 }
156
157 memmove(&self->data[at + count], &self->data[at], (self->size - at) * sizeof(ITEM));
158 memcpy(&self->data[at], items, count * sizeof(ITEM));
159 self->size += count;
160 return &self->data[at];
161}
static DC_PUBLIC void mutation_tracker_mutate(mutation_tracker *self)

◆ try_pop()

DC_PUBLIC bool try_pop ( SELF * self,
ITEM * destination )
static

Definition at line 188 of file template.h.

188 {
189 INVARIANT_CHECK(self);
191 if (DC_LIKELY(self->size > 0)) {
192 self->size--;
193 *destination = self->data[self->size];
194 return true;
195 }
196 return false;
197}
#define DC_LIKELY(x)
Definition panic.h:48

◆ try_push()

DC_PUBLIC ITEM * try_push ( SELF * self,
ITEM item )
static

Definition at line 129 of file template.h.

129 {
130 INVARIANT_CHECK(self);
132 if (self->size < CAPACITY) {
133 ITEM* slot = &self->data[self->size];
134 *slot = item;
135 self->size++;
136 return slot;
137 }
138 return NULL;
139}

◆ try_read()

DC_PUBLIC ITEM const * try_read ( SELF const * self,
INDEX_TYPE index )
static

Definition at line 99 of file template.h.

99 {
100 INVARIANT_CHECK(self);
101 if (DC_LIKELY(index < self->size)) {
102 return &self->data[index];
103 }
104 return NULL;
105}

◆ try_write()

DC_PUBLIC ITEM * try_write ( SELF * self,
INDEX_TYPE index )
static

Definition at line 114 of file template.h.

114 {
115 INVARIANT_CHECK(self);
116 if (DC_LIKELY(index < self->size)) {
117 return &self->data[index];
118 }
119 return NULL;
120}

◆ write()

DC_PUBLIC ITEM * write ( SELF * self,
INDEX_TYPE index )
static

Definition at line 122 of file template.h.

122 {
123 ITEM* value = NS(SELF, try_write)(self, index);
124 DC_ASSERT(value, "Cannot write, index out of bounds {index=%lu, size=%lu}", (size_t)index,
125 (size_t)self->size);
126 return value;
127}
static DC_PUBLIC VALUE * try_write(SELF *self, INDEX index)
Definition template.h:205

Variable Documentation

◆ max_size

DC_STATIC_CONSTANT size_t max_size = CAPACITY

Definition at line 86 of file template.h.