Make PtrSet match Map

This commit is contained in:
gingerBill
2021-11-05 12:11:50 +00:00
parent a022f18015
commit 0010e882a7
+12 -8
View File
@@ -17,7 +17,7 @@ struct PtrSetEntry {
template <typename T> template <typename T>
struct PtrSet { struct PtrSet {
Array<PtrSetIndex> hashes; Slice<PtrSetIndex> hashes;
Array<PtrSetEntry<T>> entries; Array<PtrSetEntry<T>> entries;
}; };
@@ -36,7 +36,7 @@ template <typename T>
void ptr_set_init(PtrSet<T> *s, gbAllocator a, isize capacity) { void ptr_set_init(PtrSet<T> *s, gbAllocator a, isize capacity) {
capacity = next_pow2_isize(gb_max(16, 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); array_init(&s->entries, a, 0, capacity);
for (isize i = 0; i < capacity; i++) { for (isize i = 0; i < capacity; i++) {
s->hashes.data[i] = PTR_SET_SENTINEL; 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> template <typename T>
void ptr_set_destroy(PtrSet<T> *s) { void ptr_set_destroy(PtrSet<T> *s) {
array_free(&s->hashes); slice_free(&s->hashes, s->entries.allocator);
array_free(&s->entries); array_free(&s->entries);
} }
@@ -93,12 +93,14 @@ template <typename T>
void ptr_set_rehash(PtrSet<T> *s, isize new_count) { void ptr_set_rehash(PtrSet<T> *s, isize new_count) {
isize i, j; isize i, j;
PtrSet<T> ns = {}; PtrSet<T> ns = {};
ptr_set_init(&ns, s->hashes.allocator); new_count = next_pow2_isize(new_count);
array_resize(&ns.hashes, new_count); ns.hashes = s->hashes;
array_reserve(&ns.entries, s->entries.count); ns.entries.allocator = s->entries.allocator;
slice_resize(&ns.hashes, s->entries.allocator, new_count);
for (i = 0; i < new_count; i++) { for (i = 0; i < new_count; i++) {
ns.hashes.data[i] = PTR_SET_SENTINEL; 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++) { for (i = 0; i < s->entries.count; i++) {
PtrSetEntry<T> *e = &s->entries.data[i]; PtrSetEntry<T> *e = &s->entries.data[i];
PtrSetFindResult fr; PtrSetFindResult fr;
@@ -117,7 +119,7 @@ void ptr_set_rehash(PtrSet<T> *s, isize new_count) {
ptr_set_grow(&ns); ptr_set_grow(&ns);
} }
} }
ptr_set_destroy(s); array_free(&s->entries);
*s = ns; *s = ns;
} }
@@ -208,6 +210,8 @@ void ptr_set_remove(PtrSet<T> *s, T ptr) {
template <typename T> template <typename T>
gb_inline void ptr_set_clear(PtrSet<T> *s) { gb_inline void ptr_set_clear(PtrSet<T> *s) {
array_clear(&s->hashes);
array_clear(&s->entries); array_clear(&s->entries);
for (isize i = 0; i < s->hashes.count; i++) {
s->hashes.data[i] = PTR_SET_SENTINEL;
}
} }