diff options
| author | 2022-08-15 12:22:47 +0200 | |
|---|---|---|
| committer | 2022-08-15 12:22:47 +0200 | |
| commit | f906d0b350b0b4ceb747669c9a9845d11bd0e486 (patch) | |
| tree | 5f09a7b714e6ce93f6094a06e5f736513110fb8d /src/map.hff | |
| parent | f802bb99263aaa5be492999babd44cd2fdb1c65f (diff) | |
self hosted progress
Diffstat (limited to 'src/map.hff')
| -rw-r--r-- | src/map.hff | 27 |
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 = {}; + } + } |