@ -55,3 +55,32 @@ void array_remove_at(struct wl_array *arr, size_t offset, size_t size) {
memmove ( & data [ offset ] , & data [ offset + size ] , arr - > size - offset - size ) ;
arr - > size - = size ;
}
bool array_realloc ( struct wl_array * arr , size_t size ) {
// If the size is less than 1/4th of the allocation size, we shrink it.
// 1/4th is picked to provide hysteresis, without which an array with size
// arr->alloc would constantly reallocate if an element is added and then
// removed continously.
size_t alloc ;
if ( arr - > alloc > 0 & & size > arr - > alloc / 4 ) {
alloc = arr - > alloc ;
} else {
alloc = 16 ;
}
while ( alloc < size ) {
alloc * = 2 ;
}
if ( alloc = = arr - > alloc ) {
return true ;
}
void * data = realloc ( arr - > data , alloc ) ;
if ( data = = NULL ) {
return false ;
}
arr - > data = data ;
arr - > alloc = alloc ;
return true ;
}