14 #if !defined __clang_analyzer__
15 #error "ITEM must be defined"
22 #define ITEM_DELETE item_delete
24 #define ITEM_CLONE item_clone
27#if !defined ITEM_DELETE
28 #define ITEM_DELETE(value)
31#if !defined ITEM_CLONE
32 #define ITEM_CLONE(value) (*(value))
35#if !defined INPLACE_CAPACITY
36 #if !defined __clang_analyzer__
37 #error "The number of elements to store in-place must be defined"
39 #define INPLACE_CAPACITY 8
42#if INPLACE_CAPACITY <= 255
43 #define INPLACE_TYPE uint8_t
44#elif INPLACE_CAPACITY <= 65535
45 #define INPLACE_TYPE uint16_t
47 #error "INPLACE_CAPACITY must be less than or equal to 65535"
48 #define INPLACE_TYPE size_t
63 new_self.
size = self->size;
73 return &self->data[index];
87 return &self->data[index];
101 ITEM* slot = &self->data[self->size];
118 memmove(&self->data[at + count], &self->data[at], (self->size - at) *
sizeof(
ITEM));
119 memcpy(&self->data[at], items, count *
sizeof(
ITEM));
132 for (
size_t i = at; i < at + count; i++) {
136 memmove(&self->data[at], &self->data[at + count], (self->size - (at + count)) *
sizeof(
ITEM));
148 if (
LIKELY(self->size > 0)) {
150 *destination = self->data[self->size];
174#define ITER NS(SELF, iter)
183 if (iter->pos < iter->vec->size) {
184 ITEM* item = &iter->vec->data[iter->pos];
196static bool NS(ITER,
empty)(ITER
const* iter) {
198 return iter->pos >= iter->vec->size;
211#define ITER_CONST NS(SELF, iter_const)
220 if (iter->pos < iter->vec->size) {
221 ITEM const* item = &iter->vec->data[iter->pos];
228static size_t NS(ITER_CONST,
position)(ITER_CONST
const* iter) {
233static bool NS(ITER_CONST,
empty)(ITER_CONST
const* iter) {
235 return iter->pos >= iter->vec->size;
249#undef INPLACE_CAPACITY
#define DEBUG_ASSERT(expr)
gdb_marker derive_c_staticvec
A queue comprised of an extendable circular buffer.
static ITER_CONST get_iter_const(SELF const *self)
static bool empty(ITER const *iter)
static ITER get_iter(SELF *self)
static INDEX_TYPE size(SELF const *self)
static IV_PAIR const * next(ITER *iter)
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 item_delete(item_t *UNUSED(self))
static item_t item_clone(item_t const *self)
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 ITEM * try_push(SELF *self, ITEM item)
static size_t position(ITER const *iter)
static bool try_insert_at(SELF *self, size_t at, ITEM const *items, size_t count)
static const INPLACE_TYPE max_size