summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2021-04-13 11:48:27 +0200
committerTyge Løvset <[email protected]>2021-04-13 11:48:27 +0200
commit35a3d4d14460414ab5596090522edcbb12ee759a (patch)
tree93424d7551d80fffd5126a5ebd87d6a2944b40d6
parenta2b750608e2ee64052c3eda3ba054390ce4950ac (diff)
downloadSTC-modified-35a3d4d14460414ab5596090522edcbb12ee759a.tar.gz
STC-modified-35a3d4d14460414ab5596090522edcbb12ee759a.zip
Reimplemented csmap_X_erase_range().
-rw-r--r--stc/csmap.h18
1 files 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<sz; ++i) CX##_erase(self, arr[i]); \
- c_free((void *) arr); \
- if (it2.ref) CX##_find_it(self, nxt, &it2); \
- return it2; \
} \
\
static CX##_size_t \