use core::num;
#[derive(Copy, Clone, PartialEq, Eq)]
#[repr(transparent)]
pub struct Alignment(num::NonZeroUsize);
impl Alignment {
#[inline(always)]
pub const fn new(alignment: usize) -> Self {
assert!(alignment != 0, "Alignment cannot be zero");
assert!(alignment.is_power_of_two());
Self(unsafe {
num::NonZeroUsize::new_unchecked(alignment)
})
}
#[inline(always)]
pub const fn try_new(alignment: usize) -> Option<Self> {
match num::NonZeroUsize::new(alignment) {
Some(value) if value.get().is_power_of_two() => Some(Self(value)),
_ => None,
}
}
#[inline(always)]
pub const fn next(&self, size: usize) -> usize {
let alignment = self.0.get() - 1;
size.saturating_add(alignment) & !alignment
}
#[inline(always)]
pub const fn prev(&self, size: usize) -> usize {
let alignment = self.0.get() - 1;
size & !alignment
}
#[inline(always)]
pub const fn into_raw(&self) -> usize {
self.0.get()
}
}