63 lines
1.0 KiB
C
63 lines
1.0 KiB
C
#include "darr.h"
|
|
#include "aliases.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#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;
|
|
}
|