Browse Source

Make PtrSet match Map

gingerBill 3 years ago
parent
commit
0010e882a7
1 changed files with 12 additions and 8 deletions
  1. 12 8
      src/ptr_set.cpp

+ 12 - 8
src/ptr_set.cpp

@@ -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);
-	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++) {
 	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;
+	}
 }
 }