extern crate alloc;
use crate::prelude_dev::*;
use core::ptr::NonNull;
pub unsafe fn uninitialized_vec<T>(size: usize) -> Result<Vec<T>> {
#[cfg(not(feature = "aligned_alloc"))]
return unaligned_uninitialized_vec(size);
#[cfg(feature = "aligned_alloc")]
return aligned_uninitialized_vec::<T, 128>(size, 64);
}
#[allow(clippy::uninit_vec)]
pub unsafe fn unaligned_uninitialized_vec<T>(size: usize) -> Result<Vec<T>> {
let mut v: Vec<T> = vec![];
v.try_reserve_exact(size)?;
unsafe { v.set_len(size) };
return Ok(v);
}
pub fn aligned_alloc(numbytes: usize, alignment: usize) -> Result<Option<NonNull<()>>> {
if numbytes == 0 {
return Ok(None);
}
let layout = alloc::alloc::Layout::from_size_align(numbytes, alignment)?;
let pointer = NonNull::new(unsafe { alloc::alloc::alloc(layout) }).map(|p| p.cast::<()>());
Ok(pointer)
}
#[allow(clippy::uninit_vec)]
pub unsafe fn aligned_uninitialized_vec<T, const N: usize>(size: usize, alignment: usize) -> Result<Vec<T>> {
if size == 0 {
return Ok(vec![]);
} else if size < N {
return unaligned_uninitialized_vec(size);
} else {
let sizeof = core::mem::size_of::<T>();
let pointer = aligned_alloc(size * sizeof, alignment)?;
if let Some(pointer) = pointer {
let mut v = Vec::from_raw_parts(pointer.as_ptr() as *mut T, size, size);
unsafe { v.set_len(size) };
return Ok(v);
} else {
rstsr_raise!(RuntimeError, "Allocation failed (probably due to out-of-memory)")?
}
}
}