tokens/
shared.rs

1use crate::{Callback, ChangeToken, DefaultChangeToken, Registration};
2use std::{borrow::Borrow, ops::Deref, sync::Arc, any::Any};
3
4/// Represents a shared [`ChangeToken`](crate::ChangeToken).
5pub struct SharedChangeToken<T: ChangeToken = DefaultChangeToken> {
6    inner: Arc<T>,
7}
8
9impl<T: ChangeToken> SharedChangeToken<T> {
10    /// Initializes a new shared change token.
11    /// 
12    /// # Arguments
13    /// 
14    /// * `token` - The [`ChangeToken`](crate::ChangeToken) to be shared
15    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> {}