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

@ -2,52 +2,6 @@
#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) {
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);

View file

@ -6,6 +6,7 @@ wlr_files += files(
'global.c',
'log.c',
'region.c',
'set.c',
'shm.c',
'time.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;
}