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