use std::mem::MaybeUninit;
use std::ptr::NonNull;
use std::slice;
use bumpalo::Bump;
use bumpalo::ChunkRawIter;
use crate::values::layout::heap::allocator::api::ArenaAllocator;
use crate::values::layout::heap::allocator::api::ChunkAllocationDirection;
use crate::values::layout::value_alloc_size::ValueAllocSize;
pub(crate) struct ChunkIteratorWrapper<'a> {
iter: ChunkRawIter<'a>,
}
impl<'a> Iterator for ChunkIteratorWrapper<'a> {
type Item = &'a [MaybeUninit<u8>];
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.iter
.next()
.map(|(ptr, len)| unsafe { slice::from_raw_parts(ptr as *mut MaybeUninit<u8>, len) })
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl ArenaAllocator for Bump {
fn allocated_bytes(&self) -> usize {
Bump::allocated_bytes(self)
}
fn remaining_capacity(&self) -> usize {
Bump::chunk_capacity(self)
}
fn allocation_overhead(&self) -> usize {
0
}
#[inline]
fn alloc(&self, size: ValueAllocSize) -> NonNull<u8> {
Bump::alloc_layout(self, size.layout())
}
const CHUNK_ALLOCATION_DIRECTION: ChunkAllocationDirection = ChunkAllocationDirection::Down;
type ChunkRevIterator<'a> = ChunkIteratorWrapper<'a>;
unsafe fn iter_allocated_chunks_rev(&self) -> Self::ChunkRevIterator<'_> {
ChunkIteratorWrapper {
iter: Bump::iter_allocated_chunks_raw(self),
}
}
fn finish(&mut self) {}
}