use core::any::Any;
pub trait Dyn: Any {
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn as_any_box(self: Box<Self>) -> Box<dyn Any>;
}
impl<T: Any> Dyn for T {
#[inline(always)]
fn as_any(&self) -> &dyn Any {
self
}
#[inline(always)]
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline(always)]
fn as_any_box(self: Box<Self>) -> Box<dyn Any> {
self
}
}
pub trait Downcast: Dyn {
#[inline]
fn is<T: Dyn>(&self) -> bool {
self.as_any().is::<T>()
}
#[inline]
fn downcast_ref<T: Dyn>(&self) -> Option<&T> {
self.as_any().downcast_ref()
}
#[inline]
fn downcast_mut<T: Dyn>(&mut self) -> Option<&mut T> {
self.as_any_mut().downcast_mut()
}
}
impl<T: ?Sized + Dyn> Downcast for T {}