5 #include "system/stacktrace.h"
7 #include "system/nth_alloc.h"
10 #define DYNARRAY_INIT_CAPACITY 8
21 Dynarray *create_dynarray(size_t element_size)
28 Dynarray *dynarray = PUSH_LT(lt, nth_calloc(1, sizeof(Dynarray)), free);
29 if (dynarray == NULL) {
34 dynarray->element_size = element_size;
35 dynarray->capacity = DYNARRAY_INIT_CAPACITY;
38 dynarray->data = PUSH_LT(lt, nth_calloc(DYNARRAY_INIT_CAPACITY, element_size), free);
39 if (dynarray->data == NULL) {
46 void destroy_dynarray(Dynarray *dynarray)
48 trace_assert(dynarray);
49 RETURN_LT0(dynarray->lt);
52 size_t dynarray_count(const Dynarray *dynarray)
54 trace_assert(dynarray);
55 return dynarray->count;
58 void *dynarray_data(Dynarray *dynarray)
60 trace_assert(dynarray);
61 return dynarray->data;
64 void dynarray_clear(Dynarray *dynarray)
66 trace_assert(dynarray);
70 int dynarray_push(Dynarray *dynarray, const void *element)
72 trace_assert(dynarray);
73 trace_assert(element);
75 if (dynarray->count >= dynarray->capacity) {
76 void *new_data = nth_realloc(
78 dynarray->capacity * dynarray->element_size * 2);
79 if (new_data == NULL) {
83 dynarray->data = REPLACE_LT(dynarray->lt, dynarray->data, new_data);
84 if (dynarray->data == NULL) {
88 dynarray->capacity *= 2;
92 (char*) dynarray->data + dynarray->count * dynarray->element_size,
94 dynarray->element_size);
101 bool dynarray_contains(const Dynarray *dynarray,
104 trace_assert(dynarray);
105 trace_assert(element);
107 for (size_t i = 0; i < dynarray->count; ++i) {
108 if (memcmp((const char*)dynarray->data + i * dynarray->element_size,
109 (const char*)element,
110 dynarray->element_size) == 0) {
118 void dynarray_delete_at(Dynarray *dynarray, size_t index)
120 trace_assert(dynarray);
121 trace_assert(index < dynarray->count);
123 dynarray->data + index * dynarray->element_size,
124 dynarray->data + (index + 1) * dynarray->element_size,
125 dynarray->element_size * (dynarray->count - index - 1));