use crate::util;
use std::any::Any;
pub trait AnyBase: Any {
fn type_name(&self) -> &'static str;
fn single_name(&self) -> &'static str;
fn as_any_ref(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
}
impl<T: Any> AnyBase for T {
#[inline(always)]
fn type_name(&self) -> &'static str {
std::any::type_name::<T>()
}
#[inline(always)]
fn single_name(&self) -> &'static str {
util::single_type_name::<T>()
}
#[inline(always)]
fn as_any_ref(&self) -> &dyn Any {
self
}
#[inline(always)]
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
pub trait AnyTo: AnyBase {
#[inline]
fn is<T>(&self) -> bool
where
T: AnyBase,
{
self.as_any_ref().is::<T>()
}
#[inline]
fn downcast_ref<T>(&self) -> Option<&T>
where
T: AnyBase,
{
self.as_any_ref().downcast_ref()
}
#[inline]
fn downcast_mut<T>(&mut self) -> Option<&mut T>
where
T: AnyBase,
{
self.as_any_mut().downcast_mut()
}
}
impl<T: ?Sized + AnyBase> AnyTo for T {}
pub mod action;
pub mod component;
pub mod package;
pub mod theme;