From 7333a4602a333c8710ada6f8a16435745aa4a557 Mon Sep 17 00:00:00 2001 From: Kirill Primak Date: Fri, 19 Aug 2022 21:20:43 +0300 Subject: util/set: overhaul --- util/set.c | 46 ++++++++++++---------------------------------- 1 file changed, 12 insertions(+), 34 deletions(-) (limited to 'util') 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; } -- cgit v1.2.3