use std::cell::UnsafeCell;
use std::rc::{Rc, Weak};
pub struct CloningCell<T: NonSelfReferentialClone>(UnsafeCell<T>);
impl<T: NonSelfReferentialClone> CloningCell<T> {
#[inline]
pub fn new(value: T) -> Self {
CloningCell(UnsafeCell::new(value))
}
#[inline]
pub fn get(&self) -> T {
unsafe { (*self.0.get()).clone() }
}
#[inline]
pub fn set(&self, value: T) {
unsafe { *self.0.get() = value; }
}
}
pub unsafe trait NonSelfReferentialClone: Clone {}
unsafe impl NonSelfReferentialClone for String {}
unsafe impl<T> NonSelfReferentialClone for Rc<T> {}
unsafe impl<T> NonSelfReferentialClone for Weak<T> {}
unsafe impl<T: NonSelfReferentialClone> NonSelfReferentialClone for Box<T> {}
unsafe impl<T: NonSelfReferentialClone> NonSelfReferentialClone for Option<T> {}