1 pub(crate) use self::inner
::{do_alloc, Allocator, Global}
;
3 #[cfg(feature = "nightly")]
5 use crate::alloc
::alloc
::Layout
;
6 pub use crate::alloc
::alloc
::{Allocator, Global}
;
7 use core
::ptr
::NonNull
;
9 #[allow(clippy::map_err_ignore)]
10 pub fn do_alloc
<A
: Allocator
>(alloc
: &A
, layout
: Layout
) -> Result
<NonNull
<u8>, ()> {
13 .map(|ptr
| ptr
.as_non_null_ptr())
17 #[cfg(feature = "bumpalo")]
18 unsafe impl Allocator
for crate::BumpWrapper
<'_
> {
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
),
27 unsafe fn deallocate(&self, _ptr
: NonNull
<u8>, _layout
: Layout
) {}
31 #[cfg(not(feature = "nightly"))]
33 use crate::alloc
::alloc
::{alloc, dealloc, Layout}
;
34 use core
::ptr
::NonNull
;
36 pub unsafe trait Allocator
{
37 fn allocate(&self, layout
: Layout
) -> Result
<NonNull
<u8>, ()>;
38 unsafe fn deallocate(&self, ptr
: NonNull
<u8>, layout
: Layout
);
41 #[derive(Copy, Clone)]
43 unsafe impl Allocator
for Global
{
45 fn allocate(&self, layout
: Layout
) -> Result
<NonNull
<u8>, ()> {
46 unsafe { NonNull::new(alloc(layout)).ok_or(()) }
49 unsafe fn deallocate(&self, ptr
: NonNull
<u8>, layout
: Layout
) {
50 dealloc(ptr
.as_ptr(), layout
)
53 impl Default
for Global
{
55 fn default() -> Self {
60 pub fn do_alloc
<A
: Allocator
>(alloc
: &A
, layout
: Layout
) -> Result
<NonNull
<u8>, ()> {
61 alloc
.allocate(layout
)
64 #[cfg(feature = "bumpalo")]
65 unsafe impl Allocator
for crate::BumpWrapper
<'_
> {
66 #[allow(clippy::map_err_ignore)]
67 fn allocate(&self, layout
: Layout
) -> Result
<NonNull
<u8>, ()> {
68 self.0.try_alloc_layout(layout
).map_err(|_
| ())
70 unsafe fn deallocate(&self, _ptr
: NonNull
<u8>, _layout
: Layout
) {}