use std::any::*;
pub trait AsAnyRef {
fn as_any_ref(&self) -> Option<&dyn Any>;
}
#[macro_export]
macro_rules! impl_as_any_ref {
( $type:ty $(,)? ) => {
impl ::kutil::std::any::AsAnyRef for $type {
fn as_any_ref(&self) -> Option<&dyn ::std::any::Any> {
Some(self)
}
}
};
}
pub trait DowncastRef {
fn downcast_ref<AnyT>(&self) -> Option<&AnyT>
where
AnyT: 'static;
}
impl<AsAnyRefT> DowncastRef for AsAnyRefT
where
AsAnyRefT: AsAnyRef,
{
fn downcast_ref<AnyT>(&self) -> Option<&AnyT>
where
AnyT: 'static,
{
self.as_any_ref().and_then(|any| any.downcast_ref())
}
}
#[allow(unused_imports)]
pub use impl_as_any_ref;