diff --git a/include/util/array.h b/include/util/array.h index 2b7278cc..a51bdb64 100644 --- a/include/util/array.h +++ b/include/util/array.h @@ -1,27 +1,10 @@ #ifndef UTIL_ARRAY_H #define UTIL_ARRAY_H -#include #include #include #include -size_t push_zeroes_to_end(uint32_t arr[], size_t n); - -/** - * Add `target` to `values` if it doesn't exist - * "set"s should only be modified with set_* functions - * Values MUST be greater than 0 - */ -bool set_add(uint32_t values[], size_t *len, size_t cap, uint32_t target); - -/** - * Remove `target` from `values` if it exists - * "set"s should only be modified with set_* functions - * Values MUST be greater than 0 - */ -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. */ diff --git a/include/util/set.h b/include/util/set.h new file mode 100644 index 00000000..41099621 --- /dev/null +++ b/include/util/set.h @@ -0,0 +1,25 @@ +#ifndef UTIL_SET_H +#define UTIL_SET_H + +#include +#include +#include + +size_t push_zeroes_to_end(uint32_t arr[], size_t n); + +/** + * Add `target` to `values` if it doesn't exist + * "set"s should only be modified with set_* functions + * Values MUST be greater than 0 + */ +bool set_add(uint32_t values[], size_t *len, size_t cap, uint32_t target); + +/** + * Remove `target` from `values` if it exists + * "set"s should only be modified with set_* functions + * Values MUST be greater than 0 + */ +bool set_remove(uint32_t values[], size_t *len, size_t cap, uint32_t target); + +#endif + diff --git a/types/seat/wlr_seat_pointer.c b/types/seat/wlr_seat_pointer.c index 5a6cb235..8d6154b0 100644 --- a/types/seat/wlr_seat_pointer.c +++ b/types/seat/wlr_seat_pointer.c @@ -7,7 +7,7 @@ #include #include #include "types/wlr_seat.h" -#include "util/array.h" +#include "util/set.h" static void default_pointer_enter(struct wlr_seat_pointer_grab *grab, struct wlr_surface *surface, double sx, double sy) { diff --git a/types/tablet_v2/wlr_tablet_v2_tool.c b/types/tablet_v2/wlr_tablet_v2_tool.c index a2d7778c..9590cd88 100644 --- a/types/tablet_v2/wlr_tablet_v2_tool.c +++ b/types/tablet_v2/wlr_tablet_v2_tool.c @@ -10,7 +10,7 @@ #include #include #include -#include "util/array.h" +#include "util/set.h" #include "util/time.h" #include "tablet-unstable-v2-protocol.h" diff --git a/types/wlr_keyboard.c b/types/wlr_keyboard.c index 3fe3ba7a..5150af87 100644 --- a/types/wlr_keyboard.c +++ b/types/wlr_keyboard.c @@ -8,7 +8,7 @@ #include #include "interfaces/wlr_input_device.h" #include "types/wlr_keyboard.h" -#include "util/array.h" +#include "util/set.h" #include "util/shm.h" #include "util/time.h" diff --git a/util/array.c b/util/array.c index 9da26127..ec16a7b1 100644 --- a/util/array.c +++ b/util/array.c @@ -2,52 +2,6 @@ #include #include -// https://www.geeksforgeeks.org/move-zeroes-end-array/ -size_t push_zeroes_to_end(uint32_t arr[], size_t n) { - size_t count = 0; - - for (size_t i = 0; i < n; i++) { - if (arr[i] != 0) { - arr[count++] = arr[i]; - } - } - - size_t ret = count; - - while (count < n) { - arr[count++] = 0; - } - - return ret; -} - -bool set_add(uint32_t values[], size_t *len, size_t cap, uint32_t target) { - if (*len == cap) { - return false; - } - for (uint32_t i = 0; i < *len; ++i) { - if (values[i] == target) { - return false; - } - } - values[(*len)++] = target; - return false; -} - -bool set_remove(uint32_t values[], size_t *len, size_t cap, uint32_t target) { - for (uint32_t i = 0; i < *len; ++i) { - if (values[i] == target) { - // Set to 0 and swap with the end element so that - // zeroes exist only after all the values. - size_t last_elem_pos = --(*len); - values[i] = values[last_elem_pos]; - values[last_elem_pos] = 0; - return true; - } - } - return false; -} - void array_remove_at(struct wl_array *arr, size_t offset, size_t size) { assert(arr->size >= offset + size); diff --git a/util/meson.build b/util/meson.build index 34fc2e23..1cd7f65c 100644 --- a/util/meson.build +++ b/util/meson.build @@ -6,6 +6,7 @@ wlr_files += files( 'global.c', 'log.c', 'region.c', + 'set.c', 'shm.c', 'time.c', 'token.c', diff --git a/util/set.c b/util/set.c new file mode 100644 index 00000000..b3aa18ff --- /dev/null +++ b/util/set.c @@ -0,0 +1,47 @@ +#include "util/set.h" + +// https://www.geeksforgeeks.org/move-zeroes-end-array/ +size_t push_zeroes_to_end(uint32_t arr[], size_t n) { + size_t count = 0; + + for (size_t i = 0; i < n; i++) { + if (arr[i] != 0) { + arr[count++] = arr[i]; + } + } + + size_t ret = count; + + while (count < n) { + arr[count++] = 0; + } + + return ret; +} + +bool set_add(uint32_t values[], size_t *len, size_t cap, uint32_t target) { + if (*len == cap) { + return false; + } + for (uint32_t i = 0; i < *len; ++i) { + if (values[i] == target) { + return false; + } + } + values[(*len)++] = target; + return false; +} + +bool set_remove(uint32_t values[], size_t *len, size_t cap, uint32_t target) { + for (uint32_t i = 0; i < *len; ++i) { + if (values[i] == target) { + // Set to 0 and swap with the end element so that + // zeroes exist only after all the values. + size_t last_elem_pos = --(*len); + values[i] = values[last_elem_pos]; + values[last_elem_pos] = 0; + return true; + } + } + return false; +}