#[cfg(debug_assertions)]
pub(crate) use checked::LocalCell;
#[cfg(not(debug_assertions))]
pub(crate) use unchecked::LocalCell;
#[cfg(debug_assertions)]
mod checked {
use core::cell::{Ref, RefCell, RefMut};
pub(crate) struct LocalCell<T>(RefCell<T>);
impl<T> LocalCell<T> {
#[inline(always)]
pub(crate) const fn new(value: T) -> Self {
Self(RefCell::new(value))
}
#[inline(always)]
pub(crate) fn borrow(&self) -> Ref<'_, T> {
self.0.borrow()
}
#[inline(always)]
pub(crate) fn borrow_mut(&self) -> RefMut<'_, T> {
self.0.borrow_mut()
}
}
}
#[cfg(not(debug_assertions))]
mod unchecked {
use core::{
cell::UnsafeCell,
ops::{Deref, DerefMut},
};
pub(crate) struct LocalCell<T>(UnsafeCell<T>);
impl<T> LocalCell<T> {
#[inline(always)]
pub(crate) const fn new(value: T) -> Self {
Self(UnsafeCell::new(value))
}
#[inline(always)]
pub(crate) fn borrow(&self) -> LocalRef<'_, T> {
LocalRef(unsafe { &*self.0.get() })
}
#[allow(clippy::mut_from_ref)]
#[inline(always)]
pub(crate) fn borrow_mut(&self) -> LocalRefMut<'_, T> {
LocalRefMut(unsafe { &mut *self.0.get() })
}
}
pub(crate) struct LocalRef<'a, T>(&'a T);
pub(crate) struct LocalRefMut<'a, T>(&'a mut T);
impl<T> Deref for LocalRef<'_, T> {
type Target = T;
#[inline(always)]
fn deref(&self) -> &T {
self.0
}
}
impl<T> Deref for LocalRefMut<'_, T> {
type Target = T;
#[inline(always)]
fn deref(&self) -> &T {
self.0
}
}
impl<T> DerefMut for LocalRefMut<'_, T> {
#[inline(always)]
fn deref_mut(&mut self) -> &mut T {
self.0
}
}
}