@@ -212,21 +212,25 @@ impl<T> Default for ManualEventReader<T> {
212
212
#[ allow( clippy:: len_without_is_empty) ] // Check fails since the is_empty implementation has a signature other than `(&self) -> bool`
213
213
impl < T : Event > ManualEventReader < T > {
214
214
/// See [`EventReader::iter`]
215
- pub fn iter < ' a > ( & ' a mut self , events : & ' a Events < T > ) -> impl DoubleEndedIterator < Item = & ' a T > {
215
+ pub fn iter < ' a > (
216
+ & ' a mut self ,
217
+ events : & ' a Events < T > ,
218
+ ) -> impl DoubleEndedIterator < Item = & ' a T > + ExactSizeIterator < Item = & ' a T > {
216
219
internal_event_reader ( & mut self . last_event_count , events) . map ( |( e, _) | e)
217
220
}
218
221
219
222
/// See [`EventReader::iter_with_id`]
220
223
pub fn iter_with_id < ' a > (
221
224
& ' a mut self ,
222
225
events : & ' a Events < T > ,
223
- ) -> impl DoubleEndedIterator < Item = ( & ' a T , EventId < T > ) > {
226
+ ) -> impl DoubleEndedIterator < Item = ( & ' a T , EventId < T > ) >
227
+ + ExactSizeIterator < Item = ( & ' a T , EventId < T > ) > {
224
228
internal_event_reader ( & mut self . last_event_count , events)
225
229
}
226
230
227
231
/// See [`EventReader::len`]
228
232
pub fn len ( & self , events : & Events < T > ) -> usize {
229
- events . event_reader_len ( self . last_event_count )
233
+ internal_event_reader ( & mut self . last_event_count . clone ( ) , events ) . len ( )
230
234
}
231
235
232
236
/// See [`EventReader::is_empty`]
@@ -240,7 +244,8 @@ impl<T: Event> ManualEventReader<T> {
240
244
fn internal_event_reader < ' a , T > (
241
245
last_event_count : & ' a mut usize ,
242
246
events : & ' a Events < T > ,
243
- ) -> impl DoubleEndedIterator < Item = ( & ' a T , EventId < T > ) > {
247
+ ) -> impl DoubleEndedIterator < Item = ( & ' a T , EventId < T > ) > + ExactSizeIterator < Item = ( & ' a T , EventId < T > ) >
248
+ {
244
249
// if the reader has seen some of the events in a buffer, find the proper index offset.
245
250
// otherwise read all events in the buffer
246
251
let a_index = if * last_event_count > events. a_start_event_count {
@@ -263,19 +268,75 @@ fn internal_event_reader<'a, T>(
263
268
} ;
264
269
iterator
265
270
. map ( map_instance_event_with_id)
271
+ . with_exact_size ( unread_count)
266
272
. inspect ( move |( _, id) | * last_event_count = ( id. id + 1 ) . max ( * last_event_count) )
267
273
}
268
274
275
+ trait IteratorExt {
276
+ fn with_exact_size ( self , len : usize ) -> ExactSize < Self >
277
+ where
278
+ Self : Sized ,
279
+ {
280
+ ExactSize :: new ( self , len)
281
+ }
282
+ }
283
+ impl < I > IteratorExt for I where I : Iterator { }
284
+
285
+ #[ must_use = "iterators are lazy and do nothing unless consumed" ]
286
+ #[ derive( Clone ) ]
287
+ struct ExactSize < I > {
288
+ iter : I ,
289
+ len : usize ,
290
+ }
291
+ impl < I > ExactSize < I > {
292
+ fn new ( iter : I , len : usize ) -> Self {
293
+ ExactSize { iter, len }
294
+ }
295
+ }
296
+
297
+ impl < I : Iterator > Iterator for ExactSize < I > {
298
+ type Item = I :: Item ;
299
+
300
+ #[ inline]
301
+ fn next ( & mut self ) -> Option < I :: Item > {
302
+ self . iter . next ( ) . map ( |e| {
303
+ self . len -= 1 ;
304
+ e
305
+ } )
306
+ }
307
+
308
+ #[ inline]
309
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
310
+ ( self . len , Some ( self . len ) )
311
+ }
312
+ }
313
+
314
+ impl < I : DoubleEndedIterator > DoubleEndedIterator for ExactSize < I > {
315
+ #[ inline]
316
+ fn next_back ( & mut self ) -> Option < I :: Item > {
317
+ self . len -= 1 ;
318
+ self . iter . next_back ( )
319
+ }
320
+ }
321
+ impl < I : Iterator > ExactSizeIterator for ExactSize < I > {
322
+ fn len ( & self ) -> usize {
323
+ self . len
324
+ }
325
+ }
326
+
269
327
impl < ' w , ' s , T : Event > EventReader < ' w , ' s , T > {
270
328
/// Iterates over the events this [`EventReader`] has not seen yet. This updates the
271
329
/// [`EventReader`]'s event counter, which means subsequent event reads will not include events
272
330
/// that happened before now.
273
- pub fn iter ( & mut self ) -> impl DoubleEndedIterator < Item = & T > {
331
+ pub fn iter ( & mut self ) -> impl DoubleEndedIterator < Item = & T > + ExactSizeIterator < Item = & T > {
274
332
self . iter_with_id ( ) . map ( |( event, _id) | event)
275
333
}
276
334
277
335
/// Like [`iter`](Self::iter), except also returning the [`EventId`] of the events.
278
- pub fn iter_with_id ( & mut self ) -> impl DoubleEndedIterator < Item = ( & T , EventId < T > ) > {
336
+ pub fn iter_with_id (
337
+ & mut self ,
338
+ ) -> impl DoubleEndedIterator < Item = ( & T , EventId < T > ) > + ExactSizeIterator < Item = ( & T , EventId < T > ) >
339
+ {
279
340
internal_event_reader ( & mut self . last_event_count . 0 , & self . events ) . map ( |( event, id) | {
280
341
trace ! ( "EventReader::iter() -> {}" , id) ;
281
342
( event, id)
@@ -284,7 +345,7 @@ impl<'w, 's, T: Event> EventReader<'w, 's, T> {
284
345
285
346
/// Determines the number of events available to be read from this [`EventReader`] without consuming any.
286
347
pub fn len ( & self ) -> usize {
287
- self . events . event_reader_len ( self . last_event_count . 0 )
348
+ internal_event_reader ( & mut self . last_event_count . 0 . clone ( ) , & self . events ) . len ( )
288
349
}
289
350
290
351
/// Determines if are any events available to be read without consuming any.
@@ -405,35 +466,14 @@ impl<T: Event> Events<T> {
405
466
/// between the last `update()` call and your call to `iter_current_update_events`.
406
467
/// If events happen outside that window, they will not be handled. For example, any events that
407
468
/// happen after this call and before the next `update()` call will be dropped.
408
- pub fn iter_current_update_events ( & self ) -> impl DoubleEndedIterator < Item = & T > {
469
+ pub fn iter_current_update_events (
470
+ & self ,
471
+ ) -> impl DoubleEndedIterator < Item = & T > + ExactSizeIterator < Item = & T > {
409
472
match self . state {
410
473
State :: A => self . events_a . iter ( ) . map ( map_instance_event) ,
411
474
State :: B => self . events_b . iter ( ) . map ( map_instance_event) ,
412
475
}
413
476
}
414
-
415
- /// Determines how many events are in the reader after the given `last_event_count` parameter
416
- fn event_reader_len ( & self , last_event_count : usize ) -> usize {
417
- let a_count = if last_event_count <= self . a_start_event_count {
418
- self . events_a . len ( )
419
- } else {
420
- self . events_a
421
- . len ( )
422
- . checked_sub ( last_event_count - self . a_start_event_count )
423
- . unwrap_or_default ( )
424
- } ;
425
-
426
- let b_count = if last_event_count <= self . b_start_event_count {
427
- self . events_b . len ( )
428
- } else {
429
- self . events_b
430
- . len ( )
431
- . checked_sub ( last_event_count - self . b_start_event_count )
432
- . unwrap_or_default ( )
433
- } ;
434
-
435
- a_count + b_count
436
- }
437
477
}
438
478
439
479
impl < T > std:: iter:: Extend < T > for Events < T > {
@@ -651,6 +691,21 @@ mod tests {
651
691
assert ! ( !events. get_reader( ) . is_empty( & events) ) ;
652
692
}
653
693
694
+ #[ test]
695
+ fn test_event_iter_len_updated ( ) {
696
+ let mut events = Events :: < TestEvent > :: default ( ) ;
697
+ events. send ( TestEvent { i : 0 } ) ;
698
+ events. send ( TestEvent { i : 1 } ) ;
699
+ events. send ( TestEvent { i : 2 } ) ;
700
+ let mut reader = events. get_reader ( ) ;
701
+ let mut iter = reader. iter ( & events) ;
702
+ assert_eq ! ( iter. len( ) , 3 ) ;
703
+ iter. next ( ) ;
704
+ assert_eq ! ( iter. len( ) , 2 ) ;
705
+ iter. next_back ( ) ;
706
+ assert_eq ! ( iter. len( ) , 1 ) ;
707
+ }
708
+
654
709
#[ test]
655
710
fn test_event_reader_len_current ( ) {
656
711
let mut events = Events :: < TestEvent > :: default ( ) ;
0 commit comments