aboutsummaryrefslogtreecommitdiff
path: root/util/set.c
diff options
context:
space:
mode:
authorKirill Primak <vyivel@eclair.cafe>2022-08-19 21:19:30 +0300
committerSimon Zeni <simon@bl4ckb0ne.ca>2022-08-29 13:48:42 +0000
commit20c208d46a140e148da29730a3adbfa9b88de467 (patch)
treed4dbb917ec6c7e77692adafc8b87d5e5d3a131f8 /util/set.c
parenteee0f5e71f4e3a6ded27d2d5046a243277c00ab8 (diff)
util/array: unclutter
Diffstat (limited to 'util/set.c')
-rw-r--r--util/set.c47
1 files changed, 47 insertions, 0 deletions
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;
+}