use std::ops::{Deref, DerefMut};
use atomic_refcell::{AtomicRefCell, AtomicRefMut};
use js::context::NoGC;
pub(crate) struct AtomicRefMutNoGC<'a, T> {
ref_mut: AtomicRefMut<'a, T>,
_anchor: &'a NoGC,
}
pub(crate) trait AtomicSafeBorrowMut {
type Target;
fn safe_borrow_mut<'a: 'b, 'b>(&'a self, no_gc: &'b NoGC)
-> AtomicRefMutNoGC<'b, Self::Target>;
}
impl<T> AtomicSafeBorrowMut for AtomicRefCell<T> {
type Target = T;
fn safe_borrow_mut<'a: 'b, 'b>(
&'a self,
no_gc: &'b NoGC,
) -> AtomicRefMutNoGC<'b, Self::Target> {
AtomicRefMutNoGC {
ref_mut: self.borrow_mut(),
_anchor: no_gc,
}
}
}
impl<'a, T> Deref for AtomicRefMutNoGC<'a, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.ref_mut
}
}
impl<'a, T> DerefMut for AtomicRefMutNoGC<'a, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.ref_mut
}
}