blitsort_sys/
sort.rs

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}