5 #include "system/stacktrace.h"
7 #include "system/nth_alloc.h"
10 void *dynarray_pointer_at(const Dynarray *dynarray, size_t index)
12 trace_assert(index < dynarray->count);
13 return (uint8_t *)dynarray->data + index * dynarray->element_size;
16 void dynarray_clear(Dynarray *dynarray)
18 trace_assert(dynarray);
22 int dynarray_push(Dynarray *dynarray, const void *element)
24 trace_assert(dynarray);
25 trace_assert(element);
26 trace_assert(dynarray->count < DYNARRAY_CAPACITY);
29 (char*) dynarray->data + dynarray->count * dynarray->element_size,
31 dynarray->element_size);
38 bool dynarray_contains(const Dynarray *dynarray,
41 trace_assert(dynarray);
42 trace_assert(element);
44 for (size_t i = 0; i < dynarray->count; ++i) {
45 if (memcmp((const char*)dynarray->data + i * dynarray->element_size,
47 dynarray->element_size) == 0) {
55 void dynarray_delete_at(Dynarray *dynarray, size_t index)
57 trace_assert(dynarray);
58 trace_assert(index < dynarray->count);
60 (uint8_t *) dynarray->data + index * dynarray->element_size,
61 (uint8_t *) dynarray->data + (index + 1) * dynarray->element_size,
62 dynarray->element_size * (dynarray->count - index - 1));
66 void dynarray_insert_before(Dynarray *dynarray, size_t index, void *element)
68 trace_assert(dynarray);
69 trace_assert(dynarray->count < DYNARRAY_CAPACITY);
70 trace_assert(element);
71 trace_assert(index <= dynarray->count);
73 if (index == dynarray->count) {
74 dynarray_push(dynarray, element);
79 (uint8_t*) dynarray->data + (index + 1) * dynarray->element_size,
80 (uint8_t*) dynarray->data + index * dynarray->element_size,
81 dynarray->element_size * (dynarray->count - index));
84 (uint8_t*) dynarray->data + index * dynarray->element_size,
86 dynarray->element_size);
91 int dynarray_push_empty(Dynarray *dynarray)
93 trace_assert(dynarray);
94 trace_assert(dynarray->count < DYNARRAY_CAPACITY);
97 (char*) dynarray->data + dynarray->count * dynarray->element_size,
99 dynarray->element_size);
106 // TODO(#980): dynarray_push and dynarray_push_empty have duplicate codez
108 void dynarray_pop(Dynarray *dynarray, void *element)
110 trace_assert(dynarray);
111 trace_assert(dynarray->count > 0);
118 (uint8_t*) dynarray->data + dynarray->count * dynarray->element_size,
119 dynarray->element_size);
123 void dynarray_replace_at(Dynarray *dynarray, size_t index, void *element)
125 trace_assert(dynarray);
126 trace_assert(element);
127 trace_assert(index < dynarray->count);
130 (uint8_t*) dynarray->data + index * dynarray->element_size,
132 dynarray->element_size);
135 void dynarray_copy_to(Dynarray *dynarray, void *dest, size_t index)
137 trace_assert(dynarray);
139 trace_assert(index < dynarray->count);
141 memcpy(dest, (uint8_t*) dynarray->data + index * dynarray->element_size, dynarray->element_size);
144 void dynarray_swap(Dynarray *dynarray, size_t i, size_t j)
146 trace_assert(dynarray);
147 trace_assert(i < dynarray->count);
148 trace_assert(j < dynarray->count);
152 char *a = dynarray_pointer_at(dynarray, i);
153 char *b = dynarray_pointer_at(dynarray, j);
155 for (size_t k = 0; k < dynarray->element_size; ++k) {