5#if !defined(SKIP_INCLUDES)
19 #if !defined PLACEHOLDERS
26 #define ITEM_DELETE item_delete
28 #define ITEM_CLONE item_clone
30 #define ITEM_DEBUG item_debug
34#if !defined ITEM_DELETE
35 #define ITEM_DELETE DC_NO_DELETE
38#if !defined ITEM_CLONE
39 #define ITEM_CLONE DC_COPY_CLONE
42#if !defined ITEM_DEBUG
43 #define ITEM_DEBUG DC_DEFAULT_DEBUG
46#if !defined INPLACE_CAPACITY
47 #if !defined PLACEHOLDERS
50 #define INPLACE_CAPACITY 8
52#if INPLACE_CAPACITY == 0
54#elif INPLACE_CAPACITY <= 255
55 #define INDEX_TYPE uint8_t
56#elif INPLACE_CAPACITY <= 65535
57 #define INDEX_TYPE uint16_t
59TEMPLATE_ERROR(
"INPLACE_CAPACITY must be less than or equal to 65535")
60 #define INDEX_TYPE size_t
73#define INVARIANT_CHECK(self) \
75 DC_ASSUME((self->size) <= INPLACE_CAPACITY);
90 new_self.
size = self->size;
102 return &self->data[index];
116 return &self->data[index];
131 ITEM* slot = &self->data[self->size];
154 memmove(&self->data[at + count], &self->data[at], (self->size - at) *
sizeof(
ITEM));
155 memcpy(&self->data[at], items, count *
sizeof(
ITEM));
157 return &self->data[at];
168 for (
INDEX_TYPE i = at; i < at + count; i++) {
172 memmove(&self->data[at], &self->data[at + count], (self->size - (at + count)) *
sizeof(
ITEM));
187 *destination = self->data[self->size];
211#define ITER NS(SELF, iter)
225 if (iter->pos < iter->vec->size) {
226 ITEM*
item = &iter->vec->data[iter->pos];
242 return iter->pos >= iter->vec->size;
247 return (
ITER){.vec = self,
254#define ITER_CONST NS(SELF, iter_const)
268 if (iter->pos < iter->vec->size) {
269 ITEM const*
item = &iter->vec->data[iter->pos];
285 return iter->pos >= iter->vec->size;
319#undef INVARIANT_CHECK
321#undef INPLACE_CAPACITY
static void debug(SELF const *self, dc_debug_fmt fmt, FILE *stream)
static ITER_CONST get_iter_const(SELF const *self)
static bool empty(ITER const *iter)
static ITER get_iter(SELF *self)
static IV_PAIR next(ITER *iter)
static INDEX_TYPE size(SELF const *self)
#define INVARIANT_CHECK(self)
static bool empty_item(IV_PAIR const *item)
static VALUE * try_write(SELF *self, INDEX index)
static VALUE const * read(SELF const *self, INDEX index)
static VALUE * write(SELF *self, INDEX index)
static SELF clone(SELF const *self)
static VALUE const * try_read(SELF const *self, INDEX index)
static void remove_at(SELF *self, size_t at, size_t count)
static ITEM * push(SELF *self, ITEM item)
static bool try_pop(SELF *self, ITEM *destination)
static ITEM pop(SELF *self)
static size_t position(ITER const *iter)
static ITEM * try_insert_at(SELF *self, size_t at, ITEM const *items, size_t count)
static ITEM * try_push(SELF *self, ITEM item)
#define DC_TRAIT_VECTOR(SELF)
dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
static void dc_debug_fmt_print_indents(dc_debug_fmt fmt, FILE *stream)
dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
static void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
static dc_gdb_marker dc_gdb_marker_new()
static mutation_tracker mutation_tracker_new()
static void mutation_version_check(mutation_version const *self)
static mutation_version mutation_tracker_get(mutation_tracker const *self)
static void mutation_tracker_mutate(mutation_tracker *self)
#define EXPAND_STRING(NAME)
#define DC_ASSERT(expr,...)
#define DC_ASSUME(expr,...)
#define TEMPLATE_ERROR(...)
With the user provided name, even in nested templates.
mutation_tracker iterator_invalidation_tracker
dc_gdb_marker derive_c_staticvec
Debug format helpers for debug printin data structures.
A queue comprised of an extendable circular buffer.
tracks a specific version of a value, so that this can be compared later to check modification For ex...
static FILE * stream(SELF *self)
Opens a file for.