mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Make PtrSet match Map
This commit is contained in:
+12
-8
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user