io::Chain: specialize some Read methods

This commit is contained in:
Benoît du Garreau
2022-12-19 20:16:49 +01:00
parent 4653c93e44
commit cada71e3f4

View File

@@ -2389,6 +2389,39 @@ impl<T: Read, U: Read> Read for Chain<T, U> {
} }
self.second.read_vectored(bufs) self.second.read_vectored(bufs)
} }
#[inline]
fn is_read_vectored(&self) -> bool {
self.first.is_read_vectored() || self.second.is_read_vectored()
}
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> {
let mut read = 0;
if !self.done_first {
read += self.first.read_to_end(buf)?;
self.done_first = true;
}
read += self.second.read_to_end(buf)?;
Ok(read)
}
fn read_buf(&mut self, mut buf: BorrowedCursor<'_>) -> Result<()> {
if buf.capacity() == 0 {
return Ok(());
}
if !self.done_first {
let old_len = buf.written();
self.first.read_buf(buf.reborrow())?;
if buf.written() != old_len {
return Ok(());
} else {
self.done_first = true;
}
}
self.second.read_buf(buf)
}
} }
#[stable(feature = "chain_bufread", since = "1.9.0")] #[stable(feature = "chain_bufread", since = "1.9.0")]