use snapshottable::{Ref, Store, WeakRef};
use std::cell::RefCell;
use std::rc::{Rc, Weak};
struct Weird {
store: Weak<RefCell<Store>>,
r: Option<WeakRef<Weird>>,
}
impl Clone for Weird {
fn clone(&self) -> Self {
let make_clone = || Weird {
store: self.store.clone(),
r: self.r.clone(),
};
if let Some(r) = &self.r {
let store = self.store.upgrade().unwrap();
let mut store = store.borrow_mut();
store.set(&r.upgrade().unwrap(), make_clone());
}
make_clone()
}
}
#[test]
#[should_panic = "RefCell already borrowed"]
fn clone_safe() {
let store = Rc::new(RefCell::new(Store::new()));
let r = Ref::new(Weird {
store: Rc::downgrade(&store),
r: None,
});
let cycle = Weird {
store: Rc::downgrade(&store),
r: Some(Ref::downgrade(&r)),
};
store.borrow_mut().set(&r, cycle);
r.get();
}