remove ReflectMut in favor of Mut<dyn Reflect> (#5630)

# Objective

- `ReflectMut` served no purpose that wasn't met by `Mut<dyn Reflect>` which is easier to understand since you have to deal with fewer types
- there is another `ReflectMut` type that could be confused with this one

## Solution/Changelog

- relax `T: ?Sized` bound in `Mut<T>`
- replace all instances of `ReflectMut` with `Mut<dyn Reflect>`
This commit is contained in:
Jakob Hellermann 2022-08-09 16:19:34 +00:00
parent 397b6df023
commit fcb77d6988
2 changed files with 20 additions and 28 deletions

View File

@ -2,7 +2,6 @@
use crate::{component::ComponentTicks, ptr::PtrMut, system::Resource}; use crate::{component::ComponentTicks, ptr::PtrMut, system::Resource};
#[cfg(feature = "bevy_reflect")] #[cfg(feature = "bevy_reflect")]
use bevy_reflect::Reflect;
use std::ops::{Deref, DerefMut}; use std::ops::{Deref, DerefMut};
/// The (arbitrarily chosen) minimum number of world tick increments between `check_tick` scans. /// The (arbitrarily chosen) minimum number of world tick increments between `check_tick` scans.
@ -230,7 +229,7 @@ impl<'a, T: 'static> From<NonSendMut<'a, T>> for Mut<'a, T> {
} }
/// Unique mutable borrow of an entity's component /// Unique mutable borrow of an entity's component
pub struct Mut<'a, T> { pub struct Mut<'a, T: ?Sized> {
pub(crate) value: &'a mut T, pub(crate) value: &'a mut T,
pub(crate) ticks: Ticks<'a>, pub(crate) ticks: Ticks<'a>,
} }
@ -239,18 +238,6 @@ change_detection_impl!(Mut<'a, T>, T,);
impl_into_inner!(Mut<'a, T>, T,); impl_into_inner!(Mut<'a, T>, T,);
impl_debug!(Mut<'a, T>,); impl_debug!(Mut<'a, T>,);
/// Unique mutable borrow of a reflected component or resource
#[cfg(feature = "bevy_reflect")]
pub struct ReflectMut<'a> {
pub(crate) value: &'a mut dyn Reflect,
pub(crate) ticks: Ticks<'a>,
}
#[cfg(feature = "bevy_reflect")]
change_detection_impl!(ReflectMut<'a>, dyn Reflect,);
#[cfg(feature = "bevy_reflect")]
impl_into_inner!(ReflectMut<'a>, dyn Reflect,);
/// Unique mutable borrow of resources or an entity's component. /// Unique mutable borrow of resources or an entity's component.
/// ///
/// Similar to [`Mut`], but not generic over the component type, instead /// Similar to [`Mut`], but not generic over the component type, instead

View File

@ -1,7 +1,7 @@
//! Types that enable reflection support. //! Types that enable reflection support.
pub use crate::change_detection::ReflectMut;
use crate::{ use crate::{
change_detection::Mut,
component::Component, component::Component,
entity::{Entity, EntityMap, MapEntities, MapEntitiesError}, entity::{Entity, EntityMap, MapEntities, MapEntitiesError},
system::Resource, system::Resource,
@ -23,7 +23,7 @@ pub struct ReflectComponent {
apply_or_insert: fn(&mut World, Entity, &dyn Reflect), apply_or_insert: fn(&mut World, Entity, &dyn Reflect),
remove: fn(&mut World, Entity), remove: fn(&mut World, Entity),
reflect: fn(&World, Entity) -> Option<&dyn Reflect>, reflect: fn(&World, Entity) -> Option<&dyn Reflect>,
reflect_mut: unsafe fn(&World, Entity) -> Option<ReflectMut>, reflect_mut: unsafe fn(&World, Entity) -> Option<Mut<dyn Reflect>>,
copy: fn(&World, &mut World, Entity, Entity), copy: fn(&World, &mut World, Entity, Entity),
} }
@ -70,7 +70,11 @@ impl ReflectComponent {
} }
/// Gets the value of this [`Component`] type from the entity as a mutable reflected reference. /// Gets the value of this [`Component`] type from the entity as a mutable reflected reference.
pub fn reflect_mut<'a>(&self, world: &'a mut World, entity: Entity) -> Option<ReflectMut<'a>> { pub fn reflect_mut<'a>(
&self,
world: &'a mut World,
entity: Entity,
) -> Option<Mut<'a, dyn Reflect>> {
// SAFETY: unique world access // SAFETY: unique world access
unsafe { (self.reflect_mut)(world, entity) } unsafe { (self.reflect_mut)(world, entity) }
} }
@ -85,7 +89,7 @@ impl ReflectComponent {
&self, &self,
world: &'a World, world: &'a World,
entity: Entity, entity: Entity,
) -> Option<ReflectMut<'a>> { ) -> Option<Mut<'a, dyn Reflect>> {
(self.reflect_mut)(world, entity) (self.reflect_mut)(world, entity)
} }
@ -155,7 +159,7 @@ impl<C: Component + Reflect + FromWorld> FromType<C> for ReflectComponent {
world world
.get_entity(entity)? .get_entity(entity)?
.get_unchecked_mut::<C>(world.last_change_tick(), world.read_change_tick()) .get_unchecked_mut::<C>(world.last_change_tick(), world.read_change_tick())
.map(|c| ReflectMut { .map(|c| Mut {
value: c.value as &mut dyn Reflect, value: c.value as &mut dyn Reflect,
ticks: c.ticks, ticks: c.ticks,
}) })
@ -176,7 +180,7 @@ pub struct ReflectResource {
apply_or_insert: fn(&mut World, &dyn Reflect), apply_or_insert: fn(&mut World, &dyn Reflect),
remove: fn(&mut World), remove: fn(&mut World),
reflect: fn(&World) -> Option<&dyn Reflect>, reflect: fn(&World) -> Option<&dyn Reflect>,
reflect_unchecked_mut: unsafe fn(&World) -> Option<ReflectMut>, reflect_unchecked_mut: unsafe fn(&World) -> Option<Mut<dyn Reflect>>,
copy: fn(&World, &mut World), copy: fn(&World, &mut World),
} }
@ -211,7 +215,7 @@ impl ReflectResource {
} }
/// Gets the value of this [`Resource`] type from the world as a mutable reflected reference. /// Gets the value of this [`Resource`] type from the world as a mutable reflected reference.
pub fn reflect_mut<'a>(&self, world: &'a mut World) -> Option<ReflectMut<'a>> { pub fn reflect_mut<'a>(&self, world: &'a mut World) -> Option<Mut<'a, dyn Reflect>> {
// SAFETY: unique world access // SAFETY: unique world access
unsafe { (self.reflect_unchecked_mut)(world) } unsafe { (self.reflect_unchecked_mut)(world) }
} }
@ -222,7 +226,10 @@ impl ReflectResource {
/// * Only call this method in an exclusive system to avoid sharing across threads (or use a /// * Only call this method in an exclusive system to avoid sharing across threads (or use a
/// scheduler that enforces safe memory access). /// scheduler that enforces safe memory access).
/// * Don't call this method more than once in the same scope for a given [`Resource`]. /// * Don't call this method more than once in the same scope for a given [`Resource`].
pub unsafe fn reflect_unchecked_mut<'a>(&self, world: &'a World) -> Option<ReflectMut<'a>> { pub unsafe fn reflect_unchecked_mut<'a>(
&self,
world: &'a World,
) -> Option<Mut<'a, dyn Reflect>> {
// SAFETY: caller promises to uphold uniqueness guarantees // SAFETY: caller promises to uphold uniqueness guarantees
(self.reflect_unchecked_mut)(world) (self.reflect_unchecked_mut)(world)
} }
@ -266,12 +273,10 @@ impl<C: Resource + Reflect + FromWorld> FromType<C> for ReflectResource {
// SAFETY: all usages of `reflect_unchecked_mut` guarantee that there is either a single mutable // SAFETY: all usages of `reflect_unchecked_mut` guarantee that there is either a single mutable
// reference or multiple immutable ones alive at any given point // reference or multiple immutable ones alive at any given point
unsafe { unsafe {
world world.get_resource_unchecked_mut::<C>().map(|res| Mut {
.get_resource_unchecked_mut::<C>() value: res.value as &mut dyn Reflect,
.map(|res| ReflectMut { ticks: res.ticks,
value: res.value as &mut dyn Reflect, })
ticks: res.ticks,
})
} }
}, },
copy: |source_world, destination_world| { copy: |source_world, destination_world| {