|
@@ -50,7 +50,7 @@ namespace Invercargill.DataStructures {
|
|
|
private void double_buckets() {
|
|
private void double_buckets() {
|
|
|
n_buckets *= 2;
|
|
n_buckets *= 2;
|
|
|
var old_buckets = buckets;
|
|
var old_buckets = buckets;
|
|
|
- var buckets = new HashSetItem<T>*[n_buckets];
|
|
|
|
|
|
|
+ buckets = new HashSetItem<T>*[n_buckets];
|
|
|
n_collissions = 0;
|
|
n_collissions = 0;
|
|
|
|
|
|
|
|
for(var i = 0; i < old_buckets.length; i++) {
|
|
for(var i = 0; i < old_buckets.length; i++) {
|
|
@@ -59,7 +59,7 @@ namespace Invercargill.DataStructures {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- var bucket_index = bucket->hash % n_buckets;;
|
|
|
|
|
|
|
+ var bucket_index = bucket->hash % n_buckets;
|
|
|
while(buckets[bucket_index] != null) {
|
|
while(buckets[bucket_index] != null) {
|
|
|
bucket_index++;
|
|
bucket_index++;
|
|
|
n_collissions++;
|
|
n_collissions++;
|
|
@@ -68,7 +68,6 @@ namespace Invercargill.DataStructures {
|
|
|
|
|
|
|
|
buckets[bucket_index] = bucket;
|
|
buckets[bucket_index] = bucket;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private uint bucket_for(T item) {
|
|
private uint bucket_for(T item) {
|
|
@@ -108,15 +107,17 @@ namespace Invercargill.DataStructures {
|
|
|
|
|
|
|
|
var bucket_hash = hash_func(item);
|
|
var bucket_hash = hash_func(item);
|
|
|
var bucket_index = bucket_hash % n_buckets;
|
|
var bucket_index = bucket_hash % n_buckets;
|
|
|
- while(buckets[bucket_index] != null && buckets[bucket_index] != tombstone) {
|
|
|
|
|
- if(equal_func(buckets[bucket_index]->item, item)) {
|
|
|
|
|
|
|
+ var bucket = buckets[bucket_index];
|
|
|
|
|
+ while(bucket != null && bucket != tombstone) {
|
|
|
|
|
+ if(bucket->hash == bucket_hash && equal_func(bucket->item, item)) {
|
|
|
if(overwrite)
|
|
if(overwrite)
|
|
|
- buckets[bucket_index]->item = (owned)item;
|
|
|
|
|
|
|
+ bucket->item = (owned)item;
|
|
|
return overwrite;
|
|
return overwrite;
|
|
|
}
|
|
}
|
|
|
bucket_index++;
|
|
bucket_index++;
|
|
|
n_collissions++;
|
|
n_collissions++;
|
|
|
ensure_room_for_bucket(bucket_index);
|
|
ensure_room_for_bucket(bucket_index);
|
|
|
|
|
+ bucket = buckets[bucket_index];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
HashSetItem<T>* new_bucket = new HashSetItem<T>();
|
|
HashSetItem<T>* new_bucket = new HashSetItem<T>();
|