File tree Expand file tree Collapse file tree 1 file changed +20
-9
lines changed Expand file tree Collapse file tree 1 file changed +20
-9
lines changed Original file line number Diff line number Diff line change @@ -313,27 +313,38 @@ enum GzState {
313
313
End
314
314
}
315
315
316
+ /// A small adapter which reads data originally from `buf` and then reads all
317
+ /// further data from `reader`. This will also buffer all data read from
318
+ /// `reader` into `buf` for reuse on a further call.
316
319
struct Buffer < ' a , T > {
317
- buf : io:: Take < io:: Cursor < & ' a mut Vec < u8 > > > ,
320
+ buf : & ' a mut Vec < u8 > ,
321
+ buf_cur : usize ,
322
+ buf_max : usize ,
318
323
reader : & ' a mut T
319
324
}
320
325
321
326
impl < ' a , T > Buffer < ' a , T > {
322
327
fn new ( buf : & ' a mut Vec < u8 > , reader : & ' a mut T ) -> Buffer < ' a , T > {
323
- let len = buf. len ( ) ;
324
- Buffer { buf : io:: Cursor :: new ( buf) . take ( len as _ ) , reader }
328
+ Buffer {
329
+ reader,
330
+ buf_cur : 0 ,
331
+ buf_max : buf. len ( ) ,
332
+ buf,
333
+ }
325
334
}
326
335
}
327
336
328
337
impl < ' a , T : Read > Read for Buffer < ' a , T > {
329
338
fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
330
- let mut len = self . buf . read ( buf) ?;
331
- if buf. len ( ) > len {
332
- let len2 = self . reader . read ( & mut buf[ len..] ) ?;
333
- self . buf . get_mut ( ) . get_mut ( ) . extend_from_slice ( & buf[ len..] [ ..len2] ) ;
334
- len += len2;
339
+ if self . buf_cur == self . buf_max {
340
+ let len = self . reader . read ( buf) ?;
341
+ self . buf . extend_from_slice ( & buf[ ..len] ) ;
342
+ Ok ( len)
343
+ } else {
344
+ let len = ( & self . buf [ self . buf_cur ..self . buf_max ] ) . read ( buf) ?;
345
+ self . buf_cur += len;
346
+ Ok ( len)
335
347
}
336
- Ok ( len)
337
348
}
338
349
}
339
350
You can’t perform that action at this time.
0 commit comments