correctly reparent edges when splitting internal node
This commit is contained in:
parent
c8864b7e02
commit
b190719970
17
src/main.zig
17
src/main.zig
|
@ -3,8 +3,13 @@ const std = @import("std");
|
|||
const BTree = struct {
|
||||
const Self = @This();
|
||||
|
||||
const B: usize = 3;
|
||||
const B: usize = 4;
|
||||
// guaranteed to be odd, so can't insert into the middle of a full node
|
||||
// which would complicate splitting
|
||||
const CAPACITY: usize = 2 * B - 1;
|
||||
const MIN_AFTER_SPLIT: usize = B - 1;
|
||||
const E_LEFT_OF_CENTER: usize = B - 1;
|
||||
const E_RIGHT_OF_CENTER: usize = B;
|
||||
const NUM_EDGES: usize = 2 * B;
|
||||
|
||||
ally: std.mem.Allocator = std.heap.c_allocator,
|
||||
|
@ -134,6 +139,12 @@ const BTree = struct {
|
|||
const node = try Node.create(leaf.ally);
|
||||
std.mem.copy(?NodeOrLeaf, &node.edges, internal.edges[B..]);
|
||||
|
||||
for (node.edges, 0..) |edge, i| {
|
||||
if (edge) |edge_node| {
|
||||
edge_node.as_leaf().parent = .{ .parent = node, .idx = @intCast(u16, i) };
|
||||
}
|
||||
}
|
||||
|
||||
new = node.as_leaf();
|
||||
},
|
||||
.leaf => {
|
||||
|
@ -212,7 +223,9 @@ const BTree = struct {
|
|||
leaf = child.as_leaf();
|
||||
// TODO: incredibly hacky I think..
|
||||
// gotta figure out WHERE this would even happen..
|
||||
leaf.parent = .{ .parent = internal, .idx = edge.idx };
|
||||
// leaf.parent = .{ .parent = internal, .idx = edge.idx };
|
||||
// it happened when splitting nodes, and not reparenting
|
||||
// the split-off edges :|
|
||||
continue;
|
||||
}
|
||||
},
|
||||
|
|
Loading…
Reference in a new issue