45#include "attributes.h"
47#define ARRAY_SENTINEL 0x15bada55
58 char alignas(max_align_t) _array[];
61void *_array_create_helper(
size_t e_size,
size_t initial_size);
62void *_array_grow_helper(
void **a,
size_t e_size);
63void _array_resize_helper(
void **a,
size_t e_size,
size_t new_size);
64void _array_erase_helper(
void **a,
size_t e_size,
void *first,
void *last);
65void _array_shrink_helper(
void **a,
size_t e_size);
66void _array_free_helper(
void *a);
67void *_array_copy_helper(
size_t e_size,
void *a);
77 assert(
"NULL array!" && (a != NULL));
82 assert(
"Sentinel not found. Use array_create() to create the array." && (
c->_sentinel ==
ARRAY_SENTINEL));
93#define array_create(basic_type) \
94 ((basic_type *)(_array_create_helper(sizeof(basic_type), 1)))
102#define array_create_size(basic_type, capacity) \
103 ((basic_type *)(_array_create_helper(sizeof(basic_type), capacity)))
112#define array_resize(ptr_array, new_size) \
113 (_array_resize_helper((void **)(ptr_array), sizeof((ptr_array)[0][0]), new_size))
119#define array_grow(ptr_array) \
120 (*(__typeof__((ptr_array)[0]))_array_grow_helper((void **)(ptr_array), sizeof((ptr_array)[0][0])))
129#define array_push_back(ptr_array, element) \
130 do array_grow(ptr_array) = element; while (0)
140#define array_erase(ptr_array, first, last) \
141 (_array_erase_helper((void **)(ptr_array), sizeof((ptr_array)[0][0]), (void *)(first), (void *)(last)))
149#define array_shrink(ptr_array) \
150 (_array_shrink_helper((void **)(ptr_array), sizeof((ptr_array)[0][0])))
158#define array_free(ptr_array) \
159 _array_free_helper((void *)(ptr_array))
176 assert(
"Sentinel not found. Use array_create() to create the array." && (c1[-1]._sentinel ==
ARRAY_SENTINEL));
187#define array_reserved(array) (_array_private_container(array)->_reserved)
194#define array_begin(array) (array)
202#define array_end(array) ((array) + array_size(array))
209#define array_front(ptr_array) (*array_begin(ptr_array))
216#define array_back(ptr_array) (*(array_end(ptr_array) - 1))
218#define array_copy(basic_type, ptr_array) \
219 ((basic_type *)(_array_copy_helper(sizeof(basic_type), (void *)(ptr_array))))
static ALWAYS_INLINE int array_size(const void *array)
Returns number of elements in the array.
static _private_container * _array_private_container(void *a)
Gets the container of an array.
Private container type for the arrays.