1use crate::{Callback, ChangeToken, DefaultChangeToken, Registration};
2use std::{borrow::Borrow, ops::Deref, sync::Arc, any::Any};
3
4pub struct SharedChangeToken<T: ChangeToken = DefaultChangeToken> {
6 inner: Arc<T>,
7}
8
9impl<T: ChangeToken> SharedChangeToken<T> {
10 pub fn new(token: T) -> Self {
16 Self::from(token)
17 }
18}
19
20impl<T: ChangeToken + Default> Default for SharedChangeToken<T> {
21 fn default() -> Self {
22 Self::from(T::default())
23 }
24}
25
26impl<T: ChangeToken> Clone for SharedChangeToken<T> {
27 fn clone(&self) -> Self {
28 Self {
29 inner: self.inner.clone(),
30 }
31 }
32}
33
34impl<T: ChangeToken> From<T> for SharedChangeToken<T> {
35 fn from(token: T) -> Self {
36 Self {
37 inner: Arc::new(token),
38 }
39 }
40}
41
42impl<T: ChangeToken> ChangeToken for SharedChangeToken<T> {
43 fn changed(&self) -> bool {
44 self.inner.changed()
45 }
46
47 fn must_poll(&self) -> bool {
48 self.inner.must_poll()
49 }
50
51 fn register(&self, callback: Callback, state: Option<Arc<dyn Any>>) -> Registration {
52 self.inner.register(callback, state)
53 }
54}
55
56impl<T: ChangeToken> AsRef<T> for SharedChangeToken<T> {
57 fn as_ref(&self) -> &T {
58 &self.inner
59 }
60}
61
62impl<T: ChangeToken> Deref for SharedChangeToken<T> {
63 type Target = T;
64
65 fn deref(&self) -> &Self::Target {
66 &self.inner
67 }
68}
69
70impl<T: ChangeToken> Borrow<T> for SharedChangeToken<T> {
71 fn borrow(&self) -> &T {
72 &self.inner
73 }
74}
75
76unsafe impl<T: ChangeToken> Send for SharedChangeToken<T> {}
77unsafe impl<T: ChangeToken> Sync for SharedChangeToken<T> {}