@@ -191,6 +191,13 @@ impl<R: Read> BufReader<R> {
191191 /// ```
192192 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
193193 pub fn into_inner ( self ) -> R { self . inner }
194+
195+ /// Invalidates all data in the internal buffer.
196+ #[ inline]
197+ fn discard_buffer ( & mut self ) {
198+ self . pos = 0 ;
199+ self . cap = 0 ;
200+ }
194201}
195202
196203impl < R : Seek > BufReader < R > {
@@ -225,9 +232,7 @@ impl<R: Read> Read for BufReader<R> {
225232 // (larger than our internal buffer), bypass our internal buffer
226233 // entirely.
227234 if self . pos == self . cap && buf. len ( ) >= self . buf . len ( ) {
228- // Empty the buffer
229- self . cap = 0 ;
230- self . pos = 0 ;
235+ self . discard_buffer ( ) ;
231236 return self . inner . read ( buf) ;
232237 }
233238 let nread = {
@@ -241,6 +246,7 @@ impl<R: Read> Read for BufReader<R> {
241246 fn read_vectored ( & mut self , bufs : & mut [ IoVecMut < ' _ > ] ) -> io:: Result < usize > {
242247 let total_len = bufs. iter ( ) . map ( |b| b. len ( ) ) . sum :: < usize > ( ) ;
243248 if self . pos == self . cap && total_len >= self . buf . len ( ) {
249+ self . discard_buffer ( ) ;
244250 return self . inner . read_vectored ( bufs) ;
245251 }
246252 let nread = {
@@ -326,18 +332,14 @@ impl<R: Seek> Seek for BufReader<R> {
326332 } else {
327333 // seek backwards by our remainder, and then by the offset
328334 self . inner . seek ( SeekFrom :: Current ( -remainder) ) ?;
329- // Empty the buffer
330- self . cap = 0 ;
331- self . pos = 0 ;
335+ self . discard_buffer ( ) ;
332336 result = self . inner . seek ( SeekFrom :: Current ( n) ) ?;
333337 }
334338 } else {
335339 // Seeking with Start/End doesn't care about our buffer length.
336340 result = self . inner . seek ( pos) ?;
337341 }
338- // Empty the buffer
339- self . cap = 0 ;
340- self . pos = 0 ;
342+ self . discard_buffer ( ) ;
341343 Ok ( result)
342344 }
343345}
0 commit comments