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