use std::ptr::NonNull;
#[inline(always)]
pub fn cast_to_nonnull<T: ?Sized>(dst: *mut T) -> NonNull<T> {
match NonNull::new(dst) {
Some(ptr) => ptr,
None => panic!("Failed to allocate memory"),
}
}
#[inline(always)]
pub fn cast_data_to_ptr<T>(data: &T) -> *const u8 {
std::ptr::addr_of!(*data).cast::<u8>()
}
#[inline(always)]
pub fn sizeof<T>(data: &T) -> usize {
size_of::<T>()
}
#[inline(always)]
pub fn zero_memory(data: *mut [u8], offset: usize, length: usize) -> *mut [u8] {
let chunk = unsafe { &mut *data };
for i in offset..offset + length {
chunk[i] = 0;
}
data
}
#[macro_export]
macro_rules! rumtk_layout {
( ) => {{
rumtk_layout!(0, u8)
}};
( $size:expr ) => {{
rumtk_layout!($size, u8)
}};
( $size:expr, $alignment:ty ) => {{
use std::alloc::{Layout};
Layout::from_size_align_unchecked($size, size_of::<$alignment>())
}};
}