1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
pub(crate) use self::inner::{do_alloc, Allocator, Global}; #[cfg(feature = "nightly")] mod inner { use crate::alloc::alloc::Layout; pub use crate::alloc::alloc::{Allocator, Global}; use core::ptr::NonNull; #[allow(clippy::map_err_ignore)] pub fn do_alloc<A: Allocator>(alloc: &A, layout: Layout) -> Result<NonNull<u8>, ()> { alloc .allocate(layout) .map(|ptr| ptr.as_non_null_ptr()) .map_err(|_| ()) } #[cfg(feature = "bumpalo")] unsafe impl Allocator for crate::BumpWrapper<'_> { #[inline] fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, core::alloc::AllocError> { match self.0.try_alloc_layout(layout) { Ok(ptr) => Ok(NonNull::slice_from_raw_parts(ptr, layout.size())), Err(_) => Err(core::alloc::AllocError), } } #[inline] unsafe fn deallocate(&self, _ptr: NonNull<u8>, _layout: Layout) {} } } #[cfg(not(feature = "nightly"))] mod inner { use crate::alloc::alloc::{alloc, dealloc, Layout}; use core::ptr::NonNull; pub unsafe trait Allocator { fn allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()>; unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout); } #[derive(Copy, Clone)] pub struct Global; unsafe impl Allocator for Global { #[inline] fn allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()> { unsafe { NonNull::new(alloc(layout)).ok_or(()) } } #[inline] unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) { dealloc(ptr.as_ptr(), layout) } } impl Default for Global { #[inline] fn default() -> Self { Global } } pub fn do_alloc<A: Allocator>(alloc: &A, layout: Layout) -> Result<NonNull<u8>, ()> { alloc.allocate(layout) } #[cfg(feature = "bumpalo")] unsafe impl Allocator for crate::BumpWrapper<'_> { #[allow(clippy::map_err_ignore)] fn allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()> { self.0.try_alloc_layout(layout).map_err(|_| ()) } unsafe fn deallocate(&self, _ptr: NonNull<u8>, _layout: Layout) {} } }