@@ -221,12 +221,14 @@ impl<'a, T: 'a> RingBuffer<'a, T> {
221221 let max_size = cmp:: min ( self . len ( ) , capacity - self . read_at ) ;
222222 let ( size, result) = f ( & mut self . storage [ self . read_at ..self . read_at + max_size] ) ;
223223 assert ! ( size <= max_size) ;
224- self . read_at = if capacity > 0 {
224+ self . length -= size;
225+ self . read_at = if self . length > 0 {
225226 ( self . read_at + size) % capacity
226227 } else {
228+ // Ring is currently empty, reset `read_at` to optimize
229+ // for contiguous space.
227230 0
228231 } ;
229- self . length -= size;
230232 ( size, result)
231233 }
232234
@@ -659,13 +661,13 @@ mod test {
659661 ring. dequeue_many ( 6 ) . copy_from_slice ( b"ABCDEF" ) ;
660662
661663 assert_eq ! ( ring. write_unallocated( 0 , b"ghi" ) , 3 ) ;
662- assert_eq ! ( & ring. storage[ ..] , b"ABCDEFghi ..." ) ;
664+ assert_eq ! ( & ring. storage[ ..] , b"ghiDEF... ..." ) ;
663665
664666 assert_eq ! ( ring. write_unallocated( 3 , b"jklmno" ) , 6 ) ;
665- assert_eq ! ( & ring. storage[ ..] , b"mnoDEFghijkl " ) ;
667+ assert_eq ! ( & ring. storage[ ..] , b"ghijklmno... " ) ;
666668
667669 assert_eq ! ( ring. write_unallocated( 9 , b"pqrstu" ) , 3 ) ;
668- assert_eq ! ( & ring. storage[ ..] , b"mnopqrghijkl " ) ;
670+ assert_eq ! ( & ring. storage[ ..] , b"ghijklmnopqr " ) ;
669671 }
670672
671673 #[ test]
0 commit comments