use aligned_vec::{AVec, ConstAlign};
use alloc::vec::Vec;
pub const SIMD_ALIGN: usize = 64;
pub type AlignedVec<T> = AVec<T, ConstAlign<SIMD_ALIGN>>;
#[inline]
pub fn alloc_aligned<T>(capacity: usize) -> AlignedVec<T> {
AVec::with_capacity(SIMD_ALIGN, capacity)
}
#[inline]
pub fn alloc_aligned_zeroed<T: bytemuck::Zeroable + Clone>(len: usize) -> AlignedVec<T> {
let mut vec = AVec::with_capacity(SIMD_ALIGN, len);
vec.resize(len, T::zeroed());
vec
}
#[inline]
pub fn to_vec<T: Clone>(aligned: AlignedVec<T>) -> Vec<T> {
aligned.to_vec()
}
#[inline]
pub fn from_slice<T: Clone>(slice: &[T]) -> AlignedVec<T> {
let mut vec = AVec::with_capacity(SIMD_ALIGN, slice.len());
vec.extend_from_slice(slice);
vec
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_alignment() {
let vec: AlignedVec<f32> = alloc_aligned(1000);
assert_eq!(vec.as_ptr() as usize % SIMD_ALIGN, 0);
}
#[test]
fn test_zeroed() {
let vec: AlignedVec<f32> = alloc_aligned_zeroed(100);
assert_eq!(vec.len(), 100);
assert!(vec.iter().all(|&x| x == 0.0));
}
#[test]
fn test_from_slice() {
let data = [1.0f32, 2.0, 3.0, 4.0];
let aligned = from_slice(&data);
assert_eq!(aligned.as_ptr() as usize % SIMD_ALIGN, 0);
assert_eq!(&aligned[..], &data[..]);
}
}