1use std::alloc::Layout;
2use std::mem::size_of;
3
4pub unsafe fn alloc(size: usize) -> *mut u8 {
5 let size = size + size_of::<usize>();
6 let layout = Layout::from_size_align_unchecked(size, size_of::<usize>());
7 let ptr = std::alloc::alloc(layout);
8 if ptr.is_null() {
9 std::alloc::handle_alloc_error(layout);
10 }
11 *(ptr as *mut usize) = size;
12 ptr.offset(size_of::<usize>() as isize)
13}
14
15pub unsafe fn realloc(ptr: *mut u8, size: usize) -> *mut u8 {
16 if ptr.is_null() {
17 alloc(size)
18 } else {
19 let size = size + size_of::<usize>();
20 let ptr = ptr.offset(-(size_of::<usize>() as isize));
21 let old_size = *(ptr as *mut usize);
22 let layout = Layout::from_size_align_unchecked(old_size, size_of::<usize>());
23 let ptr = std::alloc::realloc(ptr, layout, size);
24 if ptr.is_null() {
25 std::alloc::handle_alloc_error(layout);
26 }
27 *(ptr as *mut usize) = size;
28 ptr.offset(size_of::<usize>() as isize)
29 }
30}
31
32pub unsafe fn free(ptr: *mut u8) {
33 if ptr.is_null() {
34 return;
35 }
36 let ptr = ptr.offset(-(size_of::<usize>() as isize));
37 let size = *(ptr as *mut usize);
38 let layout = Layout::from_size_align_unchecked(size, size_of::<usize>());
39 std::alloc::dealloc(ptr, layout);
40}