@@ -646,44 +646,6 @@ impl<'self, T:Copy> VectorVector<T> for &'self [&'self [T]] {
646646 }
647647}
648648
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-
687649// FIXME: if issue #586 gets implemented, could have a postcondition
688650// saying the two result lists have the same length -- or, could
689651// return a nominal record with a constraint saying that, instead of
@@ -1119,6 +1081,8 @@ pub trait ImmutableVector<'self, T> {
11191081 fn flat_map < U > ( & self , f: & fn( t: & T ) -> ~[ U ] ) -> ~[ U ] ;
11201082 fn filter_mapped < U : Copy > ( & self , f: & fn( t: & T ) -> Option < U > ) -> ~[ U ] ;
11211083 unsafe fn unsafe_ref( & self , index: uint) -> * T ;
1084+
1085+ fn bsearch( & self , f: & fn( & T ) -> Ordering ) -> Option < uint > ;
11221086}
11231087
11241088/// Extension methods for vectors
@@ -1264,6 +1228,35 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
12641228 let ( ptr, _) : ( * T , uint ) = transmute ( * self ) ;
12651229 ptr. offset ( index)
12661230 }
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+ }
12671260}
12681261
12691262#[ allow( missing_doc) ]
@@ -1293,6 +1286,22 @@ impl<'self,T:Eq> ImmutableEqVector<T> for &'self [T] {
12931286 }
12941287}
12951288
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+
12961305#[ allow( missing_doc) ]
12971306pub trait ImmutableCopyableVector < T > {
12981307 fn filtered( & self , f: & fn( & T ) -> bool ) -> ~[ T ] ;
@@ -2841,47 +2850,47 @@ mod tests {
28412850
28422851 #[ test]
28432852 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 ) ;
28852894 }
28862895
28872896 #[ test]
0 commit comments