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