#[inline]
pub fn align_up(value: usize, align: usize) -> usize {
debug_assert!(align.is_power_of_two(), "alignment must be a power of two");
(value + align - 1) & !(align - 1)
}
#[inline]
pub fn align_down(value: usize, align: usize) -> usize {
debug_assert!(align.is_power_of_two(), "alignment must be a power of two");
value & !(align - 1)
}
#[inline]
pub fn is_aligned(value: usize, align: usize) -> bool {
debug_assert!(align.is_power_of_two(), "alignment must be a power of two");
(value & (align - 1)) == 0
}
#[inline]
pub fn get_alignment(ptr: *const u8) -> usize {
let addr = ptr as usize;
addr & (!addr + 1)
}
#[inline]
pub fn page_size() -> usize {
#[cfg(unix)]
{
unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize }
}
#[cfg(windows)]
{
use winapi::um::sysinfoapi::{GetSystemInfo, SYSTEM_INFO};
unsafe {
let mut system_info: SYSTEM_INFO = std::mem::zeroed();
GetSystemInfo(&mut system_info);
system_info.dwPageSize as usize
}
}
#[cfg(not(any(unix, windows)))]
{
4096
}
}
#[inline]
pub fn cache_line_size() -> usize {
#[cfg(target_arch = "x86_64")]
{
if let Some(size) = x86_64_cache_line_size() {
return size;
}
}
64
}
#[cfg(target_arch = "x86_64")]
fn x86_64_cache_line_size() -> Option<usize> {
Some(64)
}