src/dynarray.c
1#include <stdio.h>
2
3#include "alba.h"
4
5#include <stdlib.h>
6#include <string.h>
7
8DynArray dynarray_new(const uint64_t element_size, const uint64_t capacity)
9{
10 DynArray array = {0};
11 array.element_size = element_size;
12 if (capacity > 0)
13 {
14 dynarray_reserve(&array, capacity);
15 }
16 return array;
17}
18
19void dynarray_reserve(DynArray* array, const uint64_t request)
20{
21 if (array->capacity > request) return;
22 if (array->capacity == 0) array->capacity = 16;
23 while (request > array->capacity)
24 {
25 array->capacity *= 2;
26 }
27 array->data = reallocarray(array->data, array->capacity, array->element_size);
28}
29
30void dynarray_append(DynArray* array, const void* value)
31{
32 dynarray_extend(array, 1, value);
33}
34
35void dynarray_extend(DynArray* array, const uint64_t size, const void* data)
36{
37 dynarray_reserve(array, array->length + size);
38 memcpy(array->data + array->length * array->element_size, data, size * array->element_size);
39 array->length += size;
40}
41
42void dynarray_release(const DynArray* array)
43{
44 free(array->data);
45}
46
47void dynarray_clear(DynArray* array)
48{
49 array->length = 0;
50}