use crate::{allocator::BaseAllocator, math::align};
use std::sync::atomic::{AtomicUsize, Ordering};
#[doc(hidden)]
pub struct BumpAllocator {
start: usize,
pos: AtomicUsize,
}
impl BumpAllocator {
pub fn new(start: usize) -> Self {
Self {
start,
pos: AtomicUsize::new(start),
}
}
}
impl BaseAllocator for BumpAllocator {
fn allocate(
&self,
layout: std::alloc::Layout,
) -> Result<std::ptr::NonNull<[u8]>, crate::allocator::AllocationError> {
let mem = align(self.pos.load(Ordering::Relaxed), layout.align());
self.pos.store(mem + layout.size(), Ordering::Relaxed);
unsafe {
Ok(std::ptr::NonNull::new_unchecked(
std::slice::from_raw_parts_mut(mem as *mut u8, layout.size()),
))
}
}
unsafe fn deallocate(
&self,
_ptr: std::ptr::NonNull<u8>,
_layout: std::alloc::Layout,
) -> Result<(), crate::allocator::DeallocationError> {
self.pos.store(self.start, Ordering::Relaxed);
Ok(())
}
}