@@ -646,44 +646,6 @@ impl<'self, T:Copy> VectorVector<T> for &'self [&'self [T]] {
646
646
}
647
647
}
648
648
649
- /**
650
- * Binary search a sorted vector with a comparator function.
651
- *
652
- * The comparator should implement an order consistent with the sort
653
- * order of the underlying vector, returning an order code that indicates
654
- * whether its argument is `Less`, `Equal` or `Greater` the desired target.
655
- *
656
- * Returns the index where the comparator returned `Equal`, or `None` if
657
- * not found.
658
- */
659
- pub fn bsearch < T > ( v: & [ T ] , f: & fn( & T ) -> Ordering ) -> Option <uint> {
660
- let mut base : uint = 0 ;
661
- let mut lim : uint = v. len( ) ;
662
-
663
- while lim != 0 {
664
- let ix = base + ( lim >> 1 ) ;
665
- match f ( & v[ ix] ) {
666
- Equal => return Some ( ix) ,
667
- Less => {
668
- base = ix + 1 ;
669
- lim -= 1 ;
670
- }
671
- Greater => ( )
672
- }
673
- lim >>= 1 ;
674
- }
675
- return None ;
676
- }
677
-
678
- /**
679
- * Binary search a sorted vector for a given element.
680
- *
681
- * Returns the index of the element or None if not found.
682
- */
683
- pub fn bsearch_elem < T : TotalOrd > ( v : & [ T ] , x : & T ) -> Option < uint > {
684
- bsearch ( v, |p| p. cmp ( x) )
685
- }
686
-
687
649
// FIXME: if issue #586 gets implemented, could have a postcondition
688
650
// saying the two result lists have the same length -- or, could
689
651
// return a nominal record with a constraint saying that, instead of
@@ -1119,6 +1081,8 @@ pub trait ImmutableVector<'self, T> {
1119
1081
fn flat_map < U > ( & self , f: & fn( t: & T ) -> ~[ U ] ) -> ~[ U ] ;
1120
1082
fn filter_mapped < U : Copy > ( & self , f: & fn( t: & T ) -> Option < U > ) -> ~[ U ] ;
1121
1083
unsafe fn unsafe_ref( & self , index: uint) -> * T ;
1084
+
1085
+ fn bsearch( & self , f: & fn( & T ) -> Ordering ) -> Option < uint > ;
1122
1086
}
1123
1087
1124
1088
/// Extension methods for vectors
@@ -1264,6 +1228,35 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
1264
1228
let ( ptr, _) : ( * T , uint ) = transmute ( * self ) ;
1265
1229
ptr. offset ( index)
1266
1230
}
1231
+
1232
+ /**
1233
+ * Binary search a sorted vector with a comparator function.
1234
+ *
1235
+ * The comparator should implement an order consistent with the sort
1236
+ * order of the underlying vector, returning an order code that indicates
1237
+ * whether its argument is `Less`, `Equal` or `Greater` the desired target.
1238
+ *
1239
+ * Returns the index where the comparator returned `Equal`, or `None` if
1240
+ * not found.
1241
+ */
1242
+ fn bsearch ( & self , f : & fn ( & T ) -> Ordering ) -> Option < uint > {
1243
+ let mut base : uint = 0 ;
1244
+ let mut lim : uint = self . len ( ) ;
1245
+
1246
+ while lim != 0 {
1247
+ let ix = base + ( lim >> 1 ) ;
1248
+ match f ( & self [ ix] ) {
1249
+ Equal => return Some ( ix) ,
1250
+ Less => {
1251
+ base = ix + 1 ;
1252
+ lim -= 1 ;
1253
+ }
1254
+ Greater => ( )
1255
+ }
1256
+ lim >>= 1 ;
1257
+ }
1258
+ return None ;
1259
+ }
1267
1260
}
1268
1261
1269
1262
#[ allow( missing_doc) ]
@@ -1293,6 +1286,22 @@ impl<'self,T:Eq> ImmutableEqVector<T> for &'self [T] {
1293
1286
}
1294
1287
}
1295
1288
1289
+ #[ allow( missing_doc) ]
1290
+ pub trait ImmutableTotalOrdVector < T : TotalOrd > {
1291
+ fn bsearch_elem( & self , x: & T ) -> Option < uint > ;
1292
+ }
1293
+
1294
+ impl <' self , T : TotalOrd > ImmutableTotalOrdVector < T > for & ' self [ T ] {
1295
+ /**
1296
+ * Binary search a sorted vector for a given element.
1297
+ *
1298
+ * Returns the index of the element or None if not found.
1299
+ */
1300
+ fn bsearch_elem( & self , x: & T ) -> Option < uint > {
1301
+ self . bsearch( |p| p. cmp( x) )
1302
+ }
1303
+ }
1304
+
1296
1305
#[ allow( missing_doc) ]
1297
1306
pub trait ImmutableCopyableVector < T > {
1298
1307
fn filtered( & self , f: & fn( & T ) -> bool ) -> ~[ T ] ;
@@ -2841,47 +2850,47 @@ mod tests {
2841
2850
2842
2851
#[ test]
2843
2852
fn test_bsearch_elem ( ) {
2844
- assert_eq ! ( bsearch_elem ( [ 1 , 2 , 3 , 4 , 5 ] , & 5 ) , Some ( 4 ) ) ;
2845
- assert_eq ! ( bsearch_elem ( [ 1 , 2 , 3 , 4 , 5 ] , & 4 ) , Some ( 3 ) ) ;
2846
- assert_eq ! ( bsearch_elem ( [ 1 , 2 , 3 , 4 , 5 ] , & 3 ) , Some ( 2 ) ) ;
2847
- assert_eq ! ( bsearch_elem ( [ 1 , 2 , 3 , 4 , 5 ] , & 2 ) , Some ( 1 ) ) ;
2848
- assert_eq ! ( bsearch_elem ( [ 1 , 2 , 3 , 4 , 5 ] , & 1 ) , Some ( 0 ) ) ;
2849
-
2850
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 , 8 , 10 ] , & 1 ) , None ) ;
2851
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 , 8 , 10 ] , & 5 ) , None ) ;
2852
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 , 8 , 10 ] , & 4 ) , Some ( 1 ) ) ;
2853
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 , 8 , 10 ] , & 10 ) , Some ( 4 ) ) ;
2854
-
2855
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 , 8 ] , & 1 ) , None ) ;
2856
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 , 8 ] , & 5 ) , None ) ;
2857
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 , 8 ] , & 4 ) , Some ( 1 ) ) ;
2858
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 , 8 ] , & 8 ) , Some ( 3 ) ) ;
2859
-
2860
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 ] , & 1 ) , None ) ;
2861
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 ] , & 5 ) , None ) ;
2862
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 ] , & 4 ) , Some ( 1 ) ) ;
2863
- assert_eq ! ( bsearch_elem ( [ 2 , 4 , 6 ] , & 6 ) , Some ( 2 ) ) ;
2864
-
2865
- assert_eq ! ( bsearch_elem ( [ 2 , 4 ] , & 1 ) , None ) ;
2866
- assert_eq ! ( bsearch_elem ( [ 2 , 4 ] , & 5 ) , None ) ;
2867
- assert_eq ! ( bsearch_elem ( [ 2 , 4 ] , & 2 ) , Some ( 0 ) ) ;
2868
- assert_eq ! ( bsearch_elem ( [ 2 , 4 ] , & 4 ) , Some ( 1 ) ) ;
2869
-
2870
- assert_eq ! ( bsearch_elem ( [ 2 ] , & 1 ) , None ) ;
2871
- assert_eq ! ( bsearch_elem ( [ 2 ] , & 5 ) , None ) ;
2872
- assert_eq ! ( bsearch_elem ( [ 2 ] , & 2 ) , Some ( 0 ) ) ;
2873
-
2874
- assert_eq ! ( bsearch_elem ( [ ] , & 1 ) , None ) ;
2875
- assert_eq ! ( bsearch_elem ( [ ] , & 5 ) , None ) ;
2876
-
2877
- assert ! ( bsearch_elem ( [ 1 , 1 , 1 , 1 , 1 ] , & 1 ) != None ) ;
2878
- assert ! ( bsearch_elem ( [ 1 , 1 , 1 , 1 , 2 ] , & 1 ) != None ) ;
2879
- assert ! ( bsearch_elem ( [ 1 , 1 , 1 , 2 , 2 ] , & 1 ) != None ) ;
2880
- assert ! ( bsearch_elem ( [ 1 , 1 , 2 , 2 , 2 ] , & 1 ) != None ) ;
2881
- assert_eq ! ( bsearch_elem ( [ 1 , 2 , 2 , 2 , 2 ] , & 1 ) , Some ( 0 ) ) ;
2882
-
2883
- assert_eq ! ( bsearch_elem ( [ 1 , 2 , 3 , 4 , 5 ] , & 6 ) , None ) ;
2884
- assert_eq ! ( bsearch_elem ( [ 1 , 2 , 3 , 4 , 5 ] , & 0 ) , None ) ;
2853
+ assert_eq ! ( [ 1 , 2 , 3 , 4 , 5 ] . bsearch_elem ( & 5 ) , Some ( 4 ) ) ;
2854
+ assert_eq ! ( [ 1 , 2 , 3 , 4 , 5 ] . bsearch_elem ( & 4 ) , Some ( 3 ) ) ;
2855
+ assert_eq ! ( [ 1 , 2 , 3 , 4 , 5 ] . bsearch_elem ( & 3 ) , Some ( 2 ) ) ;
2856
+ assert_eq ! ( [ 1 , 2 , 3 , 4 , 5 ] . bsearch_elem ( & 2 ) , Some ( 1 ) ) ;
2857
+ assert_eq ! ( [ 1 , 2 , 3 , 4 , 5 ] . bsearch_elem ( & 1 ) , Some ( 0 ) ) ;
2858
+
2859
+ assert_eq ! ( [ 2 , 4 , 6 , 8 , 10 ] . bsearch_elem ( & 1 ) , None ) ;
2860
+ assert_eq ! ( [ 2 , 4 , 6 , 8 , 10 ] . bsearch_elem ( & 5 ) , None ) ;
2861
+ assert_eq ! ( [ 2 , 4 , 6 , 8 , 10 ] . bsearch_elem ( & 4 ) , Some ( 1 ) ) ;
2862
+ assert_eq ! ( [ 2 , 4 , 6 , 8 , 10 ] . bsearch_elem ( & 10 ) , Some ( 4 ) ) ;
2863
+
2864
+ assert_eq ! ( [ 2 , 4 , 6 , 8 ] . bsearch_elem ( & 1 ) , None ) ;
2865
+ assert_eq ! ( [ 2 , 4 , 6 , 8 ] . bsearch_elem ( & 5 ) , None ) ;
2866
+ assert_eq ! ( [ 2 , 4 , 6 , 8 ] . bsearch_elem ( & 4 ) , Some ( 1 ) ) ;
2867
+ assert_eq ! ( [ 2 , 4 , 6 , 8 ] . bsearch_elem ( & 8 ) , Some ( 3 ) ) ;
2868
+
2869
+ assert_eq ! ( [ 2 , 4 , 6 ] . bsearch_elem ( & 1 ) , None ) ;
2870
+ assert_eq ! ( [ 2 , 4 , 6 ] . bsearch_elem ( & 5 ) , None ) ;
2871
+ assert_eq ! ( [ 2 , 4 , 6 ] . bsearch_elem ( & 4 ) , Some ( 1 ) ) ;
2872
+ assert_eq ! ( [ 2 , 4 , 6 ] . bsearch_elem ( & 6 ) , Some ( 2 ) ) ;
2873
+
2874
+ assert_eq ! ( [ 2 , 4 ] . bsearch_elem ( & 1 ) , None ) ;
2875
+ assert_eq ! ( [ 2 , 4 ] . bsearch_elem ( & 5 ) , None ) ;
2876
+ assert_eq ! ( [ 2 , 4 ] . bsearch_elem ( & 2 ) , Some ( 0 ) ) ;
2877
+ assert_eq ! ( [ 2 , 4 ] . bsearch_elem ( & 4 ) , Some ( 1 ) ) ;
2878
+
2879
+ assert_eq ! ( [ 2 ] . bsearch_elem ( & 1 ) , None ) ;
2880
+ assert_eq ! ( [ 2 ] . bsearch_elem ( & 5 ) , None ) ;
2881
+ assert_eq ! ( [ 2 ] . bsearch_elem ( & 2 ) , Some ( 0 ) ) ;
2882
+
2883
+ assert_eq ! ( [ ] . bsearch_elem ( & 1 ) , None ) ;
2884
+ assert_eq ! ( [ ] . bsearch_elem ( & 5 ) , None ) ;
2885
+
2886
+ assert ! ( [ 1 , 1 , 1 , 1 , 1 ] . bsearch_elem ( & 1 ) != None ) ;
2887
+ assert ! ( [ 1 , 1 , 1 , 1 , 2 ] . bsearch_elem ( & 1 ) != None ) ;
2888
+ assert ! ( [ 1 , 1 , 1 , 2 , 2 ] . bsearch_elem ( & 1 ) != None ) ;
2889
+ assert ! ( [ 1 , 1 , 2 , 2 , 2 ] . bsearch_elem ( & 1 ) != None ) ;
2890
+ assert_eq ! ( [ 1 , 2 , 2 , 2 , 2 ] . bsearch_elem ( & 1 ) , Some ( 0 ) ) ;
2891
+
2892
+ assert_eq ! ( [ 1 , 2 , 3 , 4 , 5 ] . bsearch_elem ( & 6 ) , None ) ;
2893
+ assert_eq ! ( [ 1 , 2 , 3 , 4 , 5 ] . bsearch_elem ( & 0 ) , None ) ;
2885
2894
}
2886
2895
2887
2896
#[ test]
0 commit comments