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