1use std::{alloc::Layout, ptr::NonNull};
2
3mod obstack;
4mod simple_obstack;
5
6pub struct AllocError {}
7
8pub trait Allocator {
9 fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
11 unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout);
12
13 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}