@@ -664,6 +664,41 @@ mod tests {
664664 assert_eq ! ( d. len( ) , 1 ) ;
665665 }
666666
667+ #[ test]
668+ fn test_range_contain ( ) {
669+ let a = Range :: new ( 2 , 6 ) ;
670+ assert ! ( a. contain( & Range :: new( 2 , 3 ) ) ) ;
671+ assert ! ( a. contain( & Range :: new( 3 , 4 ) ) ) ;
672+ assert ! ( a. contain( & Range :: new( 5 , 5 ) ) ) ;
673+ assert ! ( a. contain( & Range :: new( 5 , 6 ) ) ) ;
674+ assert ! ( a. contain( & Range :: new( 6 , 6 ) ) ) ;
675+ assert ! ( !a. contain( & Range :: new( 1 , 1 ) ) ) ;
676+ assert ! ( !a. contain( & Range :: new( 1 , 2 ) ) ) ;
677+ assert ! ( !a. contain( & Range :: new( 1 , 3 ) ) ) ;
678+ assert ! ( !a. contain( & Range :: new( 1 , 7 ) ) ) ;
679+ assert ! ( !a. contain( & Range :: new( 7 , 8 ) ) ) ;
680+ assert ! ( !a. contain( & Range :: new( 6 , 7 ) ) ) ;
681+ assert ! ( !a. contain( & Range :: new( 7 , 8 ) ) ) ;
682+ }
683+
684+ #[ test]
685+ fn test_range_align_to ( ) {
686+ let a = Range :: new ( 2 , 6 ) ;
687+ assert_eq ! ( a. align_to( 0 ) , Some ( Range :: new( 2 , 6 ) ) ) ;
688+ assert_eq ! ( a. align_to( 1 ) , Some ( Range :: new( 2 , 6 ) ) ) ;
689+ assert_eq ! ( a. align_to( 2 ) , Some ( Range :: new( 2 , 6 ) ) ) ;
690+ assert_eq ! ( a. align_to( 4 ) , Some ( Range :: new( 4 , 6 ) ) ) ;
691+ assert_eq ! ( a. align_to( 8 ) , None ) ;
692+ assert_eq ! ( a. align_to( 3 ) , None ) ;
693+
694+ let a = Range :: new ( 0xFFFF_FFFF_FFFF_FFFD , 0xFFFF_FFFF_FFFF_FFFF ) ;
695+ assert_eq ! (
696+ a. align_to( 2 ) ,
697+ Some ( Range :: new( 0xFFFF_FFFF_FFFF_FFFE , 0xFFFF_FFFF_FFFF_FFFF ) )
698+ ) ;
699+ assert_eq ! ( a. align_to( 4 ) , None ) ;
700+ }
701+
667702 #[ test]
668703 fn test_range_ord ( ) {
669704 let a = Range :: new ( 1 , 4 ) ;
@@ -697,4 +732,119 @@ mod tests {
697732 tree. insert ( Range :: new ( 0x100 , 0x200 ) , Some ( 1 ) ) ;
698733 tree. insert ( Range :: new ( 0x200 , 0x2ff ) , None ) ;
699734 }
735+
736+ #[ test]
737+ fn test_tree_get_superset ( ) {
738+ let mut tree = IntervalTree :: < u64 > :: new ( ) ;
739+ tree. insert ( Range :: new ( 0x100 , 0x100 ) , Some ( 1 ) ) ;
740+ tree. insert ( Range :: new ( 0x200 , 0x2ff ) , None ) ;
741+ assert_eq ! (
742+ tree. get_superset( & Range :: new( 0x100 , 0x100 ) ) ,
743+ Some ( ( & Range :: new( 0x100 , 0x100 ) , Some ( & 1 ) ) )
744+ ) ;
745+ assert_eq ! (
746+ tree. get_superset( & Range :: new( 0x200 , 0x200 ) ) ,
747+ Some ( ( & Range :: new( 0x200 , 0x2ff ) , None ) )
748+ ) ;
749+ assert_eq ! (
750+ tree. get_superset( & Range :: new( 0x200 , 0x2ff ) ) ,
751+ Some ( ( & Range :: new( 0x200 , 0x2ff ) , None ) )
752+ ) ;
753+ assert_eq ! (
754+ tree. get_superset( & Range :: new( 0x210 , 0x210 ) ) ,
755+ Some ( ( & Range :: new( 0x200 , 0x2ff ) , None ) )
756+ ) ;
757+ assert_eq ! (
758+ tree. get_superset( & Range :: new( 0x2ff , 0x2ff ) ) ,
759+ Some ( ( & Range :: new( 0x200 , 0x2ff ) , None ) )
760+ ) ;
761+ assert_eq ! ( tree. get_superset( & Range :: new( 0x2ff , 0x300 ) ) , None ) ;
762+ assert_eq ! ( tree. get_superset( & Range :: new( 0x300 , 0x300 ) ) , None ) ;
763+ assert_eq ! ( tree. get_superset( & Range :: new( 0x1ff , 0x300 ) ) , None ) ;
764+ }
765+
766+ #[ test]
767+ fn test_tree_update ( ) {
768+ let mut tree = IntervalTree :: < u64 > :: new ( ) ;
769+ tree. insert ( Range :: new ( 0x100 , 0x100 ) , None ) ;
770+ tree. insert ( Range :: new ( 0x200 , 0x2ff ) , None ) ;
771+
772+ let constraint = Constraint :: new ( 2 ) ;
773+ let key = tree. allocate ( & constraint) ;
774+ assert_eq ! ( key, Some ( Range :: new( 0x200 , 0x201 ) ) ) ;
775+ let old = tree. update ( & Range :: new ( 0x200 , 0x201 ) , 2 ) ;
776+ assert_eq ! ( old, None ) ;
777+ let old = tree. update ( & Range :: new ( 0x200 , 0x201 ) , 3 ) ;
778+ assert_eq ! ( old, Some ( 2 ) ) ;
779+ let old = tree. update ( & Range :: new ( 0x200 , 0x200 ) , 4 ) ;
780+ assert_eq ! ( old, None ) ;
781+ let old = tree. update ( & Range :: new ( 0x200 , 0x203 ) , 5 ) ;
782+ assert_eq ! ( old, None ) ;
783+
784+ tree. delete ( & Range :: new ( 0x200 , 0x201 ) ) ;
785+ let old = tree. update ( & Range :: new ( 0x200 , 0x201 ) , 2 ) ;
786+ assert_eq ! ( old, None ) ;
787+ }
788+
789+ #[ test]
790+ fn test_tree_delete ( ) {
791+ let mut tree = IntervalTree :: < u64 > :: new ( ) ;
792+ assert_eq ! ( tree. get( & Range :: new( 0x101 , 0x101 ) ) , None ) ;
793+ assert ! ( tree. is_empty( ) ) ;
794+ tree. insert ( Range :: new ( 0x100 , 0x100 ) , Some ( 1 ) ) ;
795+ tree. insert ( Range :: new ( 0x200 , 0x2ff ) , None ) ;
796+ assert ! ( !tree. is_empty( ) ) ;
797+ assert_eq ! ( tree. get( & Range :: new( 0x100 , 0x100 ) ) , Some ( Some ( & 1 ) ) ) ;
798+ assert_eq ! ( tree. get( & Range :: new( 0x200 , 0x2ff ) ) , Some ( None ) ) ;
799+ assert_eq ! ( tree. get( & Range :: new( 0x101 , 0x101 ) ) , None ) ;
800+
801+ let old = tree. delete ( & Range :: new ( 0x100 , 0x100 ) ) ;
802+ assert_eq ! ( old, Some ( 1 ) ) ;
803+ let old = tree. delete ( & Range :: new ( 0x200 , 0x2ff ) ) ;
804+ assert_eq ! ( old, None ) ;
805+
806+ assert ! ( tree. is_empty( ) ) ;
807+ assert_eq ! ( tree. get( & Range :: new( 0x100 , 0x100 ) ) , None ) ;
808+ assert_eq ! ( tree. get( & Range :: new( 0x200 , 0x2ff ) ) , None ) ;
809+ }
810+
811+ #[ test]
812+ fn test_allocate_free ( ) {
813+ let mut tree = IntervalTree :: < u64 > :: new ( ) ;
814+ let mut constraint = Constraint :: new ( 1 ) ;
815+
816+ assert_eq ! ( tree. allocate( & constraint) , None ) ;
817+ tree. insert ( Range :: new ( 0x100 , 0x100 ) , None ) ;
818+ tree. insert ( Range :: new ( 0x200 , 0x2ff ) , None ) ;
819+
820+ let key = tree. allocate ( & constraint) ;
821+ assert_eq ! ( key, Some ( Range :: new( 0x100 , 0x100 ) ) ) ;
822+ let old = tree. update ( & Range :: new ( 0x100 , 0x100 ) , 2 ) ;
823+ assert_eq ! ( old, None ) ;
824+ let val = tree. get ( & Range :: new ( 0x100 , 0x100 ) ) ;
825+ assert_eq ! ( val, Some ( Some ( & 2 ) ) ) ;
826+
827+ constraint. min = 0x100 ;
828+ constraint. max = 0x100 ;
829+ assert_eq ! ( tree. allocate( & constraint) , None ) ;
830+
831+ constraint. min = 0x201 ;
832+ constraint. max = 0x300 ;
833+ constraint. align = 0x8 ;
834+ constraint. size = 0x10 ;
835+ assert_eq ! ( tree. allocate( & constraint) , Some ( Range :: new( 0x208 , 0x217 ) ) ) ;
836+
837+ constraint. size = 0x100 ;
838+ assert_eq ! ( tree. allocate( & constraint) , None ) ;
839+
840+ tree. update ( & Range :: new ( 0x208 , 0x217 ) , 0x10 ) ;
841+ let old = tree. free ( & Range :: new ( 0x208 , 0x217 ) ) ;
842+ assert_eq ! ( old, Some ( 0x10 ) ) ;
843+
844+ constraint. min = 0x200 ;
845+ constraint. max = 0x2ff ;
846+ constraint. align = 0x8 ;
847+ constraint. size = 0x100 ;
848+ assert_eq ! ( tree. allocate( & constraint) , Some ( Range :: new( 0x200 , 0x2ff ) ) ) ;
849+ }
700850}
0 commit comments