about summary refs log tree commit diff
path: root/src/libstd/vec.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstd/vec.rs')
-rw-r--r--src/libstd/vec.rs86
1 files changed, 32 insertions, 54 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs
index 58392774fa0..d31fe0ee434 100644
--- a/src/libstd/vec.rs
+++ b/src/libstd/vec.rs
@@ -1921,7 +1921,7 @@ impl<T:Eq> OwnedEqVector<T> for ~[T] {
     }
 }
 
-fn merge_sort<T>(v: &mut [T], less_eq: |&T, &T| -> bool) {
+fn merge_sort<T>(v: &mut [T], compare: |&T, &T| -> Ordering) {
     // warning: this wildly uses unsafe.
     static INSERTION: uint = 8;
 
@@ -1930,7 +1930,7 @@ fn merge_sort<T>(v: &mut [T], less_eq: |&T, &T| -> bool) {
     // allocate some memory to use as scratch memory, we keep the
     // length 0 so we can keep shallow copies of the contents of `v`
     // without risking the dtors running on an object twice if
-    // `less_eq` fails.
+    // `compare` fails.
     let mut working_space = with_capacity(2 * len);
     // these both are buffers of length `len`.
     let mut buf_dat = working_space.as_mut_ptr();
@@ -1960,7 +1960,8 @@ fn merge_sort<T>(v: &mut [T], less_eq: |&T, &T| -> bool) {
 
                 // start <= j - 1 < len, so .offset(j - 1) is in
                 // bounds.
-                while j > start as int && !less_eq(&*buf_dat.offset(j - 1), &*read_ptr) {
+                while j > start as int &&
+                        compare(&*read_ptr, &*buf_dat.offset(j - 1)) == Less {
                     j -= 1;
                 }
 
@@ -2034,10 +2035,10 @@ fn merge_sort<T>(v: &mut [T], less_eq: |&T, &T| -> bool) {
 
                     // `left < right_start` and `right < right_end`,
                     // so these are valid.
-                    let to_copy = if less_eq(&*left, &*right) {
-                        step(&mut left)
-                    } else {
+                    let to_copy = if compare(&*left, &*right) == Greater {
                         step(&mut right)
+                    } else {
+                        step(&mut left)
                     };
                     ptr::copy_nonoverlapping_memory(out, to_copy, 1);
                     step(&mut out);
@@ -2164,8 +2165,8 @@ pub trait MutableVector<'a, T> {
     /// Reverse the order of elements in a vector, in place
     fn reverse(self);
 
-    /// Sort the vector, in place, using `less_eq` to compare `a <=
-    /// b`.
+    /// Sort the vector, in place, using `compare` to compare
+    /// elements.
     ///
     /// This sort is `O(n log n)` worst-case and stable, but allocates
     /// approximately `2 * n`, where `n` is the length of `self`.
@@ -2174,14 +2175,14 @@ pub trait MutableVector<'a, T> {
     ///
     /// ```rust
     /// let mut v = [5, 4, 1, 3, 2];
-    /// v.sort(|a, b| *a <= *b);
+    /// v.sort(|a, b| a.cmp(b));
     /// assert_eq!(v, [1, 2, 3, 4, 5]);
     ///
     /// // reverse sorting
-    /// v.sort(|a, b| *b <= *a);
+    /// v.sort(|a, b| b.cmp(a));
     /// assert_eq!(v, [5, 4, 3, 2, 1]);
     /// ```
-    fn sort_by(self, less_eq: |&T, &T| -> bool);
+    fn sort_by(self, compare: |&T, &T| -> Ordering);
 
     /**
      * Consumes `src` and moves as many elements as it can into `self`
@@ -2328,12 +2329,8 @@ impl<'a,T> MutableVector<'a, T> for &'a mut [T] {
     }
 
     #[inline]
-<<<<<<< HEAD
-    fn sort(self, less_eq: |&T, &T| -> bool) {
-=======
-    fn sort_by<Sort: SortComparator<T>>(self, less_eq: Sort) {
->>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
-        merge_sort(self, less_eq)
+    fn sort_by(self, compare: |&T, &T| -> Ordering) {
+        merge_sort(self, compare)
     }
 
     #[inline]
@@ -2391,7 +2388,7 @@ impl<'a, T:Clone> MutableCloneableVector<T> for &'a mut [T] {
 
 /// Methods for mutable vectors with orderable elements, such as
 /// in-place sorting.
-pub trait MutableOrdVector<T> {
+pub trait MutableTotalOrdVector<T> {
     /// Sort the vector, in place.
     ///
     /// This is equivalent to `self.sort_by(std::vec::SortForward)`.
@@ -2408,10 +2405,10 @@ pub trait MutableOrdVector<T> {
     /// ```
     fn sort(self);
 }
-impl<'a, T: Ord> MutableOrdVector<T> for &'a mut [T] {
+impl<'a, T: TotalOrd> MutableTotalOrdVector<T> for &'a mut [T] {
     #[inline]
     fn sort(self) {
-        self.sort_by(SortForward)
+        self.sort_by(|a,b| a.cmp(b))
     }
 }
 
@@ -3502,41 +3499,25 @@ mod tests {
         for len in range(4u, 25) {
             for _ in range(0, 100) {
                 let mut v = task_rng().gen_vec::<uint>(len);
-                v.sort(|a,b| a <= b);
-
-<<<<<<< HEAD
-                assert!(v.windows(2).all(|w| w[0] <= w[1]));
-=======
                 let mut v1 = v.clone();
-                let mut v2 = v.clone();
+
                 v.sort();
                 assert!(v.windows(2).all(|w| w[0] <= w[1]));
 
-                v1.sort_by(vec::SortForward);
+                v1.sort_by(|a, b| a.cmp(b));
                 assert!(v1.windows(2).all(|w| w[0] <= w[1]));
 
-                v1.sort_by(vec::SortReverse);
+                v1.sort_by(|a, b| b.cmp(a));
                 assert!(v1.windows(2).all(|w| w[0] >= w[1]));
-
-                v2.sort_by(|a: &uint, b: &uint| a <= b);
-                assert!(v2.windows(2).all(|w| w[0] <= w[1]));
->>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
             }
         }
 
         // shouldn't fail/crash
         let mut v: [uint, .. 0] = [];
-<<<<<<< HEAD
-        v.sort(|a,b| a <= b);
+        v.sort();
 
         let mut v = [0xDEADBEEF];
-        v.sort(|a,b| a <= b);
-=======
-        v.sort_by(SortForward);
-
-        let mut v = [0xDEADBEEF];
-        v.sort_by(SortForward);
->>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
+        v.sort();
         assert_eq!(v, [0xDEADBEEF]);
     }
 
@@ -3559,11 +3540,7 @@ mod tests {
 
                 // only sort on the first element, so an unstable sort
                 // may mix up the counts.
-<<<<<<< HEAD
-                v.sort(|&(a,_), &(b,_)| a <= b);
-=======
-                v.sort_by(|&(a,_): &(uint, uint), &(b,_): &(uint, uint)| a <= b);
->>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
+                v.sort_by(|&(a,_), &(b,_)| a.cmp(&b));
 
                 // this comparison includes the count (the second item
                 // of the tuple), so elements with equal first items
@@ -4398,10 +4375,10 @@ mod bench {
     use extra::test::BenchHarness;
     use iter::range;
     use vec;
-    use vec::{VectorVector, MutableOrdVector};
+    use vec::{VectorVector, MutableTotalOrdVector};
     use option::*;
     use ptr;
-    use rand::{weak_rng, task_rng, Rng};
+    use rand::{weak_rng, Rng};
     use mem;
 
     #[bench]
@@ -4604,33 +4581,34 @@ mod bench {
             })
     }
 
+    #[bench]
     fn sort_random_small(bh: &mut BenchHarness) {
         let mut rng = weak_rng();
         bh.iter(|| {
-            let mut v: ~[f64] = rng.gen_vec(5);
+            let mut v: ~[u64] = rng.gen_vec(5);
             v.sort();
         });
-        bh.bytes = 5 * mem::size_of::<f64>() as u64;
+        bh.bytes = 5 * mem::size_of::<u64>() as u64;
     }
 
     #[bench]
     fn sort_random_medium(bh: &mut BenchHarness) {
         let mut rng = weak_rng();
         bh.iter(|| {
-            let mut v: ~[f64] = rng.gen_vec(100);
+            let mut v: ~[u64] = rng.gen_vec(100);
             v.sort();
         });
-        bh.bytes = 100 * mem::size_of::<f64>() as u64;
+        bh.bytes = 100 * mem::size_of::<u64>() as u64;
     }
 
     #[bench]
     fn sort_random_large(bh: &mut BenchHarness) {
         let mut rng = weak_rng();
         bh.iter(|| {
-            let mut v: ~[f64] = rng.gen_vec(10000);
+            let mut v: ~[u64] = rng.gen_vec(10000);
             v.sort();
         });
-        bh.bytes = 10000 * mem::size_of::<f64>() as u64;
+        bh.bytes = 10000 * mem::size_of::<u64>() as u64;
     }
 
     #[bench]