
# Objective - Fixes https://github.com/bevyengine/bevy/issues/14328 - `DynamicMap::drain` was broken (indices weren't cleared, causing a panic when reading later) - `PartialReflect::apply` was broken for maps and sets, because they don't remove entries from the `self` map that aren't in the applied map. - I discovered this bug when implementing MapEntities on a Component containing a `HashMap<Entity, _>`. Because `apply` is used to reapply the changes to the reflected map, the map ended up littered with a ton of outdated entries. ## Solution - Remove the separate `Vec` in `DynamicMap` and use the `HashTable` directly, like it is in `DynamicSet`. - Replace `MapIter` by `Box<dyn Iterator>` (like for `DynamicSet`), and `Map::get_at` and `Map::get_at_mut` which are now unused. - Now assume `DynamicMap` types are unordered and adjust documentation accordingly. - Fix documentation of `DynamicSet` (ordered -> unordered) - Added `Map::retain` and `Set::retain`, and use them to remove excess entries in `PartialReflect::apply` implementations. ## Testing - Added `map::tests::apply` and `set::tests::apply` to validate `<DynamicMap as PartialReflect>::apply` and `<DynamicSet as PartialReflect>::apply`
810 B
810 B
title:
DynamicMap
is now unordered, Map::get_at
and Map::get_at_mut
are now removed, and apply
removes excess entries from reflected maps.
pull_requests: [19802]
DynamicMap
is now unordered, and the Map
trait no longer assumes implementors to be ordered. If you previously relied on them being ordered, you should now store a list of keys (Vec<Box<dyn PartialReflect>>
) separately.
Map::get_at
and Map::get_at_mut
are now removed. You should no longer use usize
to index into the map, and instead use &dyn PartialReflect
with Map::get
and Map::get_mut
.
PartialReflect::apply(self, other)
for maps now removes excess entries (entries present in self
which are not present in other
).
If you need those entries to be preserved, you will need to re-insert them manually.