Add a public constructor for Mut<T> (#7931)
				
					
				
			This commit is contained in:
		
							parent
							
								
									545965075f
								
							
						
					
					
						commit
						21ddc60372
					
				| @ -537,6 +537,41 @@ pub struct Mut<'a, T: ?Sized> { | |||||||
|     pub(crate) ticks: TicksMut<'a>, |     pub(crate) ticks: TicksMut<'a>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, T: ?Sized> Mut<'a, T> { | ||||||
|  |     /// Creates a new change-detection enabled smart pointer.
 | ||||||
|  |     /// In almost all cases you do not need to call this method manually,
 | ||||||
|  |     /// as instances of `Mut` will be created by engine-internal code.
 | ||||||
|  |     ///
 | ||||||
|  |     /// Many use-cases of this method would be better served by [`Mut::map_unchanged`]
 | ||||||
|  |     /// or [`Mut::reborrow`].
 | ||||||
|  |     ///
 | ||||||
|  |     /// - `value` - The value wrapped by this smart pointer.
 | ||||||
|  |     /// - `added` - A [`Tick`] that stores the tick when the wrapped value was created.
 | ||||||
|  |     /// - `last_changed` - A [`Tick`] that stores the last time the wrapped value was changed.
 | ||||||
|  |     ///   This will be updated to the value of `change_tick` if the returned smart pointer
 | ||||||
|  |     ///   is modified.
 | ||||||
|  |     /// - `last_change_tick` - A [`Tick`], occurring before `change_tick`, which is used
 | ||||||
|  |     ///   as a reference to determine whether the wrapped value is newly added or changed.
 | ||||||
|  |     /// - `change_tick` - A [`Tick`] corresponding to the current point in time -- "now".
 | ||||||
|  |     pub fn new( | ||||||
|  |         value: &'a mut T, | ||||||
|  |         added: &'a mut Tick, | ||||||
|  |         last_changed: &'a mut Tick, | ||||||
|  |         last_change_tick: u32, | ||||||
|  |         change_tick: u32, | ||||||
|  |     ) -> Self { | ||||||
|  |         Self { | ||||||
|  |             value, | ||||||
|  |             ticks: TicksMut { | ||||||
|  |                 added, | ||||||
|  |                 changed: last_changed, | ||||||
|  |                 last_change_tick, | ||||||
|  |                 change_tick, | ||||||
|  |             }, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| impl<'a, T: ?Sized> From<Mut<'a, T>> for Ref<'a, T> { | impl<'a, T: ?Sized> From<Mut<'a, T>> for Ref<'a, T> { | ||||||
|     fn from(mut_ref: Mut<'a, T>) -> Self { |     fn from(mut_ref: Mut<'a, T>) -> Self { | ||||||
|         Self { |         Self { | ||||||
| @ -827,6 +862,26 @@ mod tests { | |||||||
|         assert_eq!(4, into_mut.ticks.change_tick); |         assert_eq!(4, into_mut.ticks.change_tick); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     #[test] | ||||||
|  |     fn mut_new() { | ||||||
|  |         let mut component_ticks = ComponentTicks { | ||||||
|  |             added: Tick::new(1), | ||||||
|  |             changed: Tick::new(3), | ||||||
|  |         }; | ||||||
|  |         let mut res = R {}; | ||||||
|  | 
 | ||||||
|  |         let val = Mut::new( | ||||||
|  |             &mut res, | ||||||
|  |             &mut component_ticks.added, | ||||||
|  |             &mut component_ticks.changed, | ||||||
|  |             2, // last_change_tick
 | ||||||
|  |             4, // current change_tick
 | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         assert!(!val.is_added()); | ||||||
|  |         assert!(val.is_changed()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn mut_from_non_send_mut() { |     fn mut_from_non_send_mut() { | ||||||
|         let mut component_ticks = ComponentTicks { |         let mut component_ticks = ComponentTicks { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 JoJoJet
						JoJoJet