Skip to content

Commit 57830e4

Browse files
Poetastropheandrewrk
authored andcommitted
Fix public function lookup
Previously it did not work, as lookup did not pass a correct parent type to doLookup. Expected *?*Node, got ?*Node.
1 parent e68fee3 commit 57830e4

File tree

1 file changed

+49
-2
lines changed

1 file changed

+49
-2
lines changed

std/rb.zig

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,10 +234,13 @@ pub const Tree = struct {
234234
return null;
235235
}
236236

237+
/// lookup searches for the value of key, using binary search. It will
238+
/// return a pointer to the node if it is there, otherwise it will return null.
239+
/// Complexity guaranteed O(log n), where n is the number of nodes book-kept
240+
/// by tree.
237241
pub fn lookup(tree: *Tree, key: *Node) ?*Node {
238-
var parent: *Node = undefined;
242+
var parent: ?*Node = undefined;
239243
var is_left: bool = undefined;
240-
241244
return doLookup(key, tree, &parent, &is_left);
242245
}
243246

@@ -545,3 +548,47 @@ test "rb" {
545548
num = testGetNumber(num.node.next().?);
546549
}
547550
}
551+
552+
553+
test "inserting and looking up" {
554+
var tree: Tree = undefined;
555+
tree.init(testCompare);
556+
var number: testNumber = undefined;
557+
number.value = 1000;
558+
_ = tree.insert(&number.node);
559+
var dup: testNumber = undefined;
560+
//Assert that tuples with identical value fields finds the same pointer
561+
dup.value = 1000;
562+
assert(tree.lookup(&dup.node) == &number.node);
563+
//Assert that tuples with identical values do not clobber when inserted.
564+
_ = tree.insert(&dup.node);
565+
assert(tree.lookup(&dup.node) == &number.node);
566+
assert(tree.lookup(&number.node) != &dup.node);
567+
assert(testGetNumber(tree.lookup(&dup.node).?).value == testGetNumber(&dup.node).value);
568+
//Assert that if looking for a non-existing value, return null.
569+
var non_existing_value: testNumber = undefined;
570+
non_existing_value.value = 1234;
571+
assert(tree.lookup(&non_existing_value.node) == null);
572+
}
573+
574+
test "multiple inserts, followed by calling first and last" {
575+
var tree: Tree = undefined;
576+
tree.init(testCompare);
577+
var zeroth: testNumber = undefined;
578+
zeroth.value = 0;
579+
var first: testNumber = undefined;
580+
first.value = 1;
581+
var second: testNumber = undefined;
582+
second.value = 2;
583+
var third: testNumber = undefined;
584+
third.value = 3;
585+
_ = tree.insert(&zeroth.node);
586+
_ = tree.insert(&first.node);
587+
_ = tree.insert(&second.node);
588+
_ = tree.insert(&third.node);
589+
assert(testGetNumber(tree.first().?).value == 0);
590+
assert(testGetNumber(tree.last().?).value == 3);
591+
var lookupNode: testNumber = undefined;
592+
lookupNode.value = 3;
593+
assert(tree.lookup(&lookupNode.node) == &third.node);
594+
}

0 commit comments

Comments
 (0)