authorgravatar for christoffer@irvall.comChristoffer Rasmussen <christoffer@irvall.com> 2019-07-31 15:17:09+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-02 21:48:30-07:00
log57830e43ee79dd0ceafc96fdad6c52e73edf1420
treeab53641f3c406a811bec7f47aa7c88ae31d646af
parente68fee39847712f9316628e6efe8daa8fc13a5a5

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 files changed, 49 insertions(+), 2 deletions(-)

std/rb.zig+49-2
......@@ -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
553test "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
574test "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}