use nstd_core::pointer::NSTDPointer;
use std::ptr::addr_of_mut;
#[repr(C)]
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct NSTDHeap {
pub ptr: NSTDPointer,
}
impl Clone for NSTDHeap {
#[inline]
fn clone(&self) -> Self {
unsafe { nstd_alloc_heap_new(&self.ptr) }
}
}
#[cfg_attr(feature = "clib", no_mangle)]
pub unsafe extern "C" fn nstd_alloc_heap_new(ptr: &NSTDPointer) -> NSTDHeap {
let ptr_slice = core::slice::from_raw_parts(ptr.raw.cast(), ptr.size);
let alloc = crate::nstd_alloc_allocate(ptr.size);
if !alloc.is_null() {
let alloc_slice = core::slice::from_raw_parts_mut(alloc as *mut u8, ptr.size);
alloc_slice.copy_from_slice(ptr_slice);
}
NSTDHeap {
ptr: nstd_core::pointer::nstd_core_pointer_new(alloc, ptr.size),
}
}
#[inline]
#[cfg_attr(feature = "clib", no_mangle)]
pub unsafe extern "C" fn nstd_alloc_heap_free(obj: &mut NSTDHeap) -> i32 {
let ptr = addr_of_mut!(obj.ptr.raw);
crate::nstd_alloc_deallocate(ptr, obj.ptr.size)
}