@@ -104,6 +104,13 @@ impl<T> PacketBuffer<T> {
104104 /// Retain only the elements in the given index range.
105105 pub fn retain_range < R : std:: ops:: RangeBounds < u64 > > ( & mut self , range : R ) {
106106 let ( min1, max1) = self . clip_bounds ( range) ;
107+ if min1 >= max1 {
108+ self . data . clear ( ) ;
109+ self . min = 0 ;
110+ self . max = 0 ;
111+ self . check_invariants ( ) ;
112+ return ;
113+ }
107114 let base = base ( self . min , self . max ) ;
108115 for i in self . min ..min1 {
109116 self . data [ ( i - base) as usize ] = None ;
@@ -410,6 +417,61 @@ mod tests {
410417 assert ! ( pb. is_empty( ) ) ;
411418 }
412419
420+ #[ test]
421+ fn test_range_iterators ( ) {
422+ let mut pb = PacketBuffer :: default ( ) ;
423+ for i in 0 ..100 {
424+ pb. insert ( i, i * 10 ) ;
425+ }
426+
427+ // Test keys_range
428+ let keys: Vec < _ > = pb. keys_range ( 10 ..20 ) . collect ( ) ;
429+ assert_eq ! ( keys, ( 10 ..20 ) . collect:: <Vec <_>>( ) ) ;
430+
431+ // Test reverse
432+ let keys_rev: Vec < _ > = pb. keys_range ( 10 ..20 ) . rev ( ) . collect ( ) ;
433+ assert_eq ! ( keys_rev, ( 10 ..20 ) . rev( ) . collect:: <Vec <_>>( ) ) ;
434+
435+ // Test values_range
436+ let values: Vec < _ > = pb. values_range ( 10 ..20 ) . cloned ( ) . collect ( ) ;
437+ assert_eq ! ( values, ( 10 ..20 ) . map( |i| i * 10 ) . collect:: <Vec <_>>( ) ) ;
438+
439+ // Test iter_range
440+ let pairs: Vec < _ > = pb. iter_range ( 10 ..20 ) . map ( |( k, v) | ( k, * v) ) . collect ( ) ;
441+ assert_eq ! ( pairs, ( 10 ..20 ) . map( |i| ( i, i * 10 ) ) . collect:: <Vec <_>>( ) ) ;
442+ }
443+
444+ #[ test]
445+ fn test_retain_range ( ) {
446+ let mut pb = PacketBuffer :: default ( ) ;
447+ for i in 0 ..100 {
448+ pb. insert ( i, i * 10 ) ;
449+ }
450+
451+ pb. retain_range ( 20 ..80 ) ;
452+
453+ assert_eq ! ( pb. keys( ) . next( ) , Some ( 20 ) ) ;
454+ assert_eq ! ( pb. keys( ) . next_back( ) , Some ( 79 ) ) ;
455+ assert_eq ! ( pb. keys( ) . count( ) , 60 ) ;
456+ for i in 20 ..80 {
457+ assert_eq ! ( pb. get( i) , Some ( & ( i * 10 ) ) ) ;
458+ }
459+ pb. check_invariants_expensive ( ) ;
460+
461+ // Retain with range outside current bounds -> empty
462+ pb. retain_range ( 200 ..300 ) ;
463+ assert ! ( pb. is_empty( ) ) ;
464+ pb. check_invariants_expensive ( ) ;
465+
466+ // Rebuild and retain with superset range -> no-op
467+ for i in 10 ..20 {
468+ pb. insert ( i, i * 10 ) ;
469+ }
470+ pb. retain_range ( 0 ..100 ) ;
471+ assert_eq ! ( pb. keys( ) . count( ) , 10 ) ;
472+ pb. check_invariants_expensive ( ) ;
473+ }
474+
413475 fn assert_same < I1 , I2 , T > ( iter1 : I1 , iter2 : I2 )
414476 where
415477 I1 : Iterator < Item = T > ,
0 commit comments