#[cfg(test)]
mod tests;
use std::any::TypeId;
use crate::Resource;
impl dyn Resource {
#[inline]
pub fn downcast<T: Resource>(self: Box<Self>) -> Result<Box<T>, Box<Self>> {
if self.is::<T>() {
unsafe { Ok(self.downcast_unchecked()) }
} else {
Err(self)
}
}
#[inline]
pub unsafe fn downcast_unchecked<T: Resource>(self: Box<Self>) -> Box<T> {
unsafe { Box::from_raw(Box::into_raw(self) as *mut T) }
}
#[inline]
pub fn is<T: Resource>(&self) -> bool {
TypeId::of::<T>() == self.type_id()
}
#[inline]
pub fn downcast_ref<T: Resource>(&self) -> Option<&T> {
if self.is::<T>() {
unsafe { Some(self.downcast_ref_unchecked()) }
} else {
Option::None
}
}
#[inline]
pub unsafe fn downcast_ref_unchecked<T: Resource>(&self) -> &T {
unsafe { &*(self as *const Self as *const T) }
}
#[inline]
pub fn downcast_mut<T: Resource>(&mut self) -> Option<&mut T> {
if self.is::<T>() {
unsafe { Some(self.downcast_mut_unchecked()) }
} else {
Option::None
}
}
#[inline]
pub unsafe fn downcast_mut_unchecked<T: Resource>(&mut self) -> &mut T {
unsafe { &mut *(self as *mut Self as *mut T) }
}
}