use std::cell::UnsafeCell;
use bumpalo::Bump;
use thread_local::ThreadLocal;
#[derive(Debug, Default)]
pub struct MeshStore {
arena: Bump,
}
impl MeshStore {
pub fn scratch<T: Default>(&self, len: usize) -> &mut [T] {
self.arena.alloc_slice_fill_default(len)
}
pub fn reset(&mut self) {
self.arena.reset();
}
}
#[derive(Debug)]
pub struct UnsafeThreadCache<T: Send> {
pool: ThreadLocal<UnsafeCell<T>>,
}
impl<T: Send> UnsafeThreadCache<T> {
pub fn new() -> Self {
Self::default()
}
}
impl<T: Send + Default> UnsafeThreadCache<T> {
pub unsafe fn get_or_default(&self) -> &mut T {
unsafe { &mut *self.pool.get_or_default().get() }
}
}
impl<T: Send> Default for UnsafeThreadCache<T> {
fn default() -> Self {
Self {
pool: ThreadLocal::default(),
}
}
}