]> git.lizzy.rs Git - nothing.git/blob - src/dynarray.h
a6476f83a31062fd5e6058be33870a54dbb45e3d
[nothing.git] / src / dynarray.h
1 #ifndef DYNARRAY_H_
2 #define DYNARRAY_H_
3
4 #include <stdlib.h>
5 #include <stdbool.h>
6 #include <stdint.h>
7 #include "system/memory.h"
8 #include "system/stacktrace.h"
9
10 #define DYNARRAY_CAPACITY 256
11
12 typedef struct {
13     size_t element_size;
14     size_t count;
15     void *data;
16 } Dynarray;
17
18 static inline
19 Dynarray create_dynarray_malloc(size_t element_size)
20 {
21     Dynarray result = {
22         .element_size = element_size,
23         .count = 0,
24         .data = malloc(DYNARRAY_CAPACITY * element_size)
25     };
26     trace_assert(result.data);
27     return result;
28 }
29
30 static inline
31 Dynarray create_dynarray(Memory *memory, size_t element_size)
32 {
33     trace_assert(memory);
34     Dynarray result = {
35         .element_size = element_size,
36         .count = 0,
37         .data = memory_alloc(memory, DYNARRAY_CAPACITY * element_size)
38     };
39     return result;
40 }
41
42 void *dynarray_pointer_at(const Dynarray *dynarray, size_t index);
43 void dynarray_replace_at(Dynarray *dynarray, size_t index, void *element);
44 void dynarray_copy_to(Dynarray *dynarray, void *dest, size_t index);
45 void dynarray_clear(Dynarray *dynarray);
46 // O(1) amortized
47 // TODO(#981): dynarray_push should be called dynarray_push_copy
48 int dynarray_push(Dynarray *dynarray, const void *element);
49 int dynarray_push_empty(Dynarray *dynarray);
50 void dynarray_pop(Dynarray *dynarray, void *element);
51 bool dynarray_contains(const Dynarray *dynarray,
52                        const void *element);
53
54 void dynarray_swap(Dynarray *dynarray, size_t i, size_t j);
55
56 // O(N)
57 void dynarray_delete_at(Dynarray *dynarray, size_t index);
58 void dynarray_insert_before(Dynarray *dynarray, size_t index, void *element);
59
60 #endif  // DYNARRAY_H_