fix: resolve logic errors when replacing KV with table
This commit is contained in:
parent
6093fa7c4e
commit
3975ee9b02
|
@ -130,32 +130,25 @@ pub fn insert(self: *HashArrayMappedTrie, comptime key: []const u8, value: void)
|
||||||
const prev_bitset = hash(prev_pair.key);
|
const prev_bitset = hash(prev_pair.key);
|
||||||
const prev_mask = @as(u32, 1) << amtIdx(u32, prev_bitset, hash_offset);
|
const prev_mask = @as(u32, 1) << amtIdx(u32, prev_bitset, hash_offset);
|
||||||
|
|
||||||
const table = switch (std.math.order(mask, prev_mask)) {
|
switch (std.math.order(mask, prev_mask)) {
|
||||||
.lt => blk: {
|
.lt, .gt => {
|
||||||
// there are no collisions between the two hash subsets.
|
// there are no collisions between the two hash subsets.
|
||||||
const pairs = try self.allocator.alloc(Node, 2);
|
const pairs = try self.allocator.alloc(Node, 2);
|
||||||
pairs[0] = .{ .kv = .{ .key = key, .value = value } };
|
const map = mask | prev_mask;
|
||||||
pairs[1] = .{ .kv = prev_pair };
|
|
||||||
|
|
||||||
break :blk .{ .table = .{ .map = mask | prev_mask, .base = pairs.ptr } };
|
pairs[@popCount(map & (prev_mask - 1))] = .{ .kv = prev_pair };
|
||||||
},
|
pairs[@popCount(map & (mask - 1))] = .{ .kv = .{ .key = key, .value = value } };
|
||||||
.gt => blk: {
|
|
||||||
// there are no collisions between the two hash subsets.
|
|
||||||
const pairs = try self.allocator.alloc(Node, 2);
|
|
||||||
pairs[0] = .{ .kv = prev_pair };
|
|
||||||
pairs[1] = .{ .kv = .{ .key = key, .value = value } };
|
|
||||||
|
|
||||||
break :blk .{ .table = .{ .map = mask | prev_mask, .base = pairs.ptr } };
|
current.* = .{ .table = .{ .map = map, .base = pairs.ptr } };
|
||||||
|
return;
|
||||||
},
|
},
|
||||||
.eq => blk: {
|
.eq => {
|
||||||
const copied_pair = try self.allocator.alloc(Node, 1);
|
const copied_pair = try self.allocator.alloc(Node, 1);
|
||||||
copied_pair[0] = .{ .kv = prev_pair };
|
copied_pair[0] = .{ .kv = prev_pair };
|
||||||
|
|
||||||
break :blk .{ .table = .{ .map = mask, .base = copied_pair.ptr } };
|
current.* = .{ .table = .{ .map = mask, .base = copied_pair.ptr } };
|
||||||
},
|
},
|
||||||
};
|
}
|
||||||
|
|
||||||
current.* = table;
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue