1use crate::AllocError;
2use std::{alloc::Layout, ptr::NonNull};
3
4pub trait Allocator {
5 unsafe fn allocate(&mut self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
7
8 unsafe fn allocate_zeroed(&mut self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
10 let ptr = self.allocate(layout)?;
11 unsafe { std::ptr::write_bytes(ptr.as_ptr() as *mut u8, 0, layout.size()) };
12 Ok(ptr)
13 }
14
15 unsafe fn deallocate(&mut self, ptr: NonNull<u8>, layout: Layout);
16
17 unsafe fn grow(
18 &mut self,
19 ptr: NonNull<u8>,
20 old_layout: Layout,
21 new_layout: Layout,
22 ) -> Result<NonNull<[u8]>, AllocError>;
23
24 unsafe fn grow_zeroed(
25 &mut self,
26 ptr: NonNull<u8>,
27 old_layout: Layout,
28 new_layout: Layout,
29 ) -> Result<NonNull<[u8]>, AllocError> {
30 let ptr = self.grow(ptr, old_layout, new_layout)?;
31 ptr.cast::<u8>()
32 .write_bytes(0, new_layout.size() - old_layout.size());
33 Ok(ptr)
34 }
35
36 unsafe fn shrink(
37 &mut self,
38 ptr: NonNull<u8>,
39 old_layout: Layout,
40 new_layout: Layout,
41 ) -> Result<NonNull<[u8]>, AllocError>;
42
43 #[inline(always)]
44 fn by_ref(&self) -> &Self
45 where
46 Self: Sized,
47 {
48 self
49 }
50}