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:
parent
32023a5f6a
commit
b30ba78e16
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user