Skip to content

Commit ee18073

Browse files
authored
Implement MapEntities for arrays, HashMap, BTreeMap, IndexMap (#19908)
# Objective - `MapEntities` is not implemented for arrays, `HashMap`, `BTreeMap`, and `IndexMap`. ## Solution - Implement `MapEntities` for arrays, `HashMap`, `BTreeMap`, `IndexMap` ## Testing - I didn't add a test for this as the implementations seems pretty trivial
1 parent 9e0c66b commit ee18073

File tree

1 file changed

+58
-8
lines changed

1 file changed

+58
-8
lines changed

crates/bevy_ecs/src/entity/map_entities.rs

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
pub use bevy_ecs_macros::MapEntities;
2-
use indexmap::IndexSet;
2+
use indexmap::{IndexMap, IndexSet};
33

44
use crate::{
55
entity::{hash_map::EntityHashMap, Entity},
66
world::World,
77
};
88

99
use alloc::{
10-
collections::{BTreeSet, VecDeque},
10+
collections::{BTreeMap, BTreeSet, VecDeque},
1111
vec::Vec,
1212
};
13-
use bevy_platform::collections::HashSet;
14-
use core::{hash::BuildHasher, mem};
13+
use bevy_platform::collections::{HashMap, HashSet};
14+
use core::{
15+
hash::{BuildHasher, Hash},
16+
mem,
17+
};
1518
use smallvec::SmallVec;
1619

1720
use super::EntityIndexSet;
@@ -72,9 +75,22 @@ impl<T: MapEntities> MapEntities for Option<T> {
7275
}
7376
}
7477

75-
impl<T: MapEntities + Eq + core::hash::Hash, S: BuildHasher + Default> MapEntities
76-
for HashSet<T, S>
78+
impl<K: MapEntities + Eq + Hash, V: MapEntities, S: BuildHasher + Default> MapEntities
79+
for HashMap<K, V, S>
7780
{
81+
fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
82+
*self = self
83+
.drain()
84+
.map(|(mut key_entities, mut value_entities)| {
85+
key_entities.map_entities(entity_mapper);
86+
value_entities.map_entities(entity_mapper);
87+
(key_entities, value_entities)
88+
})
89+
.collect();
90+
}
91+
}
92+
93+
impl<T: MapEntities + Eq + Hash, S: BuildHasher + Default> MapEntities for HashSet<T, S> {
7894
fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
7995
*self = self
8096
.drain()
@@ -86,9 +102,22 @@ impl<T: MapEntities + Eq + core::hash::Hash, S: BuildHasher + Default> MapEntiti
86102
}
87103
}
88104

89-
impl<T: MapEntities + Eq + core::hash::Hash, S: BuildHasher + Default> MapEntities
90-
for IndexSet<T, S>
105+
impl<K: MapEntities + Eq + Hash, V: MapEntities, S: BuildHasher + Default> MapEntities
106+
for IndexMap<K, V, S>
91107
{
108+
fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
109+
*self = self
110+
.drain(..)
111+
.map(|(mut key_entities, mut value_entities)| {
112+
key_entities.map_entities(entity_mapper);
113+
value_entities.map_entities(entity_mapper);
114+
(key_entities, value_entities)
115+
})
116+
.collect();
117+
}
118+
}
119+
120+
impl<T: MapEntities + Eq + Hash, S: BuildHasher + Default> MapEntities for IndexSet<T, S> {
92121
fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
93122
*self = self
94123
.drain(..)
@@ -109,6 +138,19 @@ impl MapEntities for EntityIndexSet {
109138
}
110139
}
111140

141+
impl<K: MapEntities + Ord, V: MapEntities> MapEntities for BTreeMap<K, V> {
142+
fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
143+
*self = mem::take(self)
144+
.into_iter()
145+
.map(|(mut key_entities, mut value_entities)| {
146+
key_entities.map_entities(entity_mapper);
147+
value_entities.map_entities(entity_mapper);
148+
(key_entities, value_entities)
149+
})
150+
.collect();
151+
}
152+
}
153+
112154
impl<T: MapEntities + Ord> MapEntities for BTreeSet<T> {
113155
fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
114156
*self = mem::take(self)
@@ -121,6 +163,14 @@ impl<T: MapEntities + Ord> MapEntities for BTreeSet<T> {
121163
}
122164
}
123165

166+
impl<T: MapEntities, const N: usize> MapEntities for [T; N] {
167+
fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
168+
for entities in self.iter_mut() {
169+
entities.map_entities(entity_mapper);
170+
}
171+
}
172+
}
173+
124174
impl<T: MapEntities> MapEntities for Vec<T> {
125175
fn map_entities<E: EntityMapper>(&mut self, entity_mapper: &mut E) {
126176
for entities in self.iter_mut() {

0 commit comments

Comments
 (0)