naev 0.11.5
array.h
Go to the documentation of this file.
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
36#pragma once
37
39#include <assert.h>
40#include <stddef.h>
41#include <stdalign.h>
42#include <stdint.h>
45#include "attributes.h"
46
47#define ARRAY_SENTINEL 0x15bada55
52typedef struct {
53#if DEBUG_ARRAYS
54 int _sentinel;
55#endif /* DEBUG_ARRAYS */
56 size_t _reserved;
57 size_t _size;
58 char alignas(max_align_t) _array[];
60
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);
68
76{
77 assert("NULL array!" && (a != NULL));
78
80
81#if DEBUG_ARRAYS
82 assert("Sentinel not found. Use array_create() to create the array." && (c->_sentinel == ARRAY_SENTINEL));
83#endif /* DEBUG_ARRAYS */
84
85 return c;
86}
87
93#define array_create(basic_type) \
94 ((basic_type *)(_array_create_helper(sizeof(basic_type), 1)))
95
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]))) // NOLINT (bugprone-sizeof-expression)
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))) // NOLINT
149#define array_shrink(ptr_array) \
150 (_array_shrink_helper((void **)(ptr_array), sizeof((ptr_array)[0][0]))) // NOLINT
158#define array_free(ptr_array) \
159 _array_free_helper((void *)(ptr_array))
160
168ALWAYS_INLINE static inline int array_size(const void *array)
169{
170 const _private_container *c1 = array;
171
172 if (c1 == NULL)
173 return 0;
174
175#if DEBUG_ARRAYS
176 assert("Sentinel not found. Use array_create() to create the array." && (c1[-1]._sentinel == ARRAY_SENTINEL));
177#endif /* DEBUG_ARRAYS */
178
179 return c1[-1]._size;
180}
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.
Definition array.h:168
static _private_container * _array_private_container(void *a)
Gets the container of an array.
Definition array.h:75
#define ARRAY_SENTINEL
Definition array.h:47
static const double c[]
Definition rng.c:264
Private container type for the arrays.
Definition array.h:52
size_t _reserved
Definition array.h:56