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 BTree = struct {
|
||||||
const Self = @This();
|
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 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;
|
const NUM_EDGES: usize = 2 * B;
|
||||||
|
|
||||||
ally: std.mem.Allocator = std.heap.c_allocator,
|
ally: std.mem.Allocator = std.heap.c_allocator,
|
||||||
|
@ -134,6 +139,12 @@ const BTree = struct {
|
||||||
const node = try Node.create(leaf.ally);
|
const node = try Node.create(leaf.ally);
|
||||||
std.mem.copy(?NodeOrLeaf, &node.edges, internal.edges[B..]);
|
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();
|
new = node.as_leaf();
|
||||||
},
|
},
|
||||||
.leaf => {
|
.leaf => {
|
||||||
|
@ -212,7 +223,9 @@ const BTree = struct {
|
||||||
leaf = child.as_leaf();
|
leaf = child.as_leaf();
|
||||||
// TODO: incredibly hacky I think..
|
// TODO: incredibly hacky I think..
|
||||||
// gotta figure out WHERE this would even happen..
|
// 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;
|
continue;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue