17void *_array_create_helper(
size_t e_size,
size_t capacity )
28 c->_reserved = capacity;
36 assert( new_size <= (
size_t)INT_MAX );
39 if ( new_size >
c->_reserved ) {
43 while ( new_size >
c->_reserved );
52void _array_resize_helper(
void **a,
size_t e_size,
size_t new_size )
55 _array_resize_container( &
c, e_size, new_size );
59void *_array_grow_helper(
void **a,
size_t e_size )
62 if (
c->_size ==
c->_reserved ) {
69 return c->_array + (
c->_size++ ) * e_size;
72void _array_erase_helper(
void **a,
size_t e_size,
void *first,
void *last )
74 intptr_t diff = (
char *)last - (
char *)first;
80 char *end =
c->_array +
c->_size * e_size;
81 memmove( first, last, end - (
char *)last );
84 assert(
"Invalid iterators passed to array erase" &&
85 ( diff % e_size == 0 ) );
86 c->_size -= diff / e_size;
89void _array_shrink_helper(
void **a,
size_t e_size )
92 if (
c->_size != 0 ) {
94 c->_reserved =
c->_size;
102void _array_free_helper(
void *a )
109void *_array_copy_helper(
size_t e_size,
void *a )
114 void *copy = _array_create_helper( e_size,
c->_size );
115 _array_resize_helper( ©, e_size,
c->_size );
116 return memcpy( copy, a, e_size *
c->_size );
121 const int size = 100;
127 for (i = 0; i < size; ++i)
131 for (i = 0; i < size; ++i)
132 assert(array[i] == i);
135 array_erase(&array, array + size / 2, array + size);
138 for (i = 0; i < size / 2; ++i)
139 assert(array[i] == i);
146 for (i = size / 2; i < size; ++i)
150 for (i = 0; i < size; ++i)
151 assert(array[i] == i);
154 array_erase(&array, array + size / 4, array + 3 * size / 4);
157 for (i = 0; i < size / 4; ++i)
158 assert(array[i] == i);
159 for (; i < size / 2; ++i)
160 assert(array[i] == i + size / 2);
169 for (i = 1; i < size / 4; ++i)
170 assert(array[i - 1] == i);
171 for (; i < size / 2; ++i)
172 assert(array[i - 1] == i + size / 2);
178 for (i = 1; i < size / 4; ++i)
179 assert(array[i - 1] == i);
180 for (; i < size / 2; ++i)
181 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’.
Private container type for the arrays.