use crate::bindings;
use crate::swapper::Swapper;
use std::cmp::min;
use std::mem::size_of;

pub struct CLoopSwapper {}
impl Swapper for CLoopSwapper {
    fn swap<T>(a: &mut [T], b: &mut [T]) {
        unsafe {
            bindings::swap_loop(
                a.as_mut_ptr() as *mut i8,
                b.as_mut_ptr() as *mut i8,
                (size_of::<T>() * min(a.len(), b.len())) as bindings::size_t,
            )
        }
    }
}

pub struct CMallocSwapper {}
impl Swapper for CMallocSwapper {
    fn swap<T>(a: &mut [T], b: &mut [T]) {
        unsafe {
            bindings::swap_malloc(
                a.as_mut_ptr() as *mut i8,
                b.as_mut_ptr() as *mut i8,
                (size_of::<T>() * min(a.len(), b.len())) as bindings::size_t,
            )
        }
    }
}

pub struct CAllocaSwapper {}
impl Swapper for CAllocaSwapper {
    fn swap<T>(a: &mut [T], b: &mut [T]) {
        unsafe {
            bindings::swap_alloca(
                a.as_mut_ptr() as *mut i8,
                b.as_mut_ptr() as *mut i8,
                (size_of::<T>() * min(a.len(), b.len())) as bindings::size_t,
            )
        }
    }
}
