Skip to content

Commit faa8f8f

Browse files
committed
Convert vec::{bsearch, bsearch_elem} to methods.
1 parent 562dea1 commit faa8f8f

File tree

4 files changed

+95
-86
lines changed

4 files changed

+95
-86
lines changed

src/etc/unicode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,9 @@ def emit_bsearch_range_table(f):
124124
f.write("""
125125
fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
126126
use cmp::{Equal, Less, Greater};
127-
use vec::bsearch;
127+
use vec::ImmutableVector;
128128
use option::None;
129-
(do bsearch(r) |&(lo,hi)| {
129+
(do r.bsearch |&(lo,hi)| {
130130
if lo <= c && c <= hi { Equal }
131131
else if hi < c { Less }
132132
else { Greater }

src/libstd/prelude.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ pub use tuple::{ImmutableTuple2, ImmutableTuple3, ImmutableTuple4, ImmutableTupl
7373
pub use tuple::{ImmutableTuple6, ImmutableTuple7, ImmutableTuple8, ImmutableTuple9};
7474
pub use tuple::{ImmutableTuple10, ImmutableTuple11, ImmutableTuple12};
7575
pub use vec::{VectorVector, CopyableVector, ImmutableVector};
76-
pub use vec::{ImmutableEqVector, ImmutableCopyableVector};
76+
pub use vec::{ImmutableEqVector, ImmutableTotalOrdVector, ImmutableCopyableVector};
7777
pub use vec::{OwnedVector, OwnedCopyableVector, MutableVector};
7878
pub use io::{Reader, ReaderUtil, Writer, WriterUtil};
7979

src/libstd/unicode.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ pub mod general_category {
1616

1717
fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
1818
use cmp::{Equal, Less, Greater};
19-
use vec::bsearch;
19+
use vec::ImmutableVector;
2020
use option::None;
21-
(do bsearch(r) |&(lo,hi)| {
21+
(do r.bsearch |&(lo,hi)| {
2222
if lo <= c && c <= hi { Equal }
2323
else if hi < c { Less }
2424
else { Greater }
@@ -1451,9 +1451,9 @@ pub mod derived_property {
14511451

14521452
fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
14531453
use cmp::{Equal, Less, Greater};
1454-
use vec::bsearch;
1454+
use vec::ImmutableVector;
14551455
use option::None;
1456-
(do bsearch(r) |&(lo,hi)| {
1456+
(do r.bsearch |&(lo,hi)| {
14571457
if lo <= c && c <= hi { Equal }
14581458
else if hi < c { Less }
14591459
else { Greater }

src/libstd/vec.rs

Lines changed: 88 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
12971306
pub 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

Comments
 (0)