use core::alloc::Layout;
use core::ptr::NonNull;
use super::AllocError;
pub unsafe trait AltAllocator {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
let ret = self.allocate(layout)?;
let ptr = ret.cast::<u8>();
unsafe { ptr.write_bytes(0, ret.len()) };
return Ok(ret);
}
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout);
unsafe fn grow(
&self,
old_ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout,
) -> Result<NonNull<[u8]>, AllocError> {
let new = self.allocate(new_layout)?;
let ptr = new.cast::<u8>();
unsafe { ptr.copy_from_nonoverlapping(old_ptr, old_layout.size()) };
unsafe { self.deallocate(old_ptr, old_layout) };
return Ok(new);
}
unsafe fn grow_zeroed(
&self,
old_ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout,
) -> Result<NonNull<[u8]>, AllocError> {
let new = self.allocate_zeroed(new_layout)?;
let ptr = new.cast::<u8>();
unsafe { ptr.copy_from_nonoverlapping(old_ptr, old_layout.size()) };
unsafe { self.deallocate(old_ptr, old_layout) };
return Ok(new);
}
unsafe fn shrink(
&self,
old_ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout,
) -> Result<NonNull<[u8]>, AllocError> {
let new = self.allocate(new_layout)?;
let ptr = new.cast::<u8>();
unsafe { ptr.copy_from_nonoverlapping(old_ptr, new_layout.size()) };
unsafe { self.deallocate(old_ptr, old_layout) };
return Ok(new);
}
}