simd_aligned/
conversion.rs1use crate::traits::Simd;
2
3#[inline]
4pub const fn simd_container_flat_slice<T>(data: &[T], length: usize) -> &[T::Element]
5where
6 T: Simd + Default + Clone,
7{
8 let ptr = data.as_ptr().cast::<T::Element>();
9
10 unsafe { std::slice::from_raw_parts(ptr, length) }
18}
19
20#[inline]
21pub fn simd_container_flat_slice_mut<T>(data: &mut [T], length: usize) -> &mut [T::Element]
22where
23 T: Simd + Default + Clone,
24{
25 let mut_ptr = data.as_mut_ptr().cast::<T::Element>();
26
27 unsafe { std::slice::from_raw_parts_mut(mut_ptr, length) }
29}
30
31#[inline]
44pub const fn packed_as_flat<T>(data: &[T]) -> &[T::Element]
45where
46 T: Simd + Default + Clone,
47{
48 simd_container_flat_slice(data, data.len() * T::LANES)
49}
50
51#[inline]
63pub fn packed_as_flat_mut<T>(data: &mut [T]) -> &mut [T::Element]
64where
65 T: Simd + Default + Clone,
66{
67 simd_container_flat_slice_mut(data, data.len() * T::LANES)
68}
69
70#[cfg(test)]
71mod test {
72 use super::{packed_as_flat, packed_as_flat_mut};
73 use crate::arch::f32x4;
74
75 #[test]
76 fn slice_flattening() {
77 let x_0 = [f32x4::splat(0.0); 0];
78 let x_1 = [f32x4::splat(0.0); 1];
79
80 let mut x_0_m = [f32x4::splat(0.0); 0];
81 let mut x_1_m = [f32x4::splat(0.0); 1];
82
83 let y_0 = packed_as_flat(&x_0);
84 let y_1 = packed_as_flat(&x_1);
85
86 let y_0_m = packed_as_flat_mut(&mut x_0_m);
87 let y_1_m = packed_as_flat_mut(&mut x_1_m);
88
89 assert_eq!(y_0.len(), 0);
90 assert_eq!(y_1.len(), 4);
91 assert_eq!(y_0_m.len(), 0);
92 assert_eq!(y_1_m.len(), 4);
93 }
94}