aboutsummaryrefslogtreecommitdiff
path: root/src/map.hff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-15 12:22:47 +0200
committerlemon <lsof@mailbox.org>2022-08-15 12:22:47 +0200
commitf906d0b350b0b4ceb747669c9a9845d11bd0e486 (patch)
tree5f09a7b714e6ce93f6094a06e5f736513110fb8d /src/map.hff
parentf802bb99263aaa5be492999babd44cd2fdb1c65f (diff)
self hosted progress
Diffstat (limited to 'src/map.hff')
-rw-r--r--src/map.hff27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/map.hff b/src/map.hff
index d7883dd..f97ea7e 100644
--- a/src/map.hff
+++ b/src/map.hff
@@ -29,7 +29,7 @@ struct Map<K, V, KTraits> {
}
i = (i + 1) & (self.N - 1);
} while i != h;
- assert(#f, "unreachable");
+ assert(#f, "unreachable1");
}
fn _reallockvb(self *Map) void {
@@ -53,16 +53,17 @@ struct Map<K, V, KTraits> {
b = (oldbmp[i/8] & (1 << (i%8))) != 0;
if (b) {
let h u32 = KTraits:hash(k);
- let i = h & (self.N - 1);
+ let j = h & (self.N - 1);
for ;; {
- if self->_iempty(i) {
- self.keys[i] = k;
- self.vals[i] = v;
- self.bitmap[i/8] |= 1 << (i%8);
- } else if KTraits:eq(self.keys[i], k) {
- assert(#f, "unreachable");
+ if self->_iempty(j) {
+ self.keys[j] = k;
+ self.vals[j] = v;
+ self.bitmap[j/8] |= 1 << (j%8);
+ break;
+ } else if KTraits:eq(self.keys[j], k) {
+ assert(#f, "unreachable2");
}
- i = (i + 1) & (self.N - 1);
+ j = (j + 1) & (self.N - 1);
}
}
@@ -87,6 +88,7 @@ struct Map<K, V, KTraits> {
if self->_iempty(i) {
self.bitmap[i/8] |= (1 << (i%8));
++self.count;
+ self.keys[i] = key;
self.vals[i] = {};
return &self.vals[i];
} else if KTraits:eq(self.keys[i], key) {
@@ -94,7 +96,7 @@ struct Map<K, V, KTraits> {
}
i = (i + 1) & (self.N - 1);
} while i != h;
- assert(#f, "unreachable");
+ assert(#f, "unreachable3");
}
@@ -102,4 +104,9 @@ struct Map<K, V, KTraits> {
*self->get_slot(key) = val;
}
+ fn clear(self *Map) void {
+ free(self.keys);
+ *self = {};
+ }
+
}