Simple dynamic array
This commit is contained in:
parent
fb4a2946b7
commit
226d6f9359
16
include/darr.h
Normal file
16
include/darr.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef D_ARR_H
|
||||
#define D_ARR_H
|
||||
|
||||
#include "aliases.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
#define INVALID_IDX -1
|
||||
|
||||
typedef struct darr darr_t;
|
||||
|
||||
bool darr_init(darr_t **darr);
|
||||
i64 darr_add(darr_t **darr, void *item);
|
||||
void **darr_get_items(darr_t *darr);
|
||||
void darr_free(darr_t **darr);
|
||||
|
||||
#endif // !D_ARR_H
|
62
src/darr.c
Normal file
62
src/darr.c
Normal file
@ -0,0 +1,62 @@
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user