use allocator_api2::alloc::{AllocError, Allocator, Global};
use zerocopy::FromZeros;
#[derive(Debug)]
pub struct ZerocopyView<'a, A: Allocator + Clone = Global> {
arena: &'a crate::Arena<A>,
}
impl<'a, A: Allocator + Clone> ZerocopyView<'a, A> {
#[inline]
pub(crate) const fn new(arena: &'a crate::Arena<A>) -> Self {
Self { arena }
}
#[must_use]
#[inline]
pub fn alloc<T: FromZeros>(&self) -> &'a mut T {
self.arena
.try_alloc_with::<T, _>(T::new_zeroed)
.expect("zerocopy: arena allocation failed")
}
#[inline]
pub fn try_alloc<T: FromZeros>(&self) -> Result<&'a mut T, AllocError> {
self.arena.try_alloc_with::<T, _>(T::new_zeroed)
}
#[must_use]
#[inline]
pub fn alloc_slice<T: FromZeros>(&self, len: usize) -> &'a mut [T] {
self.arena
.try_alloc_slice_fill_with(len, |_| T::new_zeroed())
.expect("zerocopy: arena allocation failed")
}
#[inline]
pub fn try_alloc_slice<T: FromZeros>(&self, len: usize) -> Result<&'a mut [T], AllocError> {
self.arena.try_alloc_slice_fill_with(len, |_| T::new_zeroed())
}
#[must_use]
#[inline]
pub fn alloc_box<T: FromZeros>(&self) -> crate::Box<T, A> {
self.arena
.try_alloc_box_with::<T, _>(T::new_zeroed)
.expect("zerocopy: arena allocation failed")
}
#[inline]
pub fn try_alloc_box<T: FromZeros>(&self) -> Result<crate::Box<T, A>, AllocError> {
self.arena.try_alloc_box_with::<T, _>(T::new_zeroed)
}
#[must_use]
#[inline]
pub fn alloc_arc<T: FromZeros + Send + Sync>(&self) -> crate::Arc<T, A>
where
A: Send + Sync,
{
self.arena
.try_alloc_arc_with::<T, _>(T::new_zeroed)
.expect("zerocopy: arena allocation failed")
}
#[inline]
pub fn try_alloc_arc<T: FromZeros + Send + Sync>(&self) -> Result<crate::Arc<T, A>, AllocError>
where
A: Send + Sync,
{
self.arena.try_alloc_arc_with::<T, _>(T::new_zeroed)
}
#[must_use]
#[inline]
pub fn alloc_slice_arc<T: FromZeros + Send + Sync>(&self, len: usize) -> crate::Arc<[T], A>
where
A: Send + Sync,
{
self.arena
.try_alloc_slice_fill_with_arc::<T, _>(len, |_| T::new_zeroed())
.expect("zerocopy: arena allocation failed")
}
#[inline]
pub fn try_alloc_slice_arc<T: FromZeros + Send + Sync>(&self, len: usize) -> Result<crate::Arc<[T], A>, AllocError>
where
A: Send + Sync,
{
self.arena.try_alloc_slice_fill_with_arc::<T, _>(len, |_| T::new_zeroed())
}
#[must_use]
#[inline]
pub fn alloc_slice_box<T: FromZeros>(&self, len: usize) -> crate::Box<[T], A> {
self.arena
.try_alloc_slice_fill_with_box::<T, _>(len, |_| T::new_zeroed())
.expect("zerocopy: arena allocation failed")
}
#[inline]
pub fn try_alloc_slice_box<T: FromZeros>(&self, len: usize) -> Result<crate::Box<[T], A>, AllocError> {
self.arena.try_alloc_slice_fill_with_box::<T, _>(len, |_| T::new_zeroed())
}
}