aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-11-05 12:11:50 +0000
committergingerBill <bill@gingerbill.org>2021-11-05 12:11:50 +0000
commit0010e882a771fc834ea7902786f4b26e8860915c (patch)
tree2accc9fd2ac9607ee10cd057c7d5c973e565cc88 /src
parenta022f18015596d02c15e76eef582cd39c4c02fe6 (diff)
Make PtrSet match Map
Diffstat (limited to 'src')
-rw-r--r--src/ptr_set.cpp20
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;
+ }
}