use super::{OutOfMemory, Result};
use core::alloc::Layout;
use core::mem::MaybeUninit;
use core::ptr::NonNull;
use std_alloc::boxed::Box;
#[inline]
pub(crate) unsafe fn try_alloc(layout: Layout) -> Result<NonNull<u8>, OutOfMemory> {
debug_assert!(layout.size() > 0);
let ptr = unsafe { std_alloc::alloc::alloc(layout) };
if let Some(ptr) = NonNull::new(ptr) {
Ok(ptr)
} else {
Err(OutOfMemory::new(layout.size()))
}
}
#[inline]
pub(crate) fn try_new_uninit_box<T>() -> Result<Box<MaybeUninit<T>>, OutOfMemory> {
let layout = std_alloc::alloc::Layout::new::<MaybeUninit<T>>();
if layout.size() == 0 {
return Ok(Box::new(MaybeUninit::uninit()));
}
let ptr = unsafe { try_alloc(layout)? };
let ptr = ptr.cast::<MaybeUninit<T>>();
Ok(unsafe { Box::from_raw(ptr.as_ptr()) })
}