unsafe_utilities/
allocate.rs1use 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}