stack_arena/
lib.rs

1use std::{alloc::Layout, ptr::NonNull};
2
3mod obstack;
4mod simple_obstack;
5
6pub struct AllocError {}
7
8pub trait Allocator {
9    // Required methods
10    fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
11    unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout);
12
13    // Provided methods
14    fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
15        let ptr = self.allocate(layout)?;
16        unsafe { std::ptr::write_bytes(ptr.as_ptr() as *mut u8, 0, layout.size()) };
17        Ok(ptr)
18    }
19    unsafe fn grow(
20        &self,
21        ptr: NonNull<u8>,
22        old_layout: Layout,
23        new_layout: Layout,
24    ) -> Result<NonNull<[u8]>, AllocError> {
25        todo!()
26    }
27    unsafe fn grow_zeroed(
28        &self,
29        ptr: NonNull<u8>,
30        old_layout: Layout,
31        new_layout: Layout,
32    ) -> Result<NonNull<[u8]>, AllocError> {
33        todo!()
34    }
35    unsafe fn shrink(
36        &self,
37        ptr: NonNull<u8>,
38        old_layout: Layout,
39        new_layout: Layout,
40    ) -> Result<NonNull<[u8]>, AllocError> {
41        todo!()
42    }
43    fn by_ref(&self) -> &Self
44    where
45        Self: Sized,
46    {
47        todo!()
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn it_works() {
57        let result = 4;
58        assert_eq!(result, 4);
59    }
60}