kiba-engine
array.h
1 #pragma once
2 
4 
5 typedef struct array_header {
6  usize size;
7  usize capacity;
8  usize element_size;
9  allocator *alloc;
10 } array_header;
11 
12 static inline array_header *_array_get_header(const void *arr) { return ((array_header *) arr) - 1; }
13 
14 #define array_of(type) type *
15 #define array_size(array) (_array_get_header(array)->size)
16 #define array_capacity(array) (_array_get_header(array)->capacity)
17 #define array_element_size(array) (_array_get_header(array)->element_size)
18 #define array_alloc(array) (_array_get_header(array)->alloc)
19 
20 // TODO figure out better alignment strategy!
21 KB_API void *_array_create(usize initial_capacity, usize element_size, usize element_alignment, allocator *alloc);
22 #define array_create(type, initial_capacity, alloc_ptr) \
23  (array_of(type))(_array_create(initial_capacity, sizeof(type), 1, alloc_ptr))
24 
25 KB_API void array_destroy(void *arr_ptr);
26 
27 KB_API b8 array_reserve(void *arr_ptr, usize new_capacity);
28 KB_API b8 array_resize(void *arr_ptr, usize new_size);
29 KB_API void *array_clone(const void *arr, allocator *alloc);
30 
31 #define array_push(array, element) \
32  do { \
33  array[array_size(array)++] = element; \
34  } while (0)
35 KB_API b8 array_push_checked(void *arr, void *element);
36 
37 #define array_pop(array) array[--array_size(array)]
38 KB_API b8 array_pop_checked(void *arr_ptr, void *element);
39 
40 KB_API b8 array_insert(void *arr_ptr, usize index, void *element);
41 
42 KB_API b8 array_remove(void *arr_ptr, usize index, void *element);
43 
44 #define array_for_each(type, var, arr) for (type *var = arr; var < arr + array_size(arr); ++var)
Central header providing allocator functionality.
Central allocator structure.
Definition: allocator.h:87