aboutsummaryrefslogtreecommitdiff
path: root/util/set.c
diff options
context:
space:
mode:
authorKirill Primak <vyivel@eclair.cafe>2022-08-19 21:20:43 +0300
committerSimon Zeni <simon@bl4ckb0ne.ca>2022-08-29 13:48:42 +0000
commit7333a4602a333c8710ada6f8a16435745aa4a557 (patch)
tree32655243a2122118263ca6b8c26442ce679e08bf /util/set.c
parent20c208d46a140e148da29730a3adbfa9b88de467 (diff)
util/set: overhaul
Diffstat (limited to 'util/set.c')
-rw-r--r--util/set.c46
1 files changed, 12 insertions, 34 deletions
diff --git a/util/set.c b/util/set.c
index b3aa18ff..1366d04f 100644
--- a/util/set.c
+++ b/util/set.c
@@ -1,47 +1,25 @@
#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;
- }
+ssize_t set_add(uint32_t values[], size_t *len, size_t cap, uint32_t target) {
for (uint32_t i = 0; i < *len; ++i) {
if (values[i] == target) {
- return false;
+ return i;
}
}
- values[(*len)++] = target;
- return false;
+ if (*len == cap) {
+ return -1;
+ }
+ values[*len] = target;
+ return (*len)++;
}
-bool set_remove(uint32_t values[], size_t *len, size_t cap, uint32_t target) {
+ssize_t 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;
+ --(*len);
+ values[i] = values[*len];
+ return i;
}
}
- return false;
+ return -1;
}