use super::*;
impl World {
pub fn insert_resource<R: 'static>(&mut self, resource: R) -> Option<R> {
assert_ne!(
std::any::TypeId::of::<R>(),
std::any::TypeId::of::<Time>(),
"Time is permanent World frame state and cannot be inserted"
);
self.bump_resource_epoch();
self.resources.insert(resource)
}
pub fn get_resource<R: 'static>(&self) -> Option<&R> {
if std::any::TypeId::of::<R>() == std::any::TypeId::of::<Time>() {
return Some(unsafe { &*std::ptr::from_ref(&self.time).cast::<R>() });
}
self.resources.get::<R>()
}
pub fn get_resource_mut<R: 'static>(&mut self) -> Option<&mut R> {
if std::any::TypeId::of::<R>() == std::any::TypeId::of::<Time>() {
return Some(unsafe { &mut *std::ptr::from_mut(&mut self.time).cast::<R>() });
}
self.resources.get_mut::<R>()
}
pub fn contains_resource<R: 'static>(&self) -> bool {
if std::any::TypeId::of::<R>() == std::any::TypeId::of::<Time>() {
return true;
}
self.resources.contains::<R>()
}
pub(crate) fn contains_resource_id(&self, id: std::any::TypeId) -> bool {
id == std::any::TypeId::of::<Time>() || self.resources.contains_id(id)
}
pub fn remove_resource<R: 'static>(&mut self) -> Option<R> {
assert_ne!(
std::any::TypeId::of::<R>(),
std::any::TypeId::of::<Time>(),
"Time is permanent World frame state and cannot be removed"
);
if !self.resources.contains::<R>() {
return None;
}
self.bump_resource_epoch();
self.resources.remove::<R>()
}
pub(crate) fn resource_epoch(&self) -> u64 {
self.resource_epoch
}
pub(crate) fn resource_ptr<R: 'static>(&self) -> Option<*mut R> {
if std::any::TypeId::of::<R>() == std::any::TypeId::of::<Time>() {
return Some(std::ptr::from_ref(&self.time).cast::<R>().cast_mut());
}
self.resources
.get::<R>()
.map(|resource| std::ptr::from_ref(resource).cast_mut())
}
}