about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2018-03-18 11:11:17 +0000
committervarkor <github@varkor.com>2018-03-18 12:50:58 +0000
commit81edd1796b463776d111cd4fe48e866dd716dfab (patch)
tree3dae29deb22d6263fd6e9af100c28ad7cba2d3a8
parent9896b38f01c068abfe7170cb9ae2bfadb4aebbc4 (diff)
downloadrust-81edd1796b463776d111cd4fe48e866dd716dfab.tar.gz
rust-81edd1796b463776d111cd4fe48e866dd716dfab.zip
Check that the size optimisation is not redundant
-rw-r--r--src/liballoc/slice.rs15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/liballoc/slice.rs b/src/liballoc/slice.rs
index cd212aa15ba..2b4ce9fe49c 100644
--- a/src/liballoc/slice.rs
+++ b/src/liballoc/slice.rs
@@ -1384,8 +1384,8 @@ impl<T> [T] {
                 let mut indices: Vec<_> =
                     $slice.iter().map($f).enumerate().map(|(i, k)| (k, i as $t)).collect();
                 // The elements of `indices` are unique, as they are indexed, so any sort will be
-                // stable with respect to the original slice. We use `sort_unstable` here because it
-                // requires less memory allocation.
+                // stable with respect to the original slice. We use `sort_unstable` here because
+                // it requires less memory allocation.
                 indices.sort_unstable();
                 for i in 0..$slice.len() {
                     let mut index = indices[i].1;
@@ -1398,10 +1398,15 @@ impl<T> [T] {
             })
         }
 
+        let sz_u8    = mem::size_of::<(K, u8)>();
+        let sz_u16   = mem::size_of::<(K, u16)>();
+        let sz_u32   = mem::size_of::<(K, u32)>();
+        let sz_usize = mem::size_of::<(K, usize)>();
+
         let len = self.len();
-        if len <= ( u8::MAX as usize) { return sort_by_key!( u8, self, f) }
-        if len <= (u16::MAX as usize) { return sort_by_key!(u16, self, f) }
-        if len <= (u32::MAX as usize) { return sort_by_key!(u32, self, f) }
+        if sz_u8  < sz_u16   && len <= ( u8::MAX as usize) { return sort_by_key!( u8, self, f) }
+        if sz_u16 < sz_u32   && len <= (u16::MAX as usize) { return sort_by_key!(u16, self, f) }
+        if sz_u32 < sz_usize && len <= (u32::MAX as usize) { return sort_by_key!(u32, self, f) }
         sort_by_key!(usize, self, f)
     }