#include "darr.h" #include "aliases.h" #include #include #define BASE_CAPACITY 2048 struct darr { u64 count; u64 capacity; void *items[]; }; bool darr_init(darr_t **darr) { u64 size = sizeof(darr_t) + sizeof(void *) * BASE_CAPACITY; *darr = malloc(size); if (!(*darr)) { return false; } memset((void *)(*darr), 0, size); (*darr)->capacity = BASE_CAPACITY; return true; } i64 darr_add(darr_t **darr, void *item) { if ((*darr)->count == (*darr)->capacity) { u64 new_size = sizeof(darr_t) + sizeof(void *) * ((*darr)->capacity + BASE_CAPACITY); darr_t *orig = *darr; *darr = realloc(*darr, new_size); if (!(*darr)) { *darr = orig; return INVALID_IDX; } (*darr)->capacity = orig->capacity + BASE_CAPACITY; } u64 index = (*darr)->count; (*darr)->items[((*darr)->count)++] = item; return index; } void **darr_get_items(darr_t *darr) { return darr->items; } void darr_free(darr_t **darr) { if (!(*darr)) { return; } free(*darr); *darr = NULL; }