1use std::cell::UnsafeCell;
2
3use bumpalo::Bump;
4use thread_local::ThreadLocal;
5
6#[derive(Debug, Default)]
9pub struct MeshStore {
10 arena: Bump,
12}
13
14impl MeshStore {
15 pub fn scratch<T: Default>(&self, len: usize) -> &mut [T] {
17 self.arena.alloc_slice_fill_default(len)
18 }
19
20 pub fn reset(&mut self) {
22 self.arena.reset();
23 }
24}
25
26#[derive(Debug)]
29pub struct UnsafeThreadCache<T: Send> {
30 pool: ThreadLocal<UnsafeCell<T>>,
31}
32
33impl<T: Send> UnsafeThreadCache<T> {
34 pub fn new() -> Self {
36 Self::default()
37 }
38}
39
40impl<T: Send + Default> UnsafeThreadCache<T> {
41 pub unsafe fn get_or_default(&self) -> &mut T {
44 unsafe { &mut *self.pool.get_or_default().get() }
45 }
46}
47
48impl<T: Send> Default for UnsafeThreadCache<T> {
49 fn default() -> Self {
50 Self {
51 pool: ThreadLocal::default(),
52 }
53 }
54}