pub trait Alignment: crate::private::Sealed + Send + Sync + 'static + Copy + Clone {
const ALIGNMENT: Option<usize>;
const IS_ALIGNED: bool;
const ALIGN_BYTES: usize;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Aligned<const A: usize>;
impl<const A: usize> Aligned<A> {
const _CHECK_POWER_OF_TWO: () = {
assert!(
A.is_power_of_two(),
"Alignment boundary must be a power of two"
);
};
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Unaligned;
impl<const A: usize> Alignment for Aligned<A> {
const ALIGNMENT: Option<usize> = {
let _ = Self::_CHECK_POWER_OF_TWO;
Some(A)
};
const IS_ALIGNED: bool = true;
const ALIGN_BYTES: usize = A;
}
impl Alignment for Unaligned {
const ALIGNMENT: Option<usize> = None;
const IS_ALIGNED: bool = false;
const ALIGN_BYTES: usize = 0;
}
impl<const A: usize> crate::private::Sealed for Aligned<A> {}
impl crate::private::Sealed for Unaligned {}
#[inline(always)]
pub fn is_aligned_for_arch<Arch: crate::arch::SimdArch, Align: Alignment>() -> bool {
if !Align::IS_ALIGNED {
return false;
}
let req_align = Arch::REGISTER_WIDTH_BITS as usize / 8;
Align::ALIGN_BYTES >= req_align
}