From 35a3d4d14460414ab5596090522edcbb12ee759a Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Tue, 13 Apr 2021 11:48:27 +0200 Subject: Reimplemented csmap_X_erase_range(). --- stc/csmap.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/stc/csmap.h b/stc/csmap.h index dcf6d04d..74298dad 100644 --- a/stc/csmap.h +++ b/stc/csmap.h @@ -511,16 +511,16 @@ static struct csmap_rep _csmap_inits = {0, 0, 0, 0}; \ STC_DEF CX##_iter_t \ CX##_erase_range(CX* self, CX##_iter_t it1, CX##_iter_t it2) { \ - CX##_rawkey_t nxt, *arr = NULL; size_t sz=0, cap=0; \ - for (; it1.ref != it2.ref; CX##_next(&it1), ++sz) { \ - if (sz == cap) arr = (CX##_rawkey_t*) c_realloc((void *) arr, sizeof arr[0]*(cap = (sz + 6)*1.5)); \ - arr[sz] = keyToRaw(KEY_REF_##C(it1.ref)); \ + if (!it2.ref) { while (it1.ref) it1 = CX##_erase_at(self, it1); \ + return it1; } \ + CX##_key_t k1 = *KEY_REF_##C(it1.ref), k2 = *KEY_REF_##C(it2.ref); \ + CX##_rawkey_t r1 = keyToRaw(&k1); \ + for (;;) { \ + if (memcmp(&k1, &k2, sizeof k1) == 0) return it1; \ + CX##_next(&it1); k1 = *KEY_REF_##C(it1.ref); \ + CX##_erase(self, r1); \ + CX##_find_it(self, (r1 = keyToRaw(&k1)), &it1); \ } \ - if (it2.ref) nxt = keyToRaw(KEY_REF_##C(it2.ref)); \ - for (size_t i=0; i