use std::cell::{Ref, RefCell, RefMut};
use std::clone::Clone;
use std::hash::{Hash, Hasher};
use std::ops::Deref;
use std::rc::Rc;
#[derive(Default)]
pub struct WrappedRcRefCell<T> {
inner: Rc<RefCell<T>>,
}
impl<T> WrappedRcRefCell<T> {
pub(crate) fn wrap(t: T) -> Self {
WrappedRcRefCell {
inner: Rc::new(RefCell::new(t)),
}
}
pub(crate) fn get(&self) -> Ref<T> {
self.inner.deref().borrow()
}
pub(crate) fn get_mut(&self) -> RefMut<T> {
self.inner.deref().borrow_mut()
}
}
impl<T> Clone for WrappedRcRefCell<T> {
fn clone(&self) -> Self {
WrappedRcRefCell {
inner: self.inner.clone(),
}
}
}
impl<T> Hash for WrappedRcRefCell<T> {
fn hash<H: Hasher>(&self, state: &mut H) {
let ptr = &*self.inner as *const RefCell<T>;
ptr.hash(state);
}
}
impl<T> PartialEq for WrappedRcRefCell<T> {
fn eq(&self, other: &Self) -> bool {
Rc::ptr_eq(&self.inner, &other.inner)
}
}
impl<T> Eq for WrappedRcRefCell<T> {}