use std::num::Wrapping;
use num_traits;
pub trait SimdElement {
type SimdMaskType: SimdMask;
}
pub trait SimdMask: num_traits::sign::Unsigned + num_traits::bounds::Bounded + num_traits::cast::FromPrimitive {
#[inline]
fn from_bool(b: bool) -> Self {
Self::from_u8(b as _).unwrap()
}
}
macro_rules! impl_simd_mask {
($T:ty) => {
impl SimdMask for $T {}
}
}
macro_rules! impl_simd_element {
($T:ty, $M:ty) => {
impl SimdElement for $T {
type SimdMaskType = $M;
}
}
}
impl_simd_mask!{u8}
impl_simd_mask!{u16}
impl_simd_mask!{u32}
impl_simd_mask!{u64}
impl<T: SimdMask> SimdMask for Wrapping<T> where Wrapping<T>: num_traits::sign::Unsigned {}
impl_simd_element!{i8, u8}
impl_simd_element!{i16, u16}
impl_simd_element!{i32, u32}
impl_simd_element!{i64, u64}
impl_simd_element!{u8, u8}
impl_simd_element!{u16, u16}
impl_simd_element!{u32, u32}
impl_simd_element!{u64, u64}
impl_simd_element!{f32, u32}
impl_simd_element!{f64, u64}
impl<T: SimdElement> SimdElement for Wrapping<T> {
type SimdMaskType = T::SimdMaskType; }