From f906d0b350b0b4ceb747669c9a9845d11bd0e486 Mon Sep 17 00:00:00 2001 From: lemon Date: Mon, 15 Aug 2022 12:22:47 +0200 Subject: self hosted progress --- src/map.hff | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'src/map.hff') 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 { } 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 { 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 { 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 { } i = (i + 1) & (self.N - 1); } while i != h; - assert(#f, "unreachable"); + assert(#f, "unreachable3"); } @@ -102,4 +104,9 @@ struct Map { *self->get_slot(key) = val; } + fn clear(self *Map) void { + free(self.keys); + *self = {}; + } + } -- cgit v1.2.3