diff options
author | Kirill Primak <vyivel@eclair.cafe> | 2022-08-19 21:20:43 +0300 |
---|---|---|
committer | Simon Zeni <simon@bl4ckb0ne.ca> | 2022-08-29 13:48:42 +0000 |
commit | 7333a4602a333c8710ada6f8a16435745aa4a557 (patch) | |
tree | 32655243a2122118263ca6b8c26442ce679e08bf /util/set.c | |
parent | 20c208d46a140e148da29730a3adbfa9b88de467 (diff) |
util/set: overhaul
Diffstat (limited to 'util/set.c')
-rw-r--r-- | util/set.c | 46 |
1 files changed, 12 insertions, 34 deletions
@@ -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; } |