Add a wrapper around Entity for RemovedComponents (#7503)

# Objective

- Make the internals of `RemovedComponents` clearer


## Solution

- Add a wrapper around `Entity`, used in `RemovedComponents` as `Events<RemovedComponentsEntity>`

---

## Changelog

- `RemovedComponents` now internally uses an `Events<RemovedComponentsEntity>` instead of an `Events<Entity>`
This commit is contained in:
CatThingy 2023-02-05 15:37:07 +00:00
parent 32023a5f6a
commit b30ba78e16
2 changed files with 27 additions and 9 deletions

View File

@ -19,14 +19,25 @@ use std::{
option, option,
}; };
/// Wrapper around a [`ManualEventReader<Entity>`] so that we /// Wrapper around [`Entity`] for [`RemovedComponents`].
/// Internally, `RemovedComponents` uses these as an `Events<RemovedComponentEntity>`.
#[derive(Debug, Clone)]
pub struct RemovedComponentEntity(Entity);
impl From<RemovedComponentEntity> for Entity {
fn from(value: RemovedComponentEntity) -> Self {
value.0
}
}
/// Wrapper around a [`ManualEventReader<RemovedComponentEntity>`] so that we
/// can differentiate events between components. /// can differentiate events between components.
#[derive(Debug)] #[derive(Debug)]
pub struct RemovedComponentReader<T> pub struct RemovedComponentReader<T>
where where
T: Component, T: Component,
{ {
reader: ManualEventReader<Entity>, reader: ManualEventReader<RemovedComponentEntity>,
marker: PhantomData<T>, marker: PhantomData<T>,
} }
@ -40,7 +51,7 @@ impl<T: Component> Default for RemovedComponentReader<T> {
} }
impl<T: Component> Deref for RemovedComponentReader<T> { impl<T: Component> Deref for RemovedComponentReader<T> {
type Target = ManualEventReader<Entity>; type Target = ManualEventReader<RemovedComponentEntity>;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
&self.reader &self.reader
} }
@ -52,11 +63,11 @@ impl<T: Component> DerefMut for RemovedComponentReader<T> {
} }
} }
/// Wrapper around a map of components to [`Events<Entity>`]. /// Wrapper around a map of components to [`Events<RemovedComponentEntity>`].
/// So that we can find the events without naming the type directly. /// So that we can find the events without naming the type directly.
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct RemovedComponentEvents { pub struct RemovedComponentEvents {
event_sets: SparseSet<ComponentId, Events<Entity>>, event_sets: SparseSet<ComponentId, Events<RemovedComponentEntity>>,
} }
impl RemovedComponentEvents { impl RemovedComponentEvents {
@ -70,14 +81,17 @@ impl RemovedComponentEvents {
} }
} }
pub fn get(&self, component_id: impl Into<ComponentId>) -> Option<&Events<Entity>> { pub fn get(
&self,
component_id: impl Into<ComponentId>,
) -> Option<&Events<RemovedComponentEntity>> {
self.event_sets.get(component_id.into()) self.event_sets.get(component_id.into())
} }
pub fn send(&mut self, component_id: impl Into<ComponentId>, entity: Entity) { pub fn send(&mut self, component_id: impl Into<ComponentId>, entity: Entity) {
self.event_sets self.event_sets
.get_or_insert_with(component_id.into(), Default::default) .get_or_insert_with(component_id.into(), Default::default)
.send(entity); .send(RemovedComponentEntity(entity));
} }
} }
@ -122,8 +136,10 @@ pub struct RemovedComponents<'w, 's, T: Component> {
/// Iterator over entities that had a specific component removed. /// Iterator over entities that had a specific component removed.
/// ///
/// See [`RemovedComponents`]. /// See [`RemovedComponents`].
pub type RemovedIter<'a> = pub type RemovedIter<'a> = iter::Map<
iter::Flatten<option::IntoIter<iter::Cloned<ManualEventIterator<'a, Entity>>>>; iter::Flatten<option::IntoIter<iter::Cloned<ManualEventIterator<'a, RemovedComponentEntity>>>>,
fn(RemovedComponentEntity) -> Entity,
>;
impl<'w, 's, T: Component> RemovedComponents<'w, 's, T> { impl<'w, 's, T: Component> RemovedComponents<'w, 's, T> {
pub fn iter(&mut self) -> RemovedIter<'_> { pub fn iter(&mut self) -> RemovedIter<'_> {
@ -132,6 +148,7 @@ impl<'w, 's, T: Component> RemovedComponents<'w, 's, T> {
.map(|events| self.reader.iter(events).cloned()) .map(|events| self.reader.iter(events).cloned())
.into_iter() .into_iter()
.flatten() .flatten()
.map(RemovedComponentEntity::into)
} }
} }

View File

@ -788,6 +788,7 @@ impl World {
.map(|removed| removed.iter_current_update_events().cloned()) .map(|removed| removed.iter_current_update_events().cloned())
.into_iter() .into_iter()
.flatten() .flatten()
.map(|e| e.into())
} }
/// Initializes a new resource and returns the [`ComponentId`] created for it. /// Initializes a new resource and returns the [`ComponentId`] created for it.