wlroots/util/array.c

41 lines
942 B
C
Raw Normal View History

#include "util/array.h"
#include <assert.h>
2021-07-01 07:57:30 +00:00
#include <string.h>
2018-07-07 15:56:37 +00:00
2021-07-01 07:57:30 +00:00
void array_remove_at(struct wl_array *arr, size_t offset, size_t size) {
assert(arr->size >= offset + size);
char *data = arr->data;
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;
}