use crate::runtime::heap::layout;
use std::ptr;
#[repr(transparent)]
pub(super) struct ArenaBase(ptr::NonNull<u8>);
impl ArenaBase {
pub(super) const unsafe fn new(pointer: ptr::NonNull<u8>) -> Self {
Self(pointer)
}
pub(super) const fn pointer(&self) -> ptr::NonNull<u8> {
self.0
}
}
pub(crate) struct Span {
arena: ptr::NonNull<u8>,
base: ArenaBase,
layout: layout::Layout,
}
impl Span {
pub(crate) unsafe fn new(base: ptr::NonNull<u8>, layout: layout::Layout) -> Self {
let heap = unsafe {
ArenaBase::new(ptr::NonNull::new_unchecked(
base.as_ptr().add(super::Arena::BYTES),
))
};
Self {
arena: base,
base: heap,
layout,
}
}
pub(super) const fn into_parts(self) -> (ptr::NonNull<u8>, ArenaBase, layout::Layout) {
(self.arena, self.base, self.layout)
}
}