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:
parent
397b6df023
commit
fcb77d6988
@ -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
|
||||||
|
|||||||
@ -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| {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user