Skip to content

Commit 81edd17

Browse files
committed
Check that the size optimisation is not redundant
1 parent 9896b38 commit 81edd17

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/liballoc/slice.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -1384,8 +1384,8 @@ impl<T> [T] {
13841384
let mut indices: Vec<_> =
13851385
$slice.iter().map($f).enumerate().map(|(i, k)| (k, i as $t)).collect();
13861386
// The elements of `indices` are unique, as they are indexed, so any sort will be
1387-
// stable with respect to the original slice. We use `sort_unstable` here because it
1388-
// requires less memory allocation.
1387+
// stable with respect to the original slice. We use `sort_unstable` here because
1388+
// it requires less memory allocation.
13891389
indices.sort_unstable();
13901390
for i in 0..$slice.len() {
13911391
let mut index = indices[i].1;
@@ -1398,10 +1398,15 @@ impl<T> [T] {
13981398
})
13991399
}
14001400

1401+
let sz_u8 = mem::size_of::<(K, u8)>();
1402+
let sz_u16 = mem::size_of::<(K, u16)>();
1403+
let sz_u32 = mem::size_of::<(K, u32)>();
1404+
let sz_usize = mem::size_of::<(K, usize)>();
1405+
14011406
let len = self.len();
1402-
if len <= ( u8::MAX as usize) { return sort_by_key!( u8, self, f) }
1403-
if len <= (u16::MAX as usize) { return sort_by_key!(u16, self, f) }
1404-
if len <= (u32::MAX as usize) { return sort_by_key!(u32, self, f) }
1407+
if sz_u8 < sz_u16 && len <= ( u8::MAX as usize) { return sort_by_key!( u8, self, f) }
1408+
if sz_u16 < sz_u32 && len <= (u16::MAX as usize) { return sort_by_key!(u16, self, f) }
1409+
if sz_u32 < sz_usize && len <= (u32::MAX as usize) { return sort_by_key!(u32, self, f) }
14051410
sort_by_key!(usize, self, f)
14061411
}
14071412

0 commit comments

Comments
 (0)