changes hopefully nothing bad
This commit is contained in:
parent
a627d4b1f7
commit
4335f77577
52
src/main.zig
52
src/main.zig
|
@ -340,21 +340,6 @@ const BTree = struct {
|
||||||
self.ally.destroy(self);
|
self.ally.destroy(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_value(self: *Leaf, value: u32) void {
|
|
||||||
std.debug.assert(self.len < CAPACITY);
|
|
||||||
var tmp = value;
|
|
||||||
for (self.get_values()) |*val| {
|
|
||||||
if (val.* < value) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const t = val.*;
|
|
||||||
val.* = tmp;
|
|
||||||
tmp = t;
|
|
||||||
}
|
|
||||||
self.values[self.len] = tmp;
|
|
||||||
self.len = self.len + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const SplitResult = struct {
|
const SplitResult = struct {
|
||||||
// attached, old node that may be modified
|
// attached, old node that may be modified
|
||||||
left: *Leaf,
|
left: *Leaf,
|
||||||
|
@ -372,10 +357,13 @@ const BTree = struct {
|
||||||
if (child.left.get_values()[0] < middle) {
|
if (child.left.get_values()[0] < middle) {
|
||||||
// the left node is already attached to the tree in the correct place
|
// the left node is already attached to the tree in the correct place
|
||||||
|
|
||||||
|
// check if the rightmost value of the right child is smaller than the parent middle
|
||||||
if (child.right.get_values()[child.right.len - 1] < middle) {
|
if (child.right.get_values()[child.right.len - 1] < middle) {
|
||||||
@ptrCast(*Node, parent.left).insert_node(NodeOrLeaf.from_leaf(child.right));
|
@ptrCast(*Node, parent.left).insert_node(NodeOrLeaf.from_leaf(child.right));
|
||||||
} else {
|
} else if (child.right.get_values()[0] > middle) {
|
||||||
@ptrCast(*Node, parent.right).insert_node(NodeOrLeaf.from_leaf(child.right));
|
@ptrCast(*Node, parent.right).insert_node(NodeOrLeaf.from_leaf(child.right));
|
||||||
|
} else {
|
||||||
|
std.debug.print("AAAAAAAAAAA something bad", .{});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if the child left component is in the parent right, so must the child right
|
// if the child left component is in the parent right, so must the child right
|
||||||
|
@ -419,8 +407,8 @@ const BTree = struct {
|
||||||
const leaf = self;
|
const leaf = self;
|
||||||
|
|
||||||
if (leaf.len < CAPACITY) {
|
if (leaf.len < CAPACITY) {
|
||||||
std.debug.print("pushing value {} into leaf ", .{value});
|
std.debug.print("pushing value {} into ", .{value});
|
||||||
self.dbg();
|
NodeOrLeaf.from_leaf(self).dbg();
|
||||||
std.debug.print("\n", .{});
|
std.debug.print("\n", .{});
|
||||||
|
|
||||||
NodeOrLeaf.from_leaf(leaf).push_value(value);
|
NodeOrLeaf.from_leaf(leaf).push_value(value);
|
||||||
|
@ -428,7 +416,7 @@ const BTree = struct {
|
||||||
std.debug.print("splitting node ", .{});
|
std.debug.print("splitting node ", .{});
|
||||||
self.dbg();
|
self.dbg();
|
||||||
const split = try leaf.split_at(value);
|
const split = try leaf.split_at(value);
|
||||||
std.debug.print("into [", .{});
|
std.debug.print(" into [ ", .{});
|
||||||
split.left.dbg();
|
split.left.dbg();
|
||||||
std.debug.print(", {}, ", .{split.middle});
|
std.debug.print(", {}, ", .{split.middle});
|
||||||
split.right.dbg();
|
split.right.dbg();
|
||||||
|
@ -438,13 +426,13 @@ const BTree = struct {
|
||||||
// parent can only throw split if it has no parent, so we just pass it back along to the top?
|
// parent can only throw split if it has no parent, so we just pass it back along to the top?
|
||||||
const result = try parent.parent.as_leaf().insert_value(split.middle);
|
const result = try parent.parent.as_leaf().insert_value(split.middle);
|
||||||
|
|
||||||
if (result) |for_root| {
|
if (result) |parent_split| {
|
||||||
std.debug.print("double split\n", .{});
|
std.debug.print("double split\n", .{});
|
||||||
|
|
||||||
return SplitResult.concat(for_root, split);
|
return SplitResult.concat(parent_split, split);
|
||||||
}
|
} else {
|
||||||
|
|
||||||
parent.parent.insert_node(NodeOrLeaf.from_leaf(split.right));
|
parent.parent.insert_node(NodeOrLeaf.from_leaf(split.right));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return split;
|
return split;
|
||||||
}
|
}
|
||||||
|
@ -553,6 +541,24 @@ test "btree insert" {
|
||||||
tree.dbg();
|
tree.dbg();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "btree rand insert" {
|
||||||
|
std.debug.print("random insertions\n", .{});
|
||||||
|
|
||||||
|
var tree = BTree.create(std.testing.allocator);
|
||||||
|
defer tree.destroy();
|
||||||
|
|
||||||
|
var rng = std.rand.DefaultPrng.init(0);
|
||||||
|
|
||||||
|
for (0..100) |_| {
|
||||||
|
// const i = rng.random().intRangeAtMost(u32, 0, 512);
|
||||||
|
const i = rng.random().int(u32);
|
||||||
|
tree.insert(i) catch {
|
||||||
|
std.debug.print("{} already present - ignoring\n", .{i});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
tree.dbg();
|
||||||
|
}
|
||||||
|
|
||||||
test "btree new" {
|
test "btree new" {
|
||||||
std.debug.print("testing insertion\n", .{});
|
std.debug.print("testing insertion\n", .{});
|
||||||
var tree = BTree.create(std.testing.allocator);
|
var tree = BTree.create(std.testing.allocator);
|
||||||
|
|
Loading…
Reference in a new issue