Skip to content

Commit 33262fb

Browse files
committed
Improve several Read implementations
1 parent 5974fe8 commit 33262fb

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

library/std/src/io/cursor.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,28 @@ where
364364
self.pos += n as u64;
365365
Ok(())
366366
}
367+
368+
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
369+
let content = self.remaining_slice();
370+
let len = content.len();
371+
buf.try_reserve(len)?;
372+
buf.extend_from_slice(content);
373+
self.pos += len as u64;
374+
375+
Ok(len)
376+
}
377+
378+
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
379+
let content = crate::str::from_utf8(self.remaining_slice()).map_err(|_| {
380+
io::const_io_error!(ErrorKind::InvalidData, "stream did not contain valid UTF-8")
381+
})?;
382+
let len = content.len();
383+
buf.try_reserve(len)?;
384+
buf.push_str(content);
385+
self.pos += len as u64;
386+
387+
Ok(len)
388+
}
367389
}
368390

369391
#[stable(feature = "rust1", since = "1.0.0")]

library/std/src/io/impls.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,9 @@ impl Read for &[u8] {
339339
let content = str::from_utf8(self).map_err(|_| {
340340
io::const_io_error!(ErrorKind::InvalidData, "stream did not contain valid UTF-8")
341341
})?;
342-
buf.push_str(content);
343342
let len = self.len();
343+
buf.try_reserve(len)?;
344+
buf.push_str(content);
344345
*self = &self[len..];
345346
Ok(len)
346347
}
@@ -494,6 +495,7 @@ impl<A: Allocator> Read for VecDeque<u8, A> {
494495
let string = str::from_utf8(content).map_err(|_| {
495496
io::const_io_error!(ErrorKind::InvalidData, "stream did not contain valid UTF-8")
496497
})?;
498+
buf.try_reserve(len)?;
497499
buf.push_str(string);
498500
self.clear();
499501
Ok(len)

library/std/src/process.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,10 @@ impl Read for ChildStderr {
486486
fn is_read_vectored(&self) -> bool {
487487
self.inner.is_read_vectored()
488488
}
489+
490+
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
491+
self.inner.read_to_end(buf)
492+
}
489493
}
490494

491495
impl AsInner<AnonPipe> for ChildStderr {

0 commit comments

Comments
 (0)