use std::alloc::{AllocError, Allocator};
use std::alloc::{GlobalAlloc, Layout};
use crate::mem::cast_to_nonnull;
use std::ptr::NonNull;
#[cfg(feature = "fast_allocator")]
use mimalloc::MiMalloc;
#[cfg(feature = "fast_allocator")]
static mut SAND: MiMalloc = MiMalloc;
#[cfg(not(feature = "fast_allocator"))]
use std::alloc::System;
#[cfg(not(feature = "fast_allocator"))]
static mut SAND: System = System;
#[inline(always)]
pub unsafe fn direct_alloc(layout: Layout) -> *mut u8 {
SAND.alloc(layout)
}
#[inline(always)]
pub unsafe fn direct_dealloc(ptr: *mut u8, layout: Layout) {
SAND.dealloc(ptr, layout)
}
pub struct DirectAllocator;
unsafe impl Allocator for DirectAllocator {
#[inline(always)]
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
let ptr = unsafe { direct_alloc(layout) };
let slice = unsafe { std::slice::from_raw_parts_mut(ptr, layout.size()) };
Ok(cast_to_nonnull::<[u8]>(slice))
}
#[inline(always)]
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
direct_dealloc(ptr.as_ptr(), layout);
}
}
pub static DIRECT_ALLOCATOR: DirectAllocator = DirectAllocator;