pub const BYTE: u64 = 1;
pub const WORD: u64 = 2;
pub const DWORD: u64 = 4;
pub const QWORD: u64 = 8;
pub const KIB: u64 = 1024;
pub const MIB: u64 = 1024 * 1024;
pub const GIB: u64 = 1024 * 1024 * 1024;
pub const TIB: u64 = 1024 * 1024 * 1024 * 1024;
pub const KB: u64 = 1000;
pub const MB: u64 = 1000 * 1000;
pub const GB: u64 = 1000 * 1000 * 1000;
pub const TB: u64 = 1000 * 1000 * 1000 * 1000;
macro_rules! make_align_fn {
($align_up:ident, $align_down:ident, $type:ty) => {
#[inline(always)]
#[must_use]
pub const fn $align_up(addr: $type, align: $type) -> $type {
(addr | (align - 1)) + 1
}
#[inline(always)]
#[must_use]
pub const fn $align_down(addr: $type, align: $type) -> $type {
addr & (align - 1)
}
};
}
make_align_fn!(align_up, align_down, usize);
make_align_fn!(align_up_u128, align_down_u128, u128);
make_align_fn!(align_up_u64, align_down_u64, u64);
make_align_fn!(align_up_u32, align_down_u32, u32);
make_align_fn!(align_up_u16, align_down_u16, u16);
make_align_fn!(align_up_u8, align_down_u8, u8);
#[inline(always)]
#[must_use]
pub fn align_up_ptr<T>(addr: *const T, align: usize) -> *const T {
const {
assert!(align_of::<T>() == 1);
}
addr.with_addr(align_up(addr as usize, align))
}
#[inline(always)]
#[must_use]
pub fn align_down_ptr<T>(addr: *const T, align: usize) -> *const T {
const {
assert!(align_of::<T>() == 1);
}
addr.with_addr(align_down(addr as usize, align))
}
#[inline(always)]
#[must_use]
pub fn align_up_ptr_valid<T>(addr: *const T) -> *const T {
addr.with_addr(align_up(addr as usize, align_of::<T>()))
}
#[inline(always)]
#[must_use]
pub fn align_down_ptr_valid<T>(addr: *const T) -> *const T {
addr.with_addr(align_down(addr as usize, align_of::<T>()))
}
#[inline(always)]
#[must_use]
pub fn align_up_mut_ptr<T>(addr: *mut T, align: usize) -> *mut T {
const {
assert!(align_of::<T>() == 1);
}
addr.with_addr(align_up(addr as usize, align))
}
#[inline(always)]
#[must_use]
pub fn align_down_mut_ptr<T>(addr: *mut T, align: usize) -> *mut T {
const {
assert!(align_of::<T>() == 1);
}
addr.with_addr(align_down(addr as usize, align))
}
#[inline(always)]
#[must_use]
pub fn align_up_ptr_mut_valid<T>(addr: *mut T) -> *mut T {
addr.with_addr(align_up(addr as usize, align_of::<T>()))
}
#[inline(always)]
#[must_use]
pub fn align_down_ptr_mut_valid<T>(addr: *mut T) -> *mut T {
addr.with_addr(align_down(addr as usize, align_of::<T>()))
}