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}