use {
crate::{
error::Error,
ffi::stack_alloc::with_alloca,
layout::Layout,
traits::alloc_temp::AllocTemp
},
::core::{
ops::FnOnce,
ptr::{self, NonNull},
result::Result
}
};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct StackAlloc;
impl AllocTemp for StackAlloc {
type Error = Error;
#[cfg_attr(miri, track_caller)]
#[inline]
unsafe fn alloc_temp<R, F: FnOnce(NonNull<u8>) -> R>(
&self,
layout: Layout,
with_mem: F
) -> Result<R, Error> {
with_alloca(layout, |ptr, uninit: *mut R| {
ptr::write(uninit, with_mem(ptr));
})
}
#[cfg_attr(miri, track_caller)]
#[inline]
unsafe fn zalloc_temp<R, F: FnOnce(NonNull<u8>) -> R>(
&self,
layout: Layout,
with_mem: F
) -> Result<R, Error> {
with_alloca(layout, |ptr, uninit: *mut R| {
ptr::write_bytes(ptr.as_ptr(), 0, layout.size());
ptr::write(uninit, with_mem(ptr));
})
}
}
pub use crate::ffi::stack_alloc as ffi;