argmm 0.1.2

Argmin and argmax with SIMD support for u8, u16, i16, i32 and f32
Documentation
pub mod generic;
#[cfg(target_feature = "sse")]
mod simd;
#[cfg(target_feature = "sse")]
mod task;

#[cfg(not(target_feature = "sse"))]
pub use generic::{simple_argmax, simple_argmin};
#[cfg(target_feature = "sse")]
pub use simd::{simd_f32, simd_i32, simd_i16, simd_u16, simd_u8};

pub trait ArgMinMax {
    fn argmin(&self) -> Option<usize>;
    fn argmax(&self) -> Option<usize>;
}

macro_rules! impl_argmm_f32 {
    ($($b:ty),*) => {
        $(impl ArgMinMax for $b {

            fn argmin(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmin(self));
            #[cfg(target_feature = "sse")] return simd_f32::argmin_f32(self);
            }

            fn argmax(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmax(self));
            #[cfg(target_feature = "sse")] return simd_f32::argmax_f32(self);
            }
        })*
    }
}

macro_rules! impl_argmm_i32 {
    ($($b:ty),*) => {
        $(impl ArgMinMax for $b {

            fn argmin(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmin(self));
            #[cfg(target_feature = "sse")] return simd_i32::argmin_i32(self);
            }

            fn argmax(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmax(self));
            #[cfg(target_feature = "sse")] return simd_i32::argmax_i32(self);
            }
        })*
    }
}

macro_rules! impl_argmm_i16 {
    ($($b:ty),*) => {
        $(impl ArgMinMax for $b {

            fn argmin(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmin(self));
            #[cfg(target_feature = "sse")] return simd_i16::argmin_i16(self);
            }

            fn argmax(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmax(self));
            #[cfg(target_feature = "sse")] return simd_i16::argmax_i16(self);
            }
        })*
    }
}

macro_rules! impl_argmm_u16 {
    ($($b:ty),*) => {
        $(impl ArgMinMax for $b {

            fn argmin(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmin(self));
            #[cfg(target_feature = "sse")] return simd_u16::argmin_u16(self);
            }

            fn argmax(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmax(self));
            #[cfg(target_feature = "sse")] return simd_u16::argmax_u16(self);
            }
        })*
    }
}

macro_rules! impl_argmm_u8 {
    ($($b:ty),*) => {
        $(impl ArgMinMax for $b {

            fn argmin(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmin(self));
            #[cfg(target_feature = "sse")] return simd_u8::argmin_u8(self) ;
            }

            fn argmax(&self) -> Option<usize> {
            #[cfg(not(target_feature = "sse"))] return Some(simple_argmax(self));
            #[cfg(target_feature = "sse")] return simd_u8::argmax_u8(self);
            }
        })*
    }
}

impl_argmm_f32!(Vec<f32>, &[f32], [f32]);
impl_argmm_i32!(Vec<i32>, &[i32], [i32]);
impl_argmm_i16!(Vec<i16>, &[i16], [i16]);
impl_argmm_u16!(Vec<u16>, &[u16], [u16]);
impl_argmm_u8!(Vec<u8>, &[u8], [u8]);