You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.1 KiB
115 lines
3.1 KiB
//! broadcast object definitions
|
|
use super::*;
|
|
|
|
|
|
/// Object sent through the broadcast channel.
|
|
///
|
|
/// These objects can be cloned and downcasted, becaause they are atomically refcounted if that is more desireable.
|
|
#[derive(Clone)]
|
|
#[repr(transparent)]
|
|
pub struct ServiceEventObject(pub(super) Arc<dyn Any + Send + Sync + 'static>);
|
|
shim_debug!(ServiceEventObject);
|
|
|
|
/// A weak reference to a `ServiceEventObject`.
|
|
#[derive(Clone)]
|
|
#[repr(transparent)]
|
|
pub struct ServiceEventObjectRef(pub(super) Weak<dyn Any + Send + Sync + 'static>);
|
|
shim_debug!(ServiceEventObjectRef);
|
|
|
|
impl ServiceEventObjectRef
|
|
{
|
|
/// Try to upgrade to a concrete reference, and then clone the inner object.
|
|
pub fn try_clone(&self) -> Option<ServiceEventObject>
|
|
{
|
|
match self.0.upgrade()
|
|
{
|
|
Some(arc) => Some(ServiceEventObject(arc).clone()),
|
|
None => None
|
|
}
|
|
}
|
|
/// Try to upgrade to a concrete reference.
|
|
pub fn upgrade(self) -> Result<ServiceEventObject, Self>
|
|
{
|
|
match self.0.upgrade()
|
|
{
|
|
Some(arc) => Ok(ServiceEventObject(arc)),
|
|
None => Err(self),
|
|
}
|
|
}
|
|
|
|
/// Check if the object has not been destroyed yet.
|
|
pub fn is_alive(&self) -> bool
|
|
{
|
|
self.0.strong_count() > 0
|
|
}
|
|
}
|
|
|
|
|
|
impl ServiceEventObject
|
|
{
|
|
pub fn clone_inner(&self) -> Self
|
|
{
|
|
Self(Arc::from(self.0.clone_dyn_any_sync()))
|
|
}
|
|
/// Get a weak reference counted handle to the object, without cloning the object itself.
|
|
pub fn clone_weak(&self) -> ServiceEventObjectRef
|
|
{
|
|
ServiceEventObjectRef(Arc::downgrade(&self.0))
|
|
}
|
|
|
|
/// Try to downcast the inner object to a concrete type and then clone it.
|
|
///
|
|
/// This will fail if:
|
|
/// * The downcasted type is invalid
|
|
#[inline] pub fn downcast_clone<T: Any + Clone + Send + Sync + 'static>(&self) -> Option<T>
|
|
{
|
|
self.downcast_ref::<T>().map(|x| *x.clone_dyn_any().downcast().unwrap())
|
|
}
|
|
/// Try to consume this instance into downcast.
|
|
///
|
|
/// This will fail if:
|
|
/// * The downcasted type is invalid
|
|
/// * There are other references to this object (created through `clone_ref()`.).
|
|
pub fn try_into_downcast<T: Any + Send + Sync + 'static>(self) -> Result<T, Self>
|
|
{
|
|
match Arc::downcast(self.0)
|
|
{
|
|
Ok(v) => match Arc::try_unwrap(v) {
|
|
Ok(v) => Ok(v),
|
|
Err(s) => Err(Self(s)),
|
|
},
|
|
Err(e) => Err(Self(e)),
|
|
}
|
|
}
|
|
|
|
/// Check if there are any other references to this object
|
|
#[inline] pub fn is_unique(&self) -> bool
|
|
{
|
|
Arc::strong_count(&self.0) == 1
|
|
}
|
|
|
|
/// Try to downcast the object into a concrete type
|
|
#[inline] pub fn is<T: Any + Send + Sync + 'static>(&self) -> bool
|
|
{
|
|
self.0.as_ref().is::<T>()
|
|
}
|
|
/// Try to downcast the object into a concrete type
|
|
#[inline] pub fn downcast_ref<T: Any + Send + Sync + 'static>(&self) -> Option<&T>
|
|
{
|
|
self.0.as_ref().downcast_ref::<T>()
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
/// Error returned from trying to extract an object from a `ServiceEvent` which has none.
|
|
pub struct NoObjectError;
|
|
|
|
impl error::Error for NoObjectError{}
|
|
impl fmt::Display for NoObjectError
|
|
{
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
|
|
{
|
|
write!(f, "there was no object broadcasted along with this ")
|
|
}
|
|
}
|