use super::generic::{GenericBump, IntoLayout};
#[cfg(any(feature = "allocator_api", feature = "allocator-fallback"))]
use super::{AllocError, Allocator};
use alloc::alloc::Layout;
use core::marker::PhantomData;
use core::mem;
use core::ptr::NonNull;
struct ConstLayout<Size, Align>(PhantomData<fn() -> (Size, Align)>);
impl<Size, Align> Clone for ConstLayout<Size, Align> {
fn clone(&self) -> Self {
*self
}
}
impl<Size, Align> Copy for ConstLayout<Size, Align> {}
impl<Size, Align> From<ConstLayout<Size, Align>> for Layout {
fn from(_: ConstLayout<Size, Align>) -> Self {
Self::from_size_align(mem::size_of::<Size>(), mem::align_of::<Align>())
.unwrap()
}
}
unsafe impl<Size, Align> IntoLayout for ConstLayout<Size, Align> {}
pub struct Bump<Size, Align = Size>(GenericBump<ConstLayout<Size, Align>>);
impl<Size, Align> Bump<Size, Align> {
pub fn new() -> Self {
Self(GenericBump::new(ConstLayout(PhantomData)))
}
pub fn allocate(&self, layout: Layout) -> Option<NonNull<[u8]>> {
self.0.allocate(layout)
}
#[allow(clippy::mut_from_ref)]
#[must_use]
pub fn alloc_value<T>(&self, value: T) -> &mut T {
self.0.alloc_value(value)
}
#[allow(clippy::mut_from_ref)]
pub fn try_alloc_value<T>(&self, value: T) -> Result<&mut T, T> {
self.0.try_alloc_value(value)
}
pub fn can_allocate(&self, layout: Layout) -> bool {
self.0.can_allocate(layout)
}
}
impl<Size, Align> Default for Bump<Size, Align> {
fn default() -> Self {
Self::new()
}
}
#[cfg(any(feature = "allocator_api", feature = "allocator-fallback"))]
#[cfg_attr(
feature = "doc_cfg",
doc(cfg(any(
feature = "allocator_api",
feature = "allocator-fallback",
)))
)]
unsafe impl<Size, Align> Allocator for Bump<Size, Align> {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
self.allocate(layout).ok_or(AllocError)
}
unsafe fn deallocate(&self, _ptr: NonNull<u8>, _layout: Layout) {
}
}
#[cfg(doctest)]
mod bump_does_not_impl_clone {}