use crate::traits::Simd;
#[inline]
pub const fn simd_container_flat_slice<T>(data: &[T], length: usize) -> &[T::Element]
where
T: Simd + Default + Clone,
{
let ptr = data.as_ptr().cast::<T::Element>();
unsafe { std::slice::from_raw_parts(ptr, length) }
}
#[inline]
pub fn simd_container_flat_slice_mut<T>(data: &mut [T], length: usize) -> &mut [T::Element]
where
T: Simd + Default + Clone,
{
let mut_ptr = data.as_mut_ptr().cast::<T::Element>();
unsafe { std::slice::from_raw_parts_mut(mut_ptr, length) }
}
#[inline]
pub const fn packed_as_flat<T>(data: &[T]) -> &[T::Element]
where
T: Simd + Default + Clone,
{
simd_container_flat_slice(data, data.len() * T::LANES)
}
#[inline]
pub fn packed_as_flat_mut<T>(data: &mut [T]) -> &mut [T::Element]
where
T: Simd + Default + Clone,
{
simd_container_flat_slice_mut(data, data.len() * T::LANES)
}
#[cfg(test)]
mod test {
use super::{packed_as_flat, packed_as_flat_mut};
use crate::arch::f32x4;
#[test]
fn slice_flattening() {
let x_0 = [f32x4::splat(0.0); 0];
let x_1 = [f32x4::splat(0.0); 1];
let mut x_0_m = [f32x4::splat(0.0); 0];
let mut x_1_m = [f32x4::splat(0.0); 1];
let y_0 = packed_as_flat(&x_0);
let y_1 = packed_as_flat(&x_1);
let y_0_m = packed_as_flat_mut(&mut x_0_m);
let y_1_m = packed_as_flat_mut(&mut x_1_m);
assert_eq!(y_0.len(), 0);
assert_eq!(y_1.len(), 4);
assert_eq!(y_0_m.len(), 0);
assert_eq!(y_1_m.len(), 4);
}
}