@@ -191,6 +191,13 @@ impl<R: Read> BufReader<R> {
191
191
/// ```
192
192
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
193
193
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
+ }
194
201
}
195
202
196
203
impl < R : Seek > BufReader < R > {
@@ -225,9 +232,7 @@ impl<R: Read> Read for BufReader<R> {
225
232
// (larger than our internal buffer), bypass our internal buffer
226
233
// entirely.
227
234
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 ( ) ;
231
236
return self . inner . read ( buf) ;
232
237
}
233
238
let nread = {
@@ -241,6 +246,7 @@ impl<R: Read> Read for BufReader<R> {
241
246
fn read_vectored ( & mut self , bufs : & mut [ IoVecMut < ' _ > ] ) -> io:: Result < usize > {
242
247
let total_len = bufs. iter ( ) . map ( |b| b. len ( ) ) . sum :: < usize > ( ) ;
243
248
if self . pos == self . cap && total_len >= self . buf . len ( ) {
249
+ self . discard_buffer ( ) ;
244
250
return self . inner . read_vectored ( bufs) ;
245
251
}
246
252
let nread = {
@@ -326,18 +332,14 @@ impl<R: Seek> Seek for BufReader<R> {
326
332
} else {
327
333
// seek backwards by our remainder, and then by the offset
328
334
self . inner . seek ( SeekFrom :: Current ( -remainder) ) ?;
329
- // Empty the buffer
330
- self . cap = 0 ;
331
- self . pos = 0 ;
335
+ self . discard_buffer ( ) ;
332
336
result = self . inner . seek ( SeekFrom :: Current ( n) ) ?;
333
337
}
334
338
} else {
335
339
// Seeking with Start/End doesn't care about our buffer length.
336
340
result = self . inner . seek ( pos) ?;
337
341
}
338
- // Empty the buffer
339
- self . cap = 0 ;
340
- self . pos = 0 ;
342
+ self . discard_buffer ( ) ;
341
343
Ok ( result)
342
344
}
343
345
}
0 commit comments