#[allow(unused)] use crate::event::Event;
use crate::event::{EventMgr, UpdateId};
use crate::model::*;
use std::fmt::Debug;
use std::ops::{Deref, DerefMut};
use std::sync::{Arc, Mutex, MutexGuard};
#[derive(Clone, Debug)]
pub struct SharedArc<T: Debug>(Arc<(UpdateId, Mutex<(T, u64)>)>);
impl<T: Debug + Default> Default for SharedArc<T> {
fn default() -> Self {
SharedArc(Arc::new((UpdateId::new(), Default::default())))
}
}
pub struct SharedArcRef<'a, T>(MutexGuard<'a, (T, u64)>);
impl<'a, T> std::borrow::Borrow<T> for SharedArcRef<'a, T> {
fn borrow(&self) -> &T {
&self.0.deref().0
}
}
impl<'a, T> Deref for SharedArcRef<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.0.deref().0
}
}
pub struct SharedArcRefMut<'a, T>(MutexGuard<'a, (T, u64)>);
impl<'a, T> std::borrow::Borrow<T> for SharedArcRefMut<'a, T> {
fn borrow(&self) -> &T {
&self.0.deref().0
}
}
impl<'a, T> std::borrow::BorrowMut<T> for SharedArcRefMut<'a, T> {
fn borrow_mut(&mut self) -> &mut T {
&mut self.0.deref_mut().0
}
}
impl<'a, T> Deref for SharedArcRefMut<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.0.deref().0
}
}
impl<'a, T> DerefMut for SharedArcRefMut<'a, T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.0.deref_mut().0
}
}
impl<T: Debug> SharedArc<T> {
pub fn new(data: T) -> Self {
let id = UpdateId::new();
let data = Mutex::new((data, 1));
SharedArc(Arc::new((id, data)))
}
pub fn id(&self) -> UpdateId {
(self.0).0
}
pub fn version(&self) -> u64 {
(self.0).1.lock().unwrap().1
}
pub fn borrow(&self) -> SharedArcRef<'_, T> {
SharedArcRef((self.0).1.lock().unwrap())
}
pub fn borrow_mut(&self, mgr: &mut EventMgr) -> SharedArcRefMut<'_, T> {
mgr.update_with_id((self.0).0, 0);
let mut inner = (self.0).1.lock().unwrap();
inner.1 += 1;
SharedArcRefMut(inner)
}
#[inline]
pub fn set(&self, mgr: &mut EventMgr, item: T) {
*self.borrow_mut(mgr) = item;
}
}
impl<T: Clone + Debug> SharedArc<T> {
#[inline]
pub fn get_cloned(&self) -> T {
self.borrow().deref().clone()
}
}
impl<T: Clone + Debug + 'static> SharedData for SharedArc<T> {
type Key = ();
type Item = T;
type ItemRef<'b> = SharedArcRef<'b, T>;
#[inline]
fn version(&self) -> u64 {
self.version()
}
#[inline]
fn contains_key(&self, _: &()) -> bool {
true
}
#[inline]
fn borrow(&self, _: &Self::Key) -> Option<Self::ItemRef<'_>> {
Some(self.borrow())
}
}
impl<T: Clone + Debug + 'static> SharedDataMut for SharedArc<T> {
type ItemRefMut<'b> = SharedArcRefMut<'b, T>
where
Self: 'b;
#[inline]
fn borrow_mut(&self, mgr: &mut EventMgr, _: &Self::Key) -> Option<Self::ItemRefMut<'_>> {
Some(self.borrow_mut(mgr))
}
}