bevy/crates
Vic b039bf6768
implement UniqueEntityVec (#17549)
# Objective

In #16547, we added `EntitySet`s/`EntitySetIterator`s. We can know
whenever an iterator only contains unique entities, however we do not
yet have the ability to collect and reuse these without either the
unsafe `UniqueEntityIter::from_iterator_unchecked`, or the expensive
`HashSet::from_iter`.
An important piece for being able to do this is a `Vec` that maintains
the uniqueness property, can be collected into, and is itself
`EntitySet`.

A lot of entity collections are already intended to be "unique", but
have no way of expressing that when stored, other than using an
aforementioned `HashSet`. Such a type helps by limiting or even removing
the need for unsafe on the user side when not using a validated `Set`
type, and makes it easier to interface with other infrastructure like
f.e. `RelationshipSourceCollection`s.

## Solution

We implement `UniqueEntityVec`. 

This is a wrapper around `Vec`, that only ever contains unique elements.
It mirrors the API of `Vec`, however restricts any mutation as to not
violate the uniqueness guarantee. Meaning:
- Any inherent method which can introduce new elements or mutate
existing ones is now unsafe, f.e.: `insert`, `retain_mut`
- Methods that are impossible to use safely are omitted, f.e.: `fill`,
`extend_from_within`

A handful of the unsafe methods can do element-wise mutation
(`retain_mut`, `dedup_by`), which can be an unwind safety hazard were
the element-wise operation to panic. For those methods, we require that
each individual execution of the operation upholds uniqueness, not just
the entire method as a whole.

To be safe for mutable usage, slicing and the associated slice methods
require a matching `UniqueEntitySlice` type , which we leave for a
follow-up PR.

Because this type will deref into the `UniqueEntitySlice` type, we also
offer the immutable `Vec` methods on this type (which only amount to a
handful). "as inner" functionality is covered by additional
`as_vec`/`as_mut_vec` methods + `AsRef`/`Borrow` trait impls.
Like `UniqueEntityIter::from_iterator_unchecked`, this type has a
`from_vec_unchecked` method as well.

The canonical way to safely obtain this type however is via
`EntitySetIterator::collect_set` or
`UniqueEntityVec::from_entity_set_iter`. Like mentioned in #17513, these
are named suboptimally until supertrait item shadowing arrives, since a
normal `collect` will still run equality checks.
2025-01-28 06:00:59 +00:00
..
bevy_a11y Add no_std Support to bevy_a11y (#17505) 2025-01-23 03:52:47 +00:00
bevy_animation Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_app Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_asset Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_audio Relationships (non-fragmenting, one-to-many) (#17398) 2025-01-18 22:20:30 +00:00
bevy_color Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_core_pipeline Fix calculation of skybox rotation (#17476) 2025-01-28 05:27:22 +00:00
bevy_derive Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_dev_tools Adds update interval config for FpsOverlayPlugin (#17489) 2025-01-24 05:57:36 +00:00
bevy_diagnostic Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_dylib Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_ecs implement UniqueEntityVec (#17549) 2025-01-28 06:00:59 +00:00
bevy_encase_derive Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_gilrs Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_gizmos Move Resource trait to its own file (#17469) 2025-01-21 19:47:08 +00:00
bevy_gltf Add support for specular tints and maps per the KHR_materials_specular glTF extension. (#14069) 2025-01-26 20:38:46 +00:00
bevy_image Image::get_color_at_3d and Image::set_color_at_3d: Support 2D images with layers (#17548) 2025-01-28 05:58:37 +00:00
bevy_input added Hash to MouseScrollUnit; (#17538) 2025-01-26 22:24:50 +00:00
bevy_input_focus Refactored ComponentHook Parameters into HookContext (#17503) 2025-01-23 02:45:24 +00:00
bevy_internal Add support for specular tints and maps per the KHR_materials_specular glTF extension. (#14069) 2025-01-26 20:38:46 +00:00
bevy_log Move Resource trait to its own file (#17469) 2025-01-21 19:47:08 +00:00
bevy_macro_utils Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_math Reworked Segment types into their cartesian forms (#17404) 2025-01-19 03:54:45 +00:00
bevy_mesh Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_mikktspace Move #![warn(clippy::allow_attributes, clippy::allow_attributes_without_reason)] to the workspace Cargo.toml (#17374) 2025-01-15 01:14:58 +00:00
bevy_pbr Reflect and register the wireframe materials (#17334) 2025-01-28 05:19:34 +00:00
bevy_picking Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_platform_support Fix Typo in bevy_platform_support's spin Feature (#17516) 2025-01-23 21:47:21 +00:00
bevy_ptr Update safety docs for Ptr::assert_unique (#17394) 2025-01-16 03:25:19 +00:00
bevy_reflect Rename ArgList::push methods to with and add new push methods which take &mut self (#16567) 2025-01-28 05:06:50 +00:00
bevy_remote Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_render Update render_resource gpu buffer doc comments (#17118) 2025-01-28 05:13:04 +00:00
bevy_scene Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_sprite Reflect and register the wireframe materials (#17334) 2025-01-28 05:19:34 +00:00
bevy_state Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_tasks Move spin to bevy_platform_support out of other crates (#17470) 2025-01-23 05:27:02 +00:00
bevy_text Proportional scaling for the sprite's texture. (#17258) 2025-01-24 18:24:02 +00:00
bevy_time Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_transform Parent -> ChildOf (#17427) 2025-01-20 22:13:29 +00:00
bevy_ui expose OverflowAxis::Hidden as Overflow functions (#17528) 2025-01-28 05:34:50 +00:00
bevy_utils Move hashbrown and foldhash out of bevy_utils (#17460) 2025-01-23 16:46:08 +00:00
bevy_window Move spin to bevy_platform_support out of other crates (#17470) 2025-01-23 05:27:02 +00:00
bevy_winit Automatically transform cursor hotspot user asks to flip cursor image (#17540) 2025-01-28 05:49:46 +00:00