util/array: unclutter

This commit is contained in:
Kirill Primak 2022-08-19 21:19:30 +03:00 committed by Simon Zeni
parent eee0f5e71f
commit 20c208d46a
8 changed files with 76 additions and 66 deletions

View File

@ -1,27 +1,10 @@
#ifndef UTIL_ARRAY_H #ifndef UTIL_ARRAY_H
#define UTIL_ARRAY_H #define UTIL_ARRAY_H
#include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>
#include <wayland-util.h> #include <wayland-util.h>
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. * Remove a chunk of memory of the specified size at the specified offset.
*/ */

25
include/util/set.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef UTIL_SET_H
#define UTIL_SET_H
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
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

View File

@ -7,7 +7,7 @@
#include <wlr/types/wlr_compositor.h> #include <wlr/types/wlr_compositor.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include "types/wlr_seat.h" #include "types/wlr_seat.h"
#include "util/array.h" #include "util/set.h"
static void default_pointer_enter(struct wlr_seat_pointer_grab *grab, static void default_pointer_enter(struct wlr_seat_pointer_grab *grab,
struct wlr_surface *surface, double sx, double sy) { struct wlr_surface *surface, double sx, double sy) {

View File

@ -10,7 +10,7 @@
#include <wlr/types/wlr_tablet_tool.h> #include <wlr/types/wlr_tablet_tool.h>
#include <wlr/types/wlr_tablet_v2.h> #include <wlr/types/wlr_tablet_v2.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include "util/array.h" #include "util/set.h"
#include "util/time.h" #include "util/time.h"
#include "tablet-unstable-v2-protocol.h" #include "tablet-unstable-v2-protocol.h"

View File

@ -8,7 +8,7 @@
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include "interfaces/wlr_input_device.h" #include "interfaces/wlr_input_device.h"
#include "types/wlr_keyboard.h" #include "types/wlr_keyboard.h"
#include "util/array.h" #include "util/set.h"
#include "util/shm.h" #include "util/shm.h"
#include "util/time.h" #include "util/time.h"

View File

@ -2,52 +2,6 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.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;
}
void array_remove_at(struct wl_array *arr, size_t offset, size_t size) { void array_remove_at(struct wl_array *arr, size_t offset, size_t size) {
assert(arr->size >= offset + size); assert(arr->size >= offset + size);

View File

@ -6,6 +6,7 @@ wlr_files += files(
'global.c', 'global.c',
'log.c', 'log.c',
'region.c', 'region.c',
'set.c',
'shm.c', 'shm.c',
'time.c', 'time.c',
'token.c', 'token.c',

47
util/set.c Normal file
View File

@ -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;
}