diff options
| author | gingerBill <bill@gingerbill.org> | 2021-11-05 12:11:50 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-11-05 12:11:50 +0000 |
| commit | 0010e882a771fc834ea7902786f4b26e8860915c (patch) | |
| tree | 2accc9fd2ac9607ee10cd057c7d5c973e565cc88 /src/ptr_set.cpp | |
| parent | a022f18015596d02c15e76eef582cd39c4c02fe6 (diff) | |
Make PtrSet match Map
Diffstat (limited to 'src/ptr_set.cpp')
| -rw-r--r-- | src/ptr_set.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/ptr_set.cpp b/src/ptr_set.cpp index 96372fa86..9a9f6d252 100644 --- a/src/ptr_set.cpp +++ b/src/ptr_set.cpp @@ -17,7 +17,7 @@ struct PtrSetEntry { template <typename T> struct PtrSet { - Array<PtrSetIndex> hashes; + Slice<PtrSetIndex> hashes; Array<PtrSetEntry<T>> entries; }; @@ -36,7 +36,7 @@ template <typename T> void ptr_set_init(PtrSet<T> *s, gbAllocator a, isize capacity) { capacity = next_pow2_isize(gb_max(16, capacity)); - array_init(&s->hashes, a, capacity); + slice_init(&s->hashes, a, capacity); array_init(&s->entries, a, 0, capacity); for (isize i = 0; i < capacity; i++) { s->hashes.data[i] = PTR_SET_SENTINEL; @@ -45,7 +45,7 @@ void ptr_set_init(PtrSet<T> *s, gbAllocator a, isize capacity) { template <typename T> void ptr_set_destroy(PtrSet<T> *s) { - array_free(&s->hashes); + slice_free(&s->hashes, s->entries.allocator); array_free(&s->entries); } @@ -93,12 +93,14 @@ template <typename T> void ptr_set_rehash(PtrSet<T> *s, isize new_count) { isize i, j; PtrSet<T> ns = {}; - ptr_set_init(&ns, s->hashes.allocator); - array_resize(&ns.hashes, new_count); - array_reserve(&ns.entries, s->entries.count); + new_count = next_pow2_isize(new_count); + ns.hashes = s->hashes; + ns.entries.allocator = s->entries.allocator; + slice_resize(&ns.hashes, s->entries.allocator, new_count); for (i = 0; i < new_count; i++) { ns.hashes.data[i] = PTR_SET_SENTINEL; } + array_reserve(&ns.entries, ARRAY_GROW_FORMULA(s->entries.count)); for (i = 0; i < s->entries.count; i++) { PtrSetEntry<T> *e = &s->entries.data[i]; PtrSetFindResult fr; @@ -117,7 +119,7 @@ void ptr_set_rehash(PtrSet<T> *s, isize new_count) { ptr_set_grow(&ns); } } - ptr_set_destroy(s); + array_free(&s->entries); *s = ns; } @@ -208,6 +210,8 @@ void ptr_set_remove(PtrSet<T> *s, T ptr) { template <typename T> gb_inline void ptr_set_clear(PtrSet<T> *s) { - array_clear(&s->hashes); array_clear(&s->entries); + for (isize i = 0; i < s->hashes.count; i++) { + s->hashes.data[i] = PTR_SET_SENTINEL; + } } |