mod seal {
pub trait SimdElement { }
}
use crate::mask::MaskElement;
#[cfg(feature = "ptr")]
use core::ptr::Thin;
pub(crate) use seal::SimdElement as SealedSimdElement;
pub unsafe trait SimdElement: Copy + SealedSimdElement {
type Mask: MaskElement;
}
macro_rules! impl_simd_element {
{
$($Ty:ty => $Mask:ty),*$(,)?
} => {
$(
impl ::polylane::simd::SealedSimdElement for $Ty { }
unsafe impl ::polylane::simd::SimdElement for $Ty {
type Mask = $Mask;
}
)*
};
}
impl_simd_element! {
u8 => i8,
i8 => i8,
u16 => i16,
i16 => i16,
u32 => i32,
i32 => i32,
u64 => i64,
i64 => i64,
u128 => i128,
i128 => i128,
usize => isize,
isize => isize,
f32 => i32,
f64 => i64,
}
#[cfg(feature = "f16")]
impl_simd_element! { f16 => i16 }
#[cfg(feature = "f128")]
impl_simd_element! { f128 => i128 }
#[cfg(feature = "ptr")]
impl<T: Thin> SealedSimdElement for *const T { }
#[cfg(feature = "ptr")]
unsafe impl<T: Thin> SimdElement for *const T {
type Mask = isize;
}
#[cfg(feature = "ptr")]
impl<T: Thin> SealedSimdElement for *mut T { }
#[cfg(feature = "ptr")]
unsafe impl<T: Thin> SimdElement for *mut T {
type Mask = isize;
}