stack_arena/
traits.rs

1use crate::AllocError;
2use std::{alloc::Layout, ptr::NonNull};
3
4pub trait Allocator {
5    // Required methods
6    unsafe fn allocate(&mut self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
7
8    // Provided methods
9    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}