
# 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`
12 lines
810 B
Markdown
12 lines
810 B
Markdown
---
|
|
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.
|