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 INPLACE_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 *self)
static item_t ITEM_CLONE (item_t const *self)
static void ITEM_DEBUG (ITEM const *self, dc_debug_fmt fmt, FILE *stream)
static SELF new ()
static size_t max_size ()
static SELF clone (SELF const *self)
static ITEM const * try_read (SELF const *self, INDEX_TYPE index)
static ITEM const * read (SELF const *self, INDEX_TYPE index)
static ITEMtry_write (SELF *self, INDEX_TYPE index)
static ITEMwrite (SELF *self, INDEX_TYPE index)
static ITEMtry_push (SELF *self, ITEM item)
static ITEMtry_insert_at (SELF *self, INDEX_TYPE at, ITEM const *items, INDEX_TYPE count)
static void remove_at (SELF *self, INDEX_TYPE at, INDEX_TYPE count)
static ITEMpush (SELF *self, ITEM item)
static bool try_pop (SELF *self, ITEM *destination)
static ITEM pop (SELF *self)
static INDEX_TYPE size (SELF const *self)
static void delete (SELF *self)
static bool empty_item (ITEM *const *item)
static ITEMnext (ITER *iter)
static INDEX_TYPE position (ITER const *iter)
static bool empty (ITER const *iter)
static ITER get_iter (SELF *self)
static bool empty_item (ITEM const *const *item)
static ITEM const * next (ITER_CONST *iter)
static INDEX_TYPE position (ITER_CONST const *iter)
static bool empty (ITER_CONST const *iter)
static ITER_CONST get_iter_const (SELF const *self)
static void debug (SELF const *self, dc_debug_fmt fmt, FILE *stream)
 DC_TRAIT_VECTOR (SELF)

Macro Definition Documentation

◆ INPLACE_CAPACITY

#define INPLACE_CAPACITY   8

Definition at line 50 of file template.h.

◆ INVARIANT_CHECK

#define INVARIANT_CHECK ( self)
Value:
DC_ASSUME(self); \
DC_ASSUME((self->size) <= INPLACE_CAPACITY);
#define INPLACE_CAPACITY
Definition template.h:50
#define DC_ASSUME(expr,...)
Definition panic.h:56

Definition at line 73 of file template.h.

73#define INVARIANT_CHECK(self) \
74 DC_ASSUME(self); \
75 DC_ASSUME((self->size) <= INPLACE_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 211 of file template.h.

◆ ITER_CONST

#define ITER_CONST   NS(SELF, iter_const)

Definition at line 254 of file template.h.

Typedef Documentation

◆ item

typedef ITEM const* item

Definition at line 212 of file template.h.

Function Documentation

◆ clone()

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 INDEX_TYPE
Definition template.h:74
#define ITEM_CLONE
Definition template.h:22
#define NS(pre, post)
Definition namespace.h:4
#define SELF
Definition def.h:52
size_t size
Definition template.h:43
ITEM * data
Definition template.h:44

◆ DC_TRAIT_VECTOR()

DC_TRAIT_VECTOR ( SELF )

◆ debug()

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

Definition at line 297 of file template.h.

297 {
298 fprintf(stream, EXPAND_STRING(SELF) "@%p {\n", self);
299 fmt = dc_debug_fmt_scope_begin(fmt);
300 dc_debug_fmt_print(fmt, stream, "capacity: %lu,\n", (size_t)INPLACE_CAPACITY);
301 dc_debug_fmt_print(fmt, stream, "size: %lu,\n", (size_t)self->size);
302
303 dc_debug_fmt_print(fmt, stream, "items: @%p [\n", self->data);
304 fmt = dc_debug_fmt_scope_begin(fmt);
305 ITER_CONST iter = NS(SELF, get_iter_const)(self);
306 ITEM const* item;
307 while ((item = NS(ITER_CONST, next)(&iter))) {
309 ITEM_DEBUG(item, fmt, stream);
310 fprintf(stream, ",\n");
311 }
312 fmt = dc_debug_fmt_scope_end(fmt);
313 dc_debug_fmt_print(fmt, stream, "],\n");
314 fmt = dc_debug_fmt_scope_end(fmt);
315 dc_debug_fmt_print(fmt, stream, "}\n");
316}
#define ITEM
Definition template.h:63
static ITER_CONST get_iter_const(SELF const *self)
Definition template.h:449
static IV_PAIR next(ITER *iter)
Definition template.h:352
#define ITER_CONST
Definition template.h:398
IV_PAIR item
Definition template.h:283
#define ITEM_DEBUG
Definition template.h:24
dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
Definition fmt.h:39
static void dc_debug_fmt_print_indents(dc_debug_fmt fmt, FILE *stream)
Definition fmt.h:16
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 204 of file template.h.

204 {
205 INVARIANT_CHECK(self);
206 for (INDEX_TYPE i = 0; i < self->size; i++) {
207 ITEM_DELETE(&self->data[i]);
208 }
209}
#define INVARIANT_CHECK(self)
Definition template.h:88
#define ITEM_DELETE
Definition template.h:20

◆ empty() [1/2]

bool empty ( ITER const * iter)
static

Definition at line 239 of file template.h.

239 {
240 DC_ASSUME(iter);
241 mutation_version_check(&iter->version);
242 return iter->pos >= iter->vec->size;
243}
static void mutation_version_check(mutation_version const *self)

◆ empty() [2/2]

bool empty ( ITER_CONST const * iter)
static

Definition at line 282 of file template.h.

282 {
283 DC_ASSUME(iter);
284 mutation_version_check(&iter->version);
285 return iter->pos >= iter->vec->size;
286}

◆ empty_item() [1/2]

bool empty_item ( ITEM *const * item)
static

Definition at line 214 of file template.h.

214{ return *item == NULL; }

◆ empty_item() [2/2]

bool empty_item ( ITEM const *const * item)
static

Definition at line 257 of file template.h.

257{ return *item == NULL; }

◆ get_iter()

ITER get_iter ( SELF * self)
static

Definition at line 245 of file template.h.

245 {
246 DC_ASSUME(self);
247 return (ITER){.vec = self,
248 .pos = 0,
250}
#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 288 of file template.h.

288 {
289 DC_ASSUME(self);
290 return (ITER_CONST){
291 .vec = self,
292 .pos = 0,
293 .version = mutation_tracker_get(&self->iterator_invalidation_tracker),
294 };
295}

◆ ITEM_CLONE()

item_t ITEM_CLONE ( item_t const * self)
static

◆ ITEM_DEBUG()

void ITEM_DEBUG ( ITEM const * self,
dc_debug_fmt fmt,
FILE * stream )
static

◆ ITEM_DELETE()

void ITEM_DELETE ( item_t * self)
static

◆ max_size()

size_t max_size ( )
static

Definition at line 86 of file template.h.

86{ return INPLACE_CAPACITY; }

◆ 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_gdb_marker dc_gdb_marker_new()
Definition gdb_marker.h:7
static mutation_tracker mutation_tracker_new()

◆ next() [1/2]

ITEM * next ( ITER * iter)
static

Definition at line 222 of file template.h.

222 {
223 DC_ASSUME(iter);
225 if (iter->pos < iter->vec->size) {
226 ITEM* item = &iter->vec->data[iter->pos];
227 iter->pos++;
228 return item;
229 }
230 return NULL;
231}
mutation_version version
Definition template.h:326
SELF * vec
Definition template.h:351
size_t pos
Definition template.h:214

◆ next() [2/2]

ITEM const * next ( ITER_CONST * iter)
static

Definition at line 265 of file template.h.

265 {
266 DC_ASSUME(iter);
268 if (iter->pos < iter->vec->size) {
269 ITEM const* item = &iter->vec->data[iter->pos];
270 iter->pos++;
271 return item;
272 }
273 return NULL;
274}
size_t pos
Definition template.h:261
mutation_version version
Definition template.h:404
SELF const * vec
Definition template.h:396

◆ pop()

ITEM pop ( SELF * self)
static

Definition at line 193 of file template.h.

193 {
194 ITEM entry;
195 DC_ASSERT(NS(SELF, try_pop)(self, &entry));
196 return entry;
197}
static bool try_pop(SELF *self, ITEM *destination)
Definition template.h:247
#define DC_ASSERT(expr,...)
Definition panic.h:36

◆ position() [1/2]

INDEX_TYPE position ( ITER const * iter)
static

Definition at line 233 of file template.h.

233 {
234 DC_ASSUME(iter);
235 mutation_version_check(&iter->version);
236 return iter->pos;
237}

◆ position() [2/2]

INDEX_TYPE position ( ITER_CONST const * iter)
static

Definition at line 276 of file template.h.

276 {
277 DC_ASSUME(iter);
278 mutation_version_check(&iter->version);
279 return iter->pos;
280}

◆ push()

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

Definition at line 176 of file template.h.

176 {
177 ITEM* slot = NS(SELF, try_push)(self, item);
178 DC_ASSERT(slot);
179 return slot;
180}
static ITEM * try_push(SELF *self, ITEM item)
Definition template.h:127

◆ read()

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);
110 return value;
111}
static VALUE const * try_read(SELF const *self, INDEX index)
Definition template.h:180

◆ remove_at()

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

Definition at line 160 of file template.h.

160 {
161 INVARIANT_CHECK(self);
162 DC_ASSERT(at + count <= self->size);
163
164 if (count == 0) {
165 return;
166 }
167
168 for (INDEX_TYPE i = at; i < at + count; i++) {
169 ITEM_DELETE(&self->data[i]);
170 }
171
172 memmove(&self->data[at], &self->data[at + count], (self->size - (at + count)) * sizeof(ITEM));
173 self->size -= count;
174}
static INDEX_TYPE size(SELF const *self)
Definition template.h:252

◆ size()

INDEX_TYPE size ( SELF const * self)
static

Definition at line 199 of file template.h.

199 {
200 INVARIANT_CHECK(self);
201 return self->size;
202}

◆ try_insert_at()

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

Definition at line 139 of file template.h.

140 {
141 INVARIANT_CHECK(self);
142 DC_ASSUME(items);
143 DC_ASSERT(at <= self->size);
145
146 if (self->size + count > INPLACE_CAPACITY) {
147 return NULL;
148 }
149
150 if (count == 0) {
151 return NULL;
152 }
153
154 memmove(&self->data[at + count], &self->data[at], (self->size - at) * sizeof(ITEM));
155 memcpy(&self->data[at], items, count * sizeof(ITEM));
156 self->size += count;
157 return &self->data[at];
158}
static void mutation_tracker_mutate(mutation_tracker *self)

◆ try_pop()

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

Definition at line 182 of file template.h.

182 {
183 INVARIANT_CHECK(self);
185 if (DC_LIKELY(self->size > 0)) {
186 self->size--;
187 *destination = self->data[self->size];
188 return true;
189 }
190 return false;
191}
#define DC_LIKELY(x)
Definition panic.h:47

◆ try_push()

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

Definition at line 127 of file template.h.

127 {
128 INVARIANT_CHECK(self);
130 if (self->size < INPLACE_CAPACITY) {
131 ITEM* slot = &self->data[self->size];
132 *slot = item;
133 self->size++;
134 return slot;
135 }
136 return NULL;
137}

◆ try_read()

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()

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

Definition at line 113 of file template.h.

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

◆ write()

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

Definition at line 121 of file template.h.

121 {
122 ITEM* value = NS(SELF, try_write)(self, index);
123 DC_ASSERT(value);
124 return value;
125}
static VALUE * try_write(SELF *self, INDEX index)
Definition template.h:205