use crate::iters::{SIMDIter, SIMDIterator, SIMDObject};
#[allow(unused_imports)] use crate::iters::SIMDAdapter;
use crate::arch::current::vecs::*;
pub trait IntoSIMDIterator {
type Iter : SIMDIterator;
fn into_simd_iter(self, default: <Self::Iter as SIMDObject>::Vector) -> Self::Iter;
}
pub trait IntoSIMDRefIterator<'a> {
type Iter : SIMDIterator;
fn simd_iter(&'a self, default: <Self::Iter as SIMDObject>::Vector) -> Self::Iter;
}
pub trait IntoSIMDRefMutIterator<'a> {
type Iter : SIMDIterator;
fn simd_iter_mut(&'a mut self, default: <Self::Iter as SIMDObject>::Vector) -> Self::Iter;
}
macro_rules! impl_array_intos {
($($el:ty, $vec:ty),*) => {
$(
#[cfg(feature = "std")]
impl IntoSIMDIterator for Vec<$el> {
type Iter = SIMDIter<Self>;
#[inline(always)]
fn into_simd_iter(self, default: $vec) -> Self::Iter {
SIMDIter {
data: self,
position: 0,
default: default,
}
}
}
impl<'a> IntoSIMDRefIterator<'a> for &'a [$el] {
type Iter = SIMDIter<Self>;
#[inline(always)]
fn simd_iter(&'a self, default: $vec) -> Self::Iter {
SIMDIter {
data: self,
position: 0,
default: default,
}
}
}
impl<'a> IntoSIMDRefMutIterator<'a> for &'a mut [$el] {
type Iter = SIMDIter<Self>;
#[inline(always)]
fn simd_iter_mut(&'a mut self, default: $vec) -> Self::Iter {
SIMDIter {
data: self,
position: 0,
default: default,
}
}
}
impl<'a> IntoSIMDRefMutIterator<'a> for [$el] {
type Iter = SIMDIter<&'a mut Self>;
#[inline(always)]
fn simd_iter_mut(&'a mut self, default: $vec) -> Self::Iter {
SIMDIter {
data: self,
position: 0,
default: default,
}
}
}
impl<'a> IntoSIMDRefIterator<'a> for [$el] {
type Iter = SIMDIter<&'a Self>;
#[inline(always)]
fn simd_iter(&'a self, default: $vec) -> Self::Iter {
SIMDIter {
data: self,
position: 0,
default: default,
}
}
}
)*
}
}
impl_array_intos!(u8, u8s,
i8, i8s,
u16, u16s,
i16, i16s,
u32, u32s,
i32, i32s,
f32, f32s,
u64, u64s,
i64, i64s,
f64, f64s);