15void *_array_create_helper(
size_t e_size,
size_t capacity)
24 c->_reserved = capacity;
29static void _array_resize_container(
_private_container **c_,
size_t e_size,
size_t new_size)
31 assert( new_size <= (
size_t)INT_MAX );
34 if (new_size >
c->_reserved) {
38 while (new_size >
c->_reserved);
47void _array_resize_helper(
void **a,
size_t e_size,
size_t new_size)
50 _array_resize_container(&
c, e_size, new_size);
54void *_array_grow_helper(
void **a,
size_t e_size)
57 if (
c->_size ==
c->_reserved) {
64 return c->_array + (
c->_size++) * e_size;
67void _array_erase_helper(
void **a,
size_t e_size,
void *first,
void *last)
69 intptr_t diff = (
char *)last - (
char *)first;
75 char *end =
c->_array +
c->_size * e_size;
76 memmove(first, last, end - (
char *)last);
79 assert(
"Invalid iterators passed to array erase" && (diff % e_size == 0));
80 c->_size -= diff / e_size;
83void _array_shrink_helper(
void **a,
size_t e_size)
88 c->_reserved =
c->_size;
96void _array_free_helper(
void *a)
103void *_array_copy_helper(
size_t e_size,
void *a)
108 void *copy = _array_create_helper( e_size,
c->_size );
109 _array_resize_helper( ©, e_size,
c->_size );
110 return memcpy( copy, a, e_size *
c->_size );
115 const int size = 100;
121 for (i = 0; i < size; ++i)
125 for (i = 0; i < size; ++i)
126 assert(array[i] == i);
129 array_erase(&array, array + size / 2, array + size);
132 for (i = 0; i < size / 2; ++i)
133 assert(array[i] == i);
140 for (i = size / 2; i < size; ++i)
144 for (i = 0; i < size; ++i)
145 assert(array[i] == i);
148 array_erase(&array, array + size / 4, array + 3 * size / 4);
151 for (i = 0; i < size / 4; ++i)
152 assert(array[i] == i);
153 for (; i < size / 2; ++i)
154 assert(array[i] == i + size / 2);
163 for (i = 1; i < size / 4; ++i)
164 assert(array[i - 1] == i);
165 for (; i < size / 2; ++i)
166 assert(array[i - 1] == i + size / 2);
172 for (i = 1; i < size / 4; ++i)
173 assert(array[i - 1] == i);
174 for (; i < size / 2; ++i)
175 assert(array[i - 1] == i + size / 2);
Provides macros to work with dynamic arrays.
#define array_end(array)
Returns a pointer to the end of the reserved memory space.
#define array_erase(ptr_array, first, last)
Erases elements in interval [first, last).
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.
#define array_shrink(ptr_array)
Shrinks memory to fit only ‘size’ elements.
#define array_push_back(ptr_array, element)
Adds a new element at the end of the array.
#define array_begin(array)
Returns a pointer to the beginning of the reserved memory space.
#define array_reserved(array)
Returns number of elements reserved.
#define array_create(basic_type)
Creates a new dynamic array of ‘basic_type’.
int main(int argc, char **argv)
The entry point of Naev.
Private container type for the arrays.