5 #include "system/stacktrace.h"
7 #include "system/nth_alloc.h"
10 #define DYNARRAY_INIT_CAPACITY 8
12 void *dynarray_pointer_at(const Dynarray *dynarray, size_t index)
14 trace_assert(index < dynarray->count);
15 return (uint8_t *)dynarray->data + index * dynarray->element_size;
18 void dynarray_clear(Dynarray *dynarray)
20 trace_assert(dynarray);
25 int dynarray_grow(Dynarray *dynarray)
27 if (dynarray->count < dynarray->capacity) {
31 if (dynarray->capacity == 0) {
32 dynarray->capacity = DYNARRAY_INIT_CAPACITY;
34 dynarray->capacity *= 2;
37 dynarray->data = nth_realloc(
39 dynarray->capacity * dynarray->element_size * 2);
44 int dynarray_push(Dynarray *dynarray, const void *element)
46 trace_assert(dynarray);
47 trace_assert(element);
49 if (dynarray_grow(dynarray) < 0) {
54 (char*) dynarray->data + dynarray->count * dynarray->element_size,
56 dynarray->element_size);
63 bool dynarray_contains(const Dynarray *dynarray,
66 trace_assert(dynarray);
67 trace_assert(element);
69 for (size_t i = 0; i < dynarray->count; ++i) {
70 if (memcmp((const char*)dynarray->data + i * dynarray->element_size,
72 dynarray->element_size) == 0) {
80 void dynarray_delete_at(Dynarray *dynarray, size_t index)
82 trace_assert(dynarray);
83 trace_assert(index < dynarray->count);
85 (uint8_t *) dynarray->data + index * dynarray->element_size,
86 (uint8_t *) dynarray->data + (index + 1) * dynarray->element_size,
87 dynarray->element_size * (dynarray->count - index - 1));
91 void dynarray_insert_before(Dynarray *dynarray, size_t index, void *element)
93 trace_assert(dynarray);
94 trace_assert(element);
95 trace_assert(index <= dynarray->count);
97 dynarray_grow(dynarray);
100 (uint8_t*) dynarray->data + (index + 1) * dynarray->element_size,
101 (uint8_t*) dynarray->data + index * dynarray->element_size,
102 dynarray->element_size * (dynarray->count - index));
105 (uint8_t*) dynarray->data + index * dynarray->element_size,
107 dynarray->element_size);
112 int dynarray_push_empty(Dynarray *dynarray)
114 trace_assert(dynarray);
116 if (dynarray_grow(dynarray) < 0) {
121 (char*) dynarray->data + dynarray->count * dynarray->element_size,
123 dynarray->element_size);
130 // TODO(#980): dynarray_push and dynarray_push_empty have duplicate codez
132 void dynarray_pop(Dynarray *dynarray, void *element)
134 trace_assert(dynarray);
135 trace_assert(dynarray->count > 0);
142 (uint8_t*) dynarray->data + dynarray->count * dynarray->element_size,
143 dynarray->element_size);
147 void dynarray_replace_at(Dynarray *dynarray, size_t index, void *element)
149 trace_assert(dynarray);
150 trace_assert(element);
151 trace_assert(index < dynarray->count);
154 (uint8_t*) dynarray->data + index * dynarray->element_size,
156 dynarray->element_size);
159 void dynarray_copy_to(Dynarray *dynarray, void *dest, size_t index)
161 trace_assert(dynarray);
163 trace_assert(index < dynarray->count);
165 memcpy(dest, (uint8_t*) dynarray->data + index * dynarray->element_size, dynarray->element_size);
168 void dynarray_swap(Dynarray *dynarray, size_t i, size_t j)
170 trace_assert(dynarray);
171 trace_assert(i < dynarray->count);
172 trace_assert(j < dynarray->count);
176 char *a = dynarray_pointer_at(dynarray, i);
177 char *b = dynarray_pointer_at(dynarray, j);
179 for (size_t k = 0; k < dynarray->element_size; ++k) {