Skip to content

Commit 68f285a

Browse files
committed
Avoid Take/Cursor in favor of manual impl
This is a bit clearer to me at least as it wasn't entirely clear from before how data was being read and extended simultaneously.
1 parent 433f50c commit 68f285a

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

src/gz/bufread.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -313,27 +313,38 @@ enum GzState {
313313
End
314314
}
315315

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.
316319
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,
318323
reader: &'a mut T
319324
}
320325

321326
impl<'a, T> Buffer<'a, T> {
322327
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+
}
325334
}
326335
}
327336

328337
impl<'a, T: Read> Read for Buffer<'a, T> {
329338
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)
335347
}
336-
Ok(len)
337348
}
338349
}
339350

0 commit comments

Comments
 (0)