use core::ptr::NonNull;
#[inline]
pub fn is_aligned_to(ptr: *mut u8, align: usize) -> bool {
debug_assert!(align.is_power_of_two());
ptr as usize & (align - 1) == 0
}
#[inline]
pub fn nonnull_slice_from_raw_parts(nn: NonNull<u8>, len: usize) -> NonNull<[u8]> {
unsafe { NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut(nn.as_ptr(), len)) }
}
#[inline]
pub fn align_down_by(ptr: *mut u8, align: usize) -> *mut u8 {
debug_assert!(align.is_power_of_two());
ptr.wrapping_sub(ptr as usize & (align - 1))
}
#[inline]
pub fn align_up_by(ptr: *mut u8, align: usize) -> *mut u8 {
align_up_by_mask(ptr, align - 1)
}
#[inline]
pub fn align_up_by_mask(ptr: *mut u8, align_mask: usize) -> *mut u8 {
debug_assert!((align_mask + 1).is_power_of_two());
ptr.wrapping_add(
((ptr as usize).wrapping_add(align_mask) & !align_mask).wrapping_sub(ptr as usize),
)
}
#[inline]
pub fn saturating_ptr_add(ptr: *mut u8, bytes: usize) -> *mut u8 {
if ptr.wrapping_add(bytes) < ptr {
ptr.wrapping_add((ptr as usize).wrapping_neg() - 1)
} else {
ptr.wrapping_add(bytes)
}
}