aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/util/array.h6
-rw-r--r--util/array.c9
2 files changed, 15 insertions, 0 deletions
diff --git a/include/util/array.h b/include/util/array.h
index 32bc059f..9612e7db 100644
--- a/include/util/array.h
+++ b/include/util/array.h
@@ -4,6 +4,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
+#include <wayland-util.h>
size_t push_zeroes_to_end(uint32_t arr[], size_t n);
@@ -21,4 +22,9 @@ bool set_add(uint32_t values[], size_t *len, size_t cap, uint32_t target);
*/
bool set_remove(uint32_t values[], size_t *len, size_t cap, uint32_t target);
+/**
+ * Remove a chunk of memory of the specified size at the specified offset.
+ */
+void array_remove_at(struct wl_array *arr, size_t offset, size_t size);
+
#endif
diff --git a/util/array.c b/util/array.c
index b708b577..50025b77 100644
--- a/util/array.c
+++ b/util/array.c
@@ -1,5 +1,6 @@
#include "util/array.h"
#include <assert.h>
+#include <string.h>
// https://www.geeksforgeeks.org/move-zeroes-end-array/
size_t push_zeroes_to_end(uint32_t arr[], size_t n) {
@@ -46,3 +47,11 @@ bool set_remove(uint32_t values[], size_t *len, size_t cap, uint32_t target) {
}
return false;
}
+
+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;
+}