blob: ec16a7b132031d031671072207b3ca5707587e65 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#include "util/array.h"
#include <assert.h>
#include <string.h>
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;
}
|