1
Fork 0

Improve several Read implementations

This commit is contained in:
Benoît du Garreau 2024-03-13 15:09:39 +01:00
parent 6475796a81
commit b07c1f7f4d
3 changed files with 28 additions and 1 deletions

View file

@ -364,6 +364,27 @@ where
self.pos += n as u64; self.pos += n as u64;
Ok(()) Ok(())
} }
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
let content = self.remaining_slice();
let len = content.len();
buf.try_reserve(len)?;
buf.extend_from_slice(content);
self.pos += len as u64;
Ok(len)
}
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
let content =
crate::str::from_utf8(self.remaining_slice()).map_err(|_| io::Error::INVALID_UTF8)?;
let len = content.len();
buf.try_reserve(len)?;
buf.push_str(content);
self.pos += len as u64;
Ok(len)
}
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]

View file

@ -329,8 +329,9 @@ impl Read for &[u8] {
#[inline] #[inline]
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> { fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
let content = str::from_utf8(self).map_err(|_| io::Error::INVALID_UTF8)?; let content = str::from_utf8(self).map_err(|_| io::Error::INVALID_UTF8)?;
buf.push_str(content);
let len = self.len(); let len = self.len();
buf.try_reserve(len)?;
buf.push_str(content);
*self = &self[len..]; *self = &self[len..];
Ok(len) Ok(len)
} }
@ -478,6 +479,7 @@ impl<A: Allocator> Read for VecDeque<u8, A> {
let len = self.len(); let len = self.len();
let content = self.make_contiguous(); let content = self.make_contiguous();
let string = str::from_utf8(content).map_err(|_| io::Error::INVALID_UTF8)?; let string = str::from_utf8(content).map_err(|_| io::Error::INVALID_UTF8)?;
buf.try_reserve(len)?;
buf.push_str(string); buf.push_str(string);
self.clear(); self.clear();
Ok(len) Ok(len)

View file

@ -486,6 +486,10 @@ impl Read for ChildStderr {
fn is_read_vectored(&self) -> bool { fn is_read_vectored(&self) -> bool {
self.inner.is_read_vectored() self.inner.is_read_vectored()
} }
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
self.inner.read_to_end(buf)
}
} }
impl AsInner<AnonPipe> for ChildStderr { impl AsInner<AnonPipe> for ChildStderr {