use std::cell::{Ref, RefCell, RefMut};
use std::fmt;
use std::rc::Rc;
pub struct RustdvShared<T> {
inner: Rc<RefCell<T>>,
}
impl<T> RustdvShared<T> {
pub fn new(value: T) -> RustdvShared<T> {
RustdvShared { inner: Rc::new(RefCell::new(value)) }
}
pub fn get(&self) -> Ref<'_, T> {
self.inner.borrow()
}
pub fn get_mut(&self) -> RefMut<'_, T> {
self.inner.borrow_mut()
}
pub fn handle_count(&self) -> usize {
Rc::strong_count(&self.inner)
}
}
impl<T> Clone for RustdvShared<T> {
fn clone(&self) -> Self {
RustdvShared { inner: self.inner.clone() }
}
}
impl<T: Default> Default for RustdvShared<T> {
fn default() -> Self {
RustdvShared::new(T::default())
}
}
impl<T: fmt::Debug> fmt::Debug for RustdvShared<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "RustdvShared({:?})", self.inner.borrow())
}
}