Skip to content

Commit 2e3af84

Browse files
committed
Add remove resource to commands (#1478)
resolves #1468 Co-authored-by: Niklas Eicker <git@nikl.me>
1 parent f73c6d1 commit 2e3af84

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

crates/bevy_ecs/src/resource/resources.rs

+6
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,10 @@ impl Resources {
345345
resource_data.storage.clear_trackers();
346346
}
347347
}
348+
349+
pub fn remove<T: Resource>(&mut self) {
350+
self.resource_data.remove(&TypeId::of::<T>());
351+
}
348352
}
349353

350354
unsafe impl Send for Resources {}
@@ -534,6 +538,8 @@ mod tests {
534538
222
535539
);
536540
assert_eq!(*resources.get::<i32>().expect("resource exists"), 123);
541+
resources.remove::<i32>();
542+
assert!(resources.get::<i32>().is_none());
537543
}
538544

539545
#[test]

crates/bevy_ecs/src/system/commands.rs

+47
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,16 @@ impl<T: Resource> Command for InsertResource<T> {
165165
}
166166
}
167167

168+
pub struct RemoveResource<T: Resource> {
169+
phantom: PhantomData<T>,
170+
}
171+
172+
impl<T: Resource> Command for RemoveResource<T> {
173+
fn write(self: Box<Self>, _world: &mut World, resources: &mut Resources) {
174+
resources.remove::<T>();
175+
}
176+
}
177+
168178
#[derive(Debug)]
169179
pub(crate) struct InsertLocalResource<T: Resource> {
170180
resource: T,
@@ -304,6 +314,12 @@ impl Commands {
304314
})
305315
}
306316

317+
pub fn remove_resource<T: Resource>(&mut self) -> &mut Self {
318+
self.add_command(RemoveResource::<T> {
319+
phantom: PhantomData,
320+
})
321+
}
322+
307323
/// Adds a bundle of components to the current entity.
308324
///
309325
/// See [`Self::with`], [`Self::current_entity`].
@@ -411,6 +427,7 @@ impl Commands {
411427
#[cfg(test)]
412428
mod tests {
413429
use crate::{resource::Resources, Commands, World};
430+
use core::any::TypeId;
414431

415432
#[test]
416433
fn command_buffer() {
@@ -466,4 +483,34 @@ mod tests {
466483
let results_after_u64 = world.query::<&u64>().map(|a| *a).collect::<Vec<_>>();
467484
assert_eq!(results_after_u64, vec![]);
468485
}
486+
487+
#[test]
488+
fn remove_resources() {
489+
let mut world = World::default();
490+
let mut resources = Resources::default();
491+
let mut command_buffer = Commands::default();
492+
command_buffer.insert_resource(123);
493+
command_buffer.insert_resource(456.0);
494+
command_buffer.apply(&mut world, &mut resources);
495+
assert_eq!(
496+
resources.resource_data.contains_key(&TypeId::of::<i32>()),
497+
true
498+
);
499+
assert_eq!(
500+
resources.resource_data.contains_key(&TypeId::of::<f64>()),
501+
true
502+
);
503+
504+
// test resource removal
505+
command_buffer.remove_resource::<i32>();
506+
command_buffer.apply(&mut world, &mut resources);
507+
assert_eq!(
508+
resources.resource_data.contains_key(&TypeId::of::<i32>()),
509+
false
510+
);
511+
assert_eq!(
512+
resources.resource_data.contains_key(&TypeId::of::<f64>()),
513+
true
514+
);
515+
}
469516
}

0 commit comments

Comments
 (0)