use core::num::{NonZeroU8, NonZeroUsize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct PageSize(NonZeroU8);
impl PageSize {
pub const fn from_log2(shift: u8) -> Self {
assert!(shift > 0 && (shift as u32) < usize::BITS);
Self(unsafe { NonZeroU8::new_unchecked(shift) })
}
pub const fn bytes(&self) -> usize {
1usize << self.0.get()
}
#[inline]
pub const fn log2(self) -> u8 {
self.0.get()
}
#[inline]
pub const fn total_bytes(self, count: NonZeroUsize) -> Option<usize> {
self.bytes().checked_mul(count.get())
}
#[inline]
pub const fn is_aligned(self, addr: usize) -> bool {
addr & (self.bytes() - 1) == 0
}
#[inline]
pub const fn align_down(self, addr: usize) -> usize {
addr & !(self.bytes() - 1)
}
#[inline]
pub const fn align_up(self, addr: usize) -> Option<usize> {
let mask = self.bytes() - 1;
match addr.checked_add(mask) {
Some(a) => Some(a & !mask),
None => None,
}
}
}