#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[derive(Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
#[repr(u64)]
pub enum PageSize
{
_4Kb = 4_096,
#[cfg(any(target_arch = "mips64", target_arch = "sparc64"))]
_8Kb = 8_192,
#[cfg(any(target_arch = "aarch64", target_arch = "mips64"))]
_16Kb = 16_384,
#[cfg(target_arch = "mips64")]
_32Kb = 32_768,
#[cfg(any(target_arch = "aarch64", target_arch = "mips64"))]
_64Kb = 65_536,
}
impl Into<NonZeroU64> for PageSize
{
#[inline(always)]
fn into(self) -> NonZeroU64
{
self.into_non_zero_u64()
}
}
impl Into<u64> for PageSize
{
#[inline(always)]
fn into(self) -> u64
{
self.into_u64()
}
}
impl Into<NonZeroUsize> for PageSize
{
#[inline(always)]
fn into(self) -> NonZeroUsize
{
self.into_non_zero_usize()
}
}
impl Into<usize> for PageSize
{
#[inline(always)]
fn into(self) -> usize
{
self.into_usize()
}
}
impl Into<NonZeroU32> for PageSize
{
#[inline(always)]
fn into(self) -> NonZeroU32
{
self.into_non_zero_u32()
}
}
impl Into<u32> for PageSize
{
#[inline(always)]
fn into(self) -> u32
{
self.into_u32()
}
}
impl TryFrom<NonZeroU64> for PageSize
{
type Error = ParseNumberError;
#[inline(always)]
fn try_from(value: NonZeroU64) -> Result<Self, Self::Error>
{
Self::from_non_zero_bytes(value).ok_or(ParseNumberError::OutOfRange)
}
}
impl TryFrom<u64> for PageSize
{
type Error = ParseNumberError;
#[inline(always)]
fn try_from(value: u64) -> Result<Self, Self::Error>
{
Self::from_bytes(value).ok_or(ParseNumberError::OutOfRange)
}
}
impl TryFrom<NonZeroUsize> for PageSize
{
type Error = ParseNumberError;
#[inline(always)]
fn try_from(value: NonZeroUsize) -> Result<Self, Self::Error>
{
Self::try_from(value.get())
}
}
impl TryFrom<usize> for PageSize
{
type Error = ParseNumberError;
#[inline(always)]
fn try_from(value: usize) -> Result<Self, Self::Error>
{
Self::try_from(value as u64)
}
}
impl Default for PageSize
{
#[inline(always)]
fn default() -> Self
{
Self::default()
}
}
impl PageSize
{
pub const fn into_non_zero_u64(self) -> NonZeroU64
{
new_non_zero_u64(self as u64)
}
pub const fn into_u64(self) -> u64
{
self as u64
}
pub const fn into_non_zero_usize(self) -> NonZeroUsize
{
new_non_zero_usize(self.into_usize())
}
pub const fn into_usize(self) -> usize
{
self.into_u64() as usize
}
pub const fn into_non_zero_u32(self) -> NonZeroU32
{
new_non_zero_u32(self.into_u32())
}
pub const fn into_u32(self) -> u32
{
self.into_u64() as u32
}
#[inline(always)]
pub fn is_an_exact_page_size_multiple_of_current_usize(value: usize) -> bool
{
Self::default().is_an_exact_page_size_multiple_usize(value)
}
#[inline(always)]
pub fn is_an_exact_page_size_multiple_usize(self, value: usize) -> bool
{
value % self.size_in_bytes().get() as usize == 0
}
#[inline(always)]
pub const fn size_in_kilobytes(self) -> NonZeroKilobyte
{
new_non_zero_u64((self as u64) / 1_024)
}
#[inline(always)]
pub const fn size_in_bytes(self) -> NonZeroU64
{
new_non_zero_u64(self as u64)
}
#[inline(always)]
pub fn non_zero_number_of_pages_from_non_zero_number_of_bytes_rounded_up(self, number_of_bytes: NonZeroU64) -> NonZeroNumberOfPages
{
new_non_zero_u64(self.number_of_pages_from_number_of_bytes_rounded_up(number_of_bytes.get()))
}
#[inline(always)]
pub fn number_of_pages_from_number_of_bytes_rounded_up(self, number_of_bytes: u64) -> NumberOfPages
{
let size_in_bytes = self.size_in_bytes().get();
(number_of_bytes + size_in_bytes - 1) / size_in_bytes
}
#[inline(always)]
pub fn non_zero_number_of_bytes_rounded_up_to_multiple_of_page_size(self, number_of_bytes: NonZeroU64) -> NonZeroU64
{
new_non_zero_u64(self.number_of_bytes_rounded_up_to_multiple_of_page_size(number_of_bytes.get()))
}
#[inline(always)]
pub fn number_of_bytes_rounded_up_to_multiple_of_page_size(self, number_of_bytes: u64) -> u64
{
let size_in_bytes = self.size_in_bytes().get();
((number_of_bytes + size_in_bytes - 1) / size_in_bytes) * size_in_bytes
}
#[inline(always)]
pub fn can_have_a_dynamic_huge_page_pool(self) -> bool
{
false
}
#[inline(always)]
pub fn is_a_gigantic_huge_page(self) -> bool
{
false
}
#[cfg(any(target_arch = "powerpc64", target_arch = "riscv64", target_arch = "x86_64"))]
#[inline(always)]
pub const fn default() -> Self
{
Self::_4Kb
}
#[cfg(target_arch = "sparc64")]
#[inline(always)]
pub const fn default() -> Self
{
Self::_8Kb
}
#[cfg(not(any(target_arch = "powerpc64", target_arch = "riscv64", target_arch = "sparc64", target_arch = "x86_64")))]
#[inline(always)]
pub fn default() -> Self
{
unsafe { transmute(getpagesize() as usize) }
}
#[inline(always)]
pub(crate) fn from_non_zero_bytes(bytes: NonZeroU64) -> Option<Self>
{
Self::from_bytes(bytes.get())
}
#[inline(always)]
pub(crate) fn from_bytes(bytes: u64) -> Option<Self>
{
use self::PageSize::*;
match bytes
{
4_096 => Some(_4Kb),
#[cfg(any(target_arch = "mips64", target_arch = "sparc64"))] 8_192 => Some(_8Kb),
#[cfg(any(target_arch = "aarch64", target_arch = "mips64"))] 16_384 => Some(_16Kb),
#[cfg(target_arch = "mips64")] 32_768 => Some(_32Kb),
#[cfg(any(target_arch = "aarch64", target_arch = "mips64"))] 65_536 => Some(_64Kb),
_ => None,
}
}
#[inline(always)]
pub fn from_non_zero_kilobytes(kilobytes: NonZeroU64) -> Option<Self>
{
Self::from_kilobytes(kilobytes.get())
}
#[inline(always)]
pub fn from_kilobytes(kilobytes: u64) -> Option<Self>
{
use self::PageSize::*;
match kilobytes
{
4 => Some(_4Kb),
#[cfg(any(target_arch = "mips64", target_arch = "sparc64"))] 8 => Some(_8Kb),
#[cfg(any(target_arch = "aarch64", target_arch = "mips64"))] 16 => Some(_16Kb),
#[cfg(target_arch = "mips64")] 32 => Some(_32Kb),
#[cfg(any(target_arch = "aarch64", target_arch = "mips64"))] 64 => Some(_64Kb),
_ => None,
}
}
}