diff --git a/crates/bevy_ecs/src/change_detection.rs b/crates/bevy_ecs/src/change_detection.rs index b77abaa6cb25a..b116a2efd371e 100644 --- a/crates/bevy_ecs/src/change_detection.rs +++ b/crates/bevy_ecs/src/change_detection.rs @@ -125,10 +125,17 @@ pub trait DetectChangesMut: DetectChanges { /// /// This is useful to ensure change detection is only triggered when the underlying value /// changes, instead of every time [`DerefMut`] is used. - fn set_if_neq(&mut self, value: Target) + #[inline] + fn set_if_neq(&mut self, value: Self::Inner) where - Self: Deref + DerefMut, - Target: PartialEq; + Self::Inner: Sized + PartialEq, + { + let old = self.bypass_change_detection(); + if *old != value { + *old = value; + self.set_changed(); + } + } } macro_rules! change_detection_impl { @@ -195,19 +202,6 @@ macro_rules! change_detection_mut_impl { fn bypass_change_detection(&mut self) -> &mut Self::Inner { self.value } - - #[inline] - fn set_if_neq(&mut self, value: Target) - where - Self: Deref + DerefMut, - Target: PartialEq, - { - // This dereference is immutable, so does not trigger change detection - if *::deref(self) != value { - // `DerefMut` usage triggers change detection - *::deref_mut(self) = value; - } - } } impl<$($generics),* : ?Sized $(+ $traits)?> DerefMut for $name<$($generics),*> { @@ -682,19 +676,6 @@ impl<'a> DetectChangesMut for MutUntyped<'a> { fn bypass_change_detection(&mut self) -> &mut Self::Inner { &mut self.value } - - #[inline] - fn set_if_neq(&mut self, value: Target) - where - Self: Deref + DerefMut, - Target: PartialEq, - { - // This dereference is immutable, so does not trigger change detection - if *::deref(self) != value { - // `DerefMut` usage triggers change detection - *::deref_mut(self) = value; - } - } } impl std::fmt::Debug for MutUntyped<'_> {