#![allow(unsafe_op_in_unsafe_fn)]
#[inline(always)]
pub(crate) unsafe fn sl_typed<T>(offset: usize, base: *mut u8, len: usize) -> &'static [T] {
if offset == usize::MAX {
return &[];
}
unsafe { std::slice::from_raw_parts(base.add(offset) as *const T, len) }
}
#[inline(always)]
pub(crate) unsafe fn sl_mut_typed<T>(offset: usize, base: *mut u8, len: usize) -> &'static mut [T] {
if offset == usize::MAX {
return &mut [];
}
unsafe { std::slice::from_raw_parts_mut(base.add(offset) as *mut T, len) }
}
macro_rules! arena_slice_accessors {
($(#[$attr:meta])* $read:ident, $write:ident, $t:ty) => {
$(#[$attr])*
#[inline(always)]
pub(crate) unsafe fn $read(offset: usize, base: *mut u8, len: usize) -> &'static [$t] {
if offset == usize::MAX {
return &[];
}
unsafe { std::slice::from_raw_parts(base.add(offset) as *const $t, len) }
}
$(#[$attr])*
#[inline(always)]
pub(crate) unsafe fn $write(offset: usize, base: *mut u8, len: usize) -> &'static mut [$t] {
if offset == usize::MAX {
return &mut [];
}
unsafe { std::slice::from_raw_parts_mut(base.add(offset) as *mut $t, len) }
}
};
}
arena_slice_accessors!(sl, sl_mut, f32);
arena_slice_accessors!(sl_f64, sl_mut_f64, f64);
arena_slice_accessors!(
#[allow(dead_code)]
sl_i32,
sl_mut_i32,
i32
);
arena_slice_accessors!(sl_i64, sl_mut_i64, i64);