@@ -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
+ }
0 commit comments