1use crate::blitsort;
2use std::cmp::Ordering;
3use std::ffi::c_void;
4use std::mem::size_of;
5
6pub trait BlitSort<T> {
7 fn sorted(&mut self);
8}
9
10impl<T: Ord> BlitSort<T> for [T] {
11 fn sorted(&mut self) {
12 unsafe {
13 extern "C" fn cmp<T>(a: *const c_void, b: *const c_void) -> i32
14 where
15 T: Ord,
16 {
17 unsafe {
18 let a: &T = &*(a as *const T);
19 let b: &T = &*(b as *const T);
20 match a.cmp(b) {
21 Ordering::Equal => 0,
22 Ordering::Greater => 1,
23 Ordering::Less => -1,
24 }
25 }
26 }
27 blitsort(
28 self.as_ptr() as *mut c_void,
29 self.len(),
30 size_of::<T>(),
31 Some(cmp::<T>),
32 );
33 }
34 }
35}
36
37#[cfg(test)]
38#[test]
39fn test_sorted() {
40 let mut array1 = [
41 0, 10, 1, 9, 2, 8, 3, 7, 3, 5, 2, 1, 5, 32, 5, 3, 313, 55, 13, 5,
42 ];
43 let mut array2 = array1.clone();
44 array1.sorted();
45 array2.sort();
46 assert_eq!(array1, array2);
47}