use core::ptr::NonNull;
use allocator_api2::alloc::Allocator;
use super::constants::CHUNK_ALIGN;
use super::local_chunk::LocalChunk;
use super::shared_chunk::SharedChunk;
#[inline]
pub(crate) unsafe fn local_chunk_of<T: ?Sized, A: Allocator + Clone>(value: NonNull<T>) -> NonNull<LocalChunk<A>> {
let raw = value.as_ptr().cast::<u8>();
let offset_within_chunk = (raw as usize) & (CHUNK_ALIGN - 1);
let header_byte_ptr = unsafe { raw.byte_sub(offset_within_chunk) };
let header_only: *const LocalChunk<A> = core::ptr::slice_from_raw_parts(header_byte_ptr, 0) as *const LocalChunk<A>;
let capacity = unsafe { (*header_only).capacity };
let fat: *mut LocalChunk<A> = core::ptr::slice_from_raw_parts_mut(header_byte_ptr, capacity) as *mut LocalChunk<A>;
unsafe { NonNull::new_unchecked(fat) }
}
#[inline]
pub(crate) unsafe fn shared_chunk_of<T: ?Sized, A: Allocator + Clone>(value: NonNull<T>) -> NonNull<SharedChunk<A>> {
let raw = value.as_ptr().cast::<u8>();
let offset_within_chunk = (raw as usize) & (CHUNK_ALIGN - 1);
let header_byte_ptr = unsafe { raw.byte_sub(offset_within_chunk) };
let header_only: *const SharedChunk<A> = core::ptr::slice_from_raw_parts(header_byte_ptr, 0) as *const SharedChunk<A>;
let capacity = unsafe { (*header_only).capacity };
let fat: *mut SharedChunk<A> = core::ptr::slice_from_raw_parts_mut(header_byte_ptr, capacity) as *mut SharedChunk<A>;
unsafe { NonNull::new_unchecked(fat) }
}