unsafe_utilities/
allocate.rs

1use std::alloc::*;
2
3pub unsafe fn allocate<T>() -> *mut T {
4    alloc(Layout::new::<T>()) as *mut T
5}
6
7pub unsafe fn allocate_zeroed<T>() -> *mut T {
8    alloc_zeroed(Layout::new::<T>()) as *mut T
9}
10
11pub unsafe fn deallocate<T>(ptr: *mut T) {
12    dealloc(ptr as _, Layout::new::<T>())
13}
14
15pub unsafe fn allocate_array<T>(n: usize) -> *mut [T] {
16    let data = alloc(Layout::array::<T>(n).unwrap()) as *mut T;
17    std::slice::from_raw_parts_mut(data, n)
18}
19
20pub unsafe fn allocate_array_zeroed<T>(n: usize) -> *mut [T] {
21    let data = alloc_zeroed(Layout::array::<T>(n).unwrap()) as *mut T;
22    std::slice::from_raw_parts_mut(data, n)
23}
24
25pub unsafe fn deallocate_array<T>(ptr: *mut [T]) {
26    let slice = &mut *ptr;
27    dealloc(
28        slice.as_mut_ptr() as _,
29        Layout::array::<T>(slice.len()).unwrap(),
30    );
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn alloc_single() {
39        unsafe { deallocate(allocate::<usize>()) }
40    }
41
42    #[test]
43    fn alloc_array() {
44        unsafe { deallocate_array(allocate_array::<usize>(10)) }
45    }
46}