Simple dynamic array

This commit is contained in:
Abdelrahman Said 2023-10-21 18:57:25 +01:00
parent fb4a2946b7
commit 226d6f9359
2 changed files with 78 additions and 0 deletions

16
include/darr.h Normal file
View 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
View 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;
}