@@ -150,14 +150,14 @@ fn map_instance_event<T>(event_instance: &EventInstance<T>) -> &T {
150150}
151151
152152/// Reads events of type `T` in order and tracks which events have already been read.
153- #[ derive( SystemParam ) ]
153+ #[ derive( SystemParam , Debug ) ]
154154pub struct EventReader < ' a , T : Component > {
155155 last_event_count : Local < ' a , ( usize , PhantomData < T > ) > ,
156156 events : Res < ' a , Events < T > > ,
157157}
158158
159159/// Sends events of type `T`.
160- #[ derive( SystemParam ) ]
160+ #[ derive( SystemParam , Debug ) ]
161161pub struct EventWriter < ' a , T : Component > {
162162 events : ResMut < ' a , Events < T > > ,
163163}
@@ -172,6 +172,7 @@ impl<'a, T: Component> EventWriter<'a, T> {
172172 }
173173}
174174
175+ #[ derive( Debug ) ]
175176pub struct ManualEventReader < T > {
176177 last_event_count : usize ,
177178 _marker : PhantomData < T > ,
@@ -328,14 +329,25 @@ impl<T: Component> Events<T> {
328329 events. update ( ) ;
329330 }
330331
332+ #[ inline]
333+ fn increment_start_event_count ( & mut self ) {
334+ let count = self . event_count + 1 ;
335+ self . a_start_event_count = count;
336+ self . b_start_event_count = count;
337+ }
338+
331339 /// Removes all events.
340+ #[ inline]
332341 pub fn clear ( & mut self ) {
342+ self . increment_start_event_count ( ) ;
333343 self . events_a . clear ( ) ;
334344 self . events_b . clear ( ) ;
335345 }
336346
337347 /// Creates a draining iterator that removes all events.
338348 pub fn drain ( & mut self ) -> impl Iterator < Item = T > + ' _ {
349+ self . increment_start_event_count ( ) ;
350+
339351 let map = |i : EventInstance < T > | i. event ;
340352 match self . state {
341353 State :: A => self
@@ -376,6 +388,8 @@ impl<T: Component> Events<T> {
376388
377389#[ cfg( test) ]
378390mod tests {
391+ use bevy_utils:: tracing:: event;
392+
379393 use super :: * ;
380394
381395 #[ derive( Copy , Clone , PartialEq , Eq , Debug ) ]
@@ -480,4 +494,40 @@ mod tests {
480494 ) -> Vec < TestEvent > {
481495 reader. iter ( events) . cloned ( ) . collect :: < Vec < TestEvent > > ( )
482496 }
497+
498+ #[ derive( PartialEq , Eq , Debug ) ]
499+ struct E ( usize ) ;
500+
501+ fn events_clear_and_read_impl ( clear_func : impl FnOnce ( & mut Events < E > ) ) {
502+ let mut events = Events :: < E > :: default ( ) ;
503+ let mut reader = events. get_reader ( ) ;
504+
505+ assert ! ( reader. iter( & events) . next( ) . is_none( ) ) ;
506+
507+ events. send ( E ( 0 ) ) ;
508+ assert_eq ! ( * reader. iter( & events) . next( ) . unwrap( ) , E ( 0 ) ) ;
509+ assert_eq ! ( reader. iter( & events) . next( ) , None ) ;
510+
511+ events. send ( E ( 1 ) ) ;
512+ clear_func ( & mut events) ;
513+ assert ! ( reader. iter( & events) . next( ) . is_none( ) ) ;
514+
515+ events. send ( E ( 2 ) ) ;
516+ events. update ( ) ;
517+ events. send ( E ( 3 ) ) ;
518+
519+ assert ! ( reader. iter( & events) . eq( [ E ( 2 ) , E ( 3 ) ] . iter( ) ) ) ;
520+ }
521+
522+ #[ test]
523+ fn test_events_clear_and_read ( ) {
524+ events_clear_and_read_impl ( |events| events. clear ( ) ) ;
525+ }
526+
527+ #[ test]
528+ fn test_events_drain_and_read ( ) {
529+ events_clear_and_read_impl ( |events| {
530+ assert ! ( events. drain( ) . eq( vec![ E ( 0 ) , E ( 1 ) ] . into_iter( ) ) ) ;
531+ } ) ;
532+ }
483533}
0 commit comments