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)
25 Dynarray *dynarray = PUSH_LT(lt, nth_calloc(1, sizeof(Dynarray)), free);
26 if (dynarray == NULL) {
31 dynarray->element_size = element_size;
32 dynarray->capacity = DYNARRAY_INIT_CAPACITY;
35 dynarray->data = PUSH_LT(lt, nth_calloc(DYNARRAY_INIT_CAPACITY, element_size), free);
36 if (dynarray->data == NULL) {
43 void destroy_dynarray(Dynarray *dynarray)
45 trace_assert(dynarray);
46 RETURN_LT0(dynarray->lt);
49 size_t dynarray_count(const Dynarray *dynarray)
51 trace_assert(dynarray);
52 return dynarray->count;
55 void *dynarray_data(Dynarray *dynarray)
57 trace_assert(dynarray);
58 return dynarray->data;
61 void dynarray_clear(Dynarray *dynarray)
63 trace_assert(dynarray);
67 int dynarray_push(Dynarray *dynarray, const void *element)
69 trace_assert(dynarray);
70 trace_assert(element);
72 if (dynarray->count >= dynarray->capacity) {
73 void *new_data = nth_realloc(
75 dynarray->capacity * dynarray->element_size * 2);
76 if (new_data == NULL) {
80 dynarray->data = REPLACE_LT(dynarray->lt, dynarray->data, new_data);
81 if (dynarray->data == NULL) {
85 dynarray->capacity *= 2;
89 (char*) dynarray->data + dynarray->count * dynarray->element_size,
91 dynarray->element_size);
98 bool dynarray_contains(const Dynarray *dynarray,
101 trace_assert(dynarray);
102 trace_assert(element);
104 for (size_t i = 0; i < dynarray->count; ++i) {
105 if (memcmp((const char*)dynarray->data + i * dynarray->element_size,
106 (const char*)element,
107 dynarray->element_size) == 0) {
115 void dynarray_delete_at(Dynarray *dynarray, size_t index)
117 trace_assert(dynarray);
118 trace_assert(index < dynarray->count);
120 dynarray->data + index * dynarray->element_size,
121 dynarray->data + (index + 1) * dynarray->element_size,
122 dynarray->element_size * (dynarray->count - index - 1));