28 static size_t vector_typesize(
size_t size)
33 #define CHECK_VECTOR(vector) \
34 CTASSERT((vector) != NULL); \
35 CTASSERT(*(vector) != NULL);
39 static void vector_ensure(
vector_t **vector,
size_t size)
43 size_t resize = (
size + 1) * 2;
53 vector->
arena = arena;
67 return vector_init_inner(
size, 0, arena);
75 return vector_init_inner(len, len, arena);
95 ctu_memcpy(clone->data, vector->data, len *
sizeof(
void *));
112 vector_ensure(vector,
VEC->used + 1);
113 VEC->data[
VEC->used++] = value;
130 vector->data[index] = value;
139 return vector->data[index];
148 return vector->data[vector->
used - 1];
164 for (
size_t i = 0; i <
vector_len(vector); i++)
182 vector_ensure(vector,
VEC->used + len);
#define STA_FIELD_SIZE(of)
annotate a field as being an array of of elements
#define STA_DECL
sal2 annotation on function implementations to copy annotations from the declaration
CT_NOALIAS CT_BASE_API void * ctu_memcpy(STA_WRITES(size) void *CT_RESTRICT dst, STA_READS(size) const void *CT_RESTRICT src, size_t size)
copy memory from one location to another equivalent to memcpy but with safety checks
CT_NODISCARD CT_ARENA_API void * arena_realloc(STA_RELEASE void *ptr, size_t new_size, size_t old_size, arena_t *arena)
resize a memory allocation from a custom allocator
#define ARENA_MALLOC(size, name, parent, arena)
allocate memory from a custom allocator
CT_ARENA_API void arena_free(STA_RELEASE void *ptr, size_t size, arena_t *arena)
release memory from a custom allocator
#define CTASSERT(expr)
assert a condition, prints the condition as a message
STA_DECL void * vector_get(const vector_t *vector, size_t index)
get a value from a vector
STA_DECL vector_t * vector_new(size_t size, arena_t *arena)
create a new vector with an initial capacity
STA_DECL vector_t * vector_of(size_t len, arena_t *arena)
create a new vector with a specified length
const vector_t kEmptyVector
a global empty vector used to avoid allocating alot of empty vectors
STA_DECL void vector_push(vector_t **vector, void *value)
push a value onto the end of a vector
STA_DECL void vector_drop(vector_t *vector)
pop a value from the end of a vector
STA_DECL void * vector_tail(const vector_t *vector)
get the last element of a vector
STA_DECL void vector_set(vector_t *vector, size_t index, void *value)
set a value in a vector
vector_t gEmptyVector
a global empty vector used to avoid allocating alot of empty vectors
STA_DECL vector_t * vector_init(void *value, arena_t *arena)
create a new vector with a single initial value
STA_DECL vector_t * vector_clone(vector_t *vector)
clone a vector
STA_DECL size_t vector_find(vector_t *vector, const void *element)
find an element in a vector searches via pointer equality
STA_DECL void vector_reset(vector_t *vec)
reset the contents of a vector
STA_DECL void ** vector_data(vector_t *vec)
get the data of a vector
STA_DECL size_t vector_len(const vector_t *vector)
get the length of a vector
STA_DECL void vector_append(vector_t **vector, const vector_t *other)
append the contents of one vector to another this copies the contents of other into vector
a generic vector of pointers
size_t size
the total number of allocated elements
size_t used
the number of elements in use
#define CHECK_VECTOR(vector)
STA_DECL void vector_delete(vector_t *vector)