diff --git a/src/libcollections/slice.rs b/src/libcollections/slice.rs index 2eef132374e58..1e1ecaf843f9a 100644 --- a/src/libcollections/slice.rs +++ b/src/libcollections/slice.rs @@ -1046,8 +1046,9 @@ impl [T] { /// assert!(match r { Ok(1...4) => true, _ => false, }); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn binary_search(&self, x: &T) -> Result - where T: Ord + pub fn binary_search(&self, x: &Q) -> Result + where T: Borrow, + Q: Ord { core_slice::SliceExt::binary_search(self, x) } @@ -1115,17 +1116,18 @@ impl [T] { /// (1, 2), (2, 3), (4, 5), (5, 8), (3, 13), /// (1, 21), (2, 34), (4, 55)]; /// - /// assert_eq!(s.binary_search_by_key(&13, |&(a,b)| b), Ok(9)); - /// assert_eq!(s.binary_search_by_key(&4, |&(a,b)| b), Err(7)); - /// assert_eq!(s.binary_search_by_key(&100, |&(a,b)| b), Err(13)); - /// let r = s.binary_search_by_key(&1, |&(a,b)| b); + /// assert_eq!(s.binary_search_by_key(&13, |&(a, ref b)| b), Ok(9)); + /// assert_eq!(s.binary_search_by_key(&4, |&(a, ref b)| b), Err(7)); + /// assert_eq!(s.binary_search_by_key(&100, |&(a, ref b)| b), Err(13)); + /// let r = s.binary_search_by_key(&1, |&(a, ref b)| b); /// assert!(match r { Ok(1...4) => true, _ => false, }); /// ``` #[stable(feature = "slice_binary_search_by_key", since = "1.10.0")] #[inline] - pub fn binary_search_by_key<'a, B, F>(&'a self, b: &B, f: F) -> Result - where F: FnMut(&'a T) -> B, - B: Ord + pub fn binary_search_by_key<'a, B, F, Q: ?Sized>(&'a self, b: &Q, f: F) -> Result + where F: FnMut(&'a T) -> &'a B, + B: Borrow + 'a, + Q: Ord { core_slice::SliceExt::binary_search_by_key(self, b, f) } diff --git a/src/libcollections/tests/slice.rs b/src/libcollections/tests/slice.rs index c3e5304fb2b35..3e1d0ba5e63d1 100644 --- a/src/libcollections/tests/slice.rs +++ b/src/libcollections/tests/slice.rs @@ -354,8 +354,8 @@ fn test_binary_search() { assert_eq!([2].binary_search(&5).ok(), None); assert_eq!([2].binary_search(&2).ok(), Some(0)); - assert_eq!([].binary_search(&1).ok(), None); - assert_eq!([].binary_search(&5).ok(), None); + assert_eq!([0;0].binary_search(&1).ok(), None); + assert_eq!([0;0].binary_search(&5).ok(), None); assert!([1, 1, 1, 1, 1].binary_search(&1).ok() != None); assert!([1, 1, 1, 1, 2].binary_search(&1).ok() != None); diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs index 87dfdfe57b65c..fb453640bf26f 100644 --- a/src/libcore/slice/mod.rs +++ b/src/libcore/slice/mod.rs @@ -131,8 +131,8 @@ pub trait SliceExt { #[stable(feature = "slice_binary_search_by_key", since = "1.10.0")] fn binary_search_by_key<'a, B, F, Q: ?Sized>(&'a self, b: &Q, f: F) -> Result - where F: FnMut(&'a Self::Item) -> B, - B: Borrow, + where F: FnMut(&'a Self::Item) -> &'a B, + B: Borrow + 'a, Q: Ord; #[stable(feature = "core", since = "1.6.0")] @@ -612,8 +612,8 @@ impl SliceExt for [T] { #[inline] fn binary_search_by_key<'a, B, F, Q: ?Sized>(&'a self, b: &Q, mut f: F) -> Result - where F: FnMut(&'a Self::Item) -> B, - B: Borrow, + where F: FnMut(&'a Self::Item) -> &'a B, + B: Borrow + 'a, Q: Ord { self.binary_search_by(|k| f(k).borrow().cmp(b)) diff --git a/src/test/run-pass/slice_binary_search.rs b/src/test/run-pass/slice_binary_search.rs index 80b370d58fc53..5c4a4df48b317 100644 --- a/src/test/run-pass/slice_binary_search.rs +++ b/src/test/run-pass/slice_binary_search.rs @@ -24,6 +24,6 @@ fn main() { ]; let key: &str = "def"; - let r = xs.binary_search_by_key(&key, |e| &e.topic); + let r = xs.binary_search_by_key(key, |e| &e.topic); assert_eq!(Ok(1), r.map(|i| i)); }