#![allow(dead_code)]
use std::cell::UnsafeCell;
use std::ops::{Deref, DerefMut};
#[repr(transparent)]
pub(crate) struct UnsafeRefCell<T> {
value: UnsafeCell<T>,
}
impl<T> UnsafeRefCell<T> {
#[inline(always)]
pub(crate) const fn new(value: T) -> Self {
Self {
value: UnsafeCell::new(value),
}
}
#[inline(always)]
pub(crate) fn borrow(&self) -> &T {
unsafe { &*self.value.get() }
}
#[inline(always)]
pub(crate) fn borrow_mut(&self) -> RefMut<T> {
RefMut {
value: unsafe { &mut *self.value.get() },
}
}
}
#[repr(transparent)]
pub(crate) struct RefMut<'a, T> {
value: &'a mut T,
}
impl<T> Deref for RefMut<'_, T> {
type Target = T;
#[inline(always)]
fn deref(&self) -> &Self::Target {
self.value
}
}
impl<T> DerefMut for RefMut<'_, T> {
#[inline(always)]
fn deref_mut(&mut self) -> &mut Self::Target {
self.value
}
}