• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)]
do_alloc<A: Allocator>(alloc: &A, layout: Layout) -> Result<NonNull<u8>, ()>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]
allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, core::alloc::AllocError>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]
deallocate(&self, _ptr: NonNull<u8>, _layout: Layout)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 {
allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()>38         fn allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()>;
deallocate(&self, ptr: NonNull<u8>, layout: Layout)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]
allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()>46         fn allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()> {
47             unsafe { NonNull::new(alloc(layout)).ok_or(()) }
48         }
49         #[inline]
deallocate(&self, ptr: NonNull<u8>, layout: Layout)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]
default() -> Self56         fn default() -> Self {
57             Global
58         }
59     }
60 
do_alloc<A: Allocator>(alloc: &A, layout: Layout) -> Result<NonNull<u8>, ()>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)]
allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()>68         fn allocate(&self, layout: Layout) -> Result<NonNull<u8>, ()> {
69             self.0.try_alloc_layout(layout).map_err(|_| ())
70         }
deallocate(&self, _ptr: NonNull<u8>, _layout: Layout)71         unsafe fn deallocate(&self, _ptr: NonNull<u8>, _layout: Layout) {}
72     }
73 }
74