| ... | @@ -234,10 +234,13 @@ pub const Tree = struct { | ... | @@ -234,10 +234,13 @@ pub const Tree = struct { |
| 234 | return null; | 234 | return null; |
| 235 | } | 235 | } |
| 236 | | 236 | |
| | 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. |
| 237 | pub fn lookup(tree: *Tree, key: *Node) ?*Node { | 241 | pub fn lookup(tree: *Tree, key: *Node) ?*Node { |
| 238 | var parent: *Node = undefined; | 242 | var parent: ?*Node = undefined; |
| 239 | var is_left: bool = undefined; | 243 | var is_left: bool = undefined; |
| 240 | | | |
| 241 | return doLookup(key, tree, &parent, &is_left); | 244 | return doLookup(key, tree, &parent, &is_left); |
| 242 | } | 245 | } |
| 243 | | 246 | |
| ... | @@ -545,3 +548,47 @@ test "rb" { | ... | @@ -545,3 +548,47 @@ test "rb" { |
| 545 | num = testGetNumber(num.node.next().?); | 548 | num = testGetNumber(num.node.next().?); |
| 546 | } | 549 | } |
| 547 | } | 550 | } |
| | 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 | } |