use std::sync::Mutex;
use typed_arena::Arena as TypedArena;
pub struct Arena<T> {
inner: Mutex<TypedArena<T>>,
}
impl<T> Default for Arena<T> {
fn default() -> Self {
Self::new()
}
}
impl<T> Arena<T> {
#[inline]
pub fn new() -> Self {
Self {
inner: Mutex::new(TypedArena::new()),
}
}
#[inline]
pub fn with_capacity(n: usize) -> Self {
Self {
inner: Mutex::new(TypedArena::with_capacity(n)),
}
}
#[allow(clippy::mut_from_ref)]
pub fn alloc(&self, value: T) -> &mut T {
let arena = self.inner.lock().expect("lock poisoned");
let value = arena.alloc(value);
unsafe { ::std::mem::transmute::<&mut T, &mut T>(value) }
}
#[inline]
pub fn into_vec(self) -> Vec<T> {
let arena = self.inner.into_inner().expect("lock poisoned");
arena.into_vec()
}
}
#[test]
fn arena_thread_safe() {
fn assert_send<T: Send>() {}
fn assert_sync<T: Sync>() {}
assert_send::<Arena<String>>();
assert_sync::<Arena<String>>();
}