implement DetectChanges for NonSendMut (#2326)
# Objective - The `DetectChanges` trait is used for types that detect change on mutable access (such as `ResMut`, `Mut`, etc...) - `DetectChanges` was not implemented for `NonSendMut` ## Solution - implement `NonSendMut` in terms of `DetectChanges`
This commit is contained in:
parent
63047b2417
commit
b07b2f524e
@ -150,6 +150,25 @@ change_detection_impl!(ResMut<'a, T>, T, Component);
|
||||
impl_into_inner!(ResMut<'a, T>, T, Component);
|
||||
impl_debug!(ResMut<'a, T>, Component);
|
||||
|
||||
/// Unique borrow of a non-[`Send`] resource.
|
||||
///
|
||||
/// Only [`Send`] resources may be accessed with the [`ResMut`] [`SystemParam`]. In case that the
|
||||
/// resource does not implement `Send`, this `SystemParam` wrapper can be used. This will instruct
|
||||
/// the scheduler to instead run the system on the main thread so that it doesn't send the resource
|
||||
/// over to another thread.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics when used as a `SystemParameter` if the resource does not exist.
|
||||
pub struct NonSendMut<'a, T: 'static> {
|
||||
pub(crate) value: &'a mut T,
|
||||
pub(crate) ticks: Ticks<'a>,
|
||||
}
|
||||
|
||||
change_detection_impl!(NonSendMut<'a, T>, T,);
|
||||
impl_into_inner!(NonSendMut<'a, T>, T,);
|
||||
impl_debug!(NonSendMut<'a, T>,);
|
||||
|
||||
/// Unique mutable borrow of an entity's component
|
||||
pub struct Mut<'a, T> {
|
||||
pub(crate) value: &'a mut T,
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
pub use crate::change_detection::ResMut;
|
||||
pub use crate::change_detection::{NonSendMut, ResMut};
|
||||
use crate::{
|
||||
archetype::{Archetype, Archetypes},
|
||||
bundle::Bundles,
|
||||
@ -798,61 +798,6 @@ impl<'a, T: 'static> SystemParamFetch<'a> for NonSendState<T> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Unique borrow of a non-[`Send`] resource.
|
||||
///
|
||||
/// Only `Send` resources may be accessed with the [`ResMut`] [`SystemParam`]. In case that the
|
||||
/// resource does not implement `Send`, this `SystemParam` wrapper can be used. This will instruct
|
||||
/// the scheduler to instead run the system on the main thread so that it doesn't send the resource
|
||||
/// over to another thread.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics when used as a `SystemParameter` if the resource does not exist.
|
||||
pub struct NonSendMut<'a, T: 'static> {
|
||||
pub(crate) value: &'a mut T,
|
||||
ticks: &'a mut ComponentTicks,
|
||||
last_change_tick: u32,
|
||||
change_tick: u32,
|
||||
}
|
||||
|
||||
impl<'w, T: Component> NonSendMut<'w, T> {
|
||||
/// Returns true if (and only if) this resource been added since the last execution of this
|
||||
/// system.
|
||||
pub fn is_added(&self) -> bool {
|
||||
self.ticks.is_added(self.last_change_tick, self.change_tick)
|
||||
}
|
||||
|
||||
/// Returns true if (and only if) this resource been changed since the last execution of this
|
||||
/// system.
|
||||
pub fn is_changed(&self) -> bool {
|
||||
self.ticks
|
||||
.is_changed(self.last_change_tick, self.change_tick)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: 'static> Deref for NonSendMut<'a, T> {
|
||||
type Target = T;
|
||||
|
||||
#[inline]
|
||||
fn deref(&self) -> &T {
|
||||
self.value
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: 'static> DerefMut for NonSendMut<'a, T> {
|
||||
#[inline]
|
||||
fn deref_mut(&mut self) -> &mut T {
|
||||
self.ticks.set_changed(self.change_tick);
|
||||
self.value
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: 'static + core::fmt::Debug> core::fmt::Debug for NonSendMut<'a, T> {
|
||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||
f.debug_tuple("NonSendMut").field(&self.value).finish()
|
||||
}
|
||||
}
|
||||
|
||||
/// The [`SystemParamState`] of [`NonSendMut`].
|
||||
pub struct NonSendMutState<T> {
|
||||
component_id: ComponentId,
|
||||
@ -922,9 +867,11 @@ impl<'a, T: 'static> SystemParamFetch<'a> for NonSendMutState<T> {
|
||||
});
|
||||
NonSendMut {
|
||||
value: &mut *column.get_data_ptr().cast::<T>().as_ptr(),
|
||||
ticks: &mut *column.get_ticks_mut_ptr_unchecked(0),
|
||||
last_change_tick: system_meta.last_change_tick,
|
||||
change_tick,
|
||||
ticks: Ticks {
|
||||
component_ticks: &mut *column.get_ticks_mut_ptr_unchecked(0),
|
||||
last_change_tick: system_meta.last_change_tick,
|
||||
change_tick,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user