Skip to content

Commit 809e69b

Browse files
committed
Improve several Read implementations
1 parent 73476d4 commit 809e69b

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
@@ -357,6 +357,28 @@ where
357357
self.pos += n as u64;
358358
Ok(())
359359
}
360+
361+
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
362+
let content = self.remaining_slice();
363+
let len = content.len();
364+
buf.try_reserve(len)?;
365+
buf.extend_from_slice(content);
366+
self.pos += len as u64;
367+
368+
Ok(len)
369+
}
370+
371+
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
372+
let content = crate::str::from_utf8(self.remaining_slice()).map_err(|_| {
373+
io::const_io_error!(ErrorKind::InvalidData, "stream did not contain valid UTF-8")
374+
})?;
375+
let len = content.len();
376+
buf.try_reserve(len)?;
377+
buf.push_str(content);
378+
self.pos += len as u64;
379+
380+
Ok(len)
381+
}
360382
}
361383

362384
#[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
@@ -315,8 +315,9 @@ impl Read for &[u8] {
315315
let content = str::from_utf8(self).map_err(|_| {
316316
io::const_io_error!(ErrorKind::InvalidData, "stream did not contain valid UTF-8")
317317
})?;
318-
buf.push_str(content);
319318
let len = self.len();
319+
buf.try_reserve(len)?;
320+
buf.push_str(content);
320321
*self = &self[len..];
321322
Ok(len)
322323
}
@@ -470,6 +471,7 @@ impl<A: Allocator> Read for VecDeque<u8, A> {
470471
let string = str::from_utf8(content).map_err(|_| {
471472
io::const_io_error!(ErrorKind::InvalidData, "stream did not contain valid UTF-8")
472473
})?;
474+
buf.try_reserve(len)?;
473475
buf.push_str(string);
474476
self.clear();
475477
Ok(len)

library/std/src/process.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,10 @@ impl Read for ChildStderr {
439439
fn is_read_vectored(&self) -> bool {
440440
self.inner.is_read_vectored()
441441
}
442+
443+
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
444+
self.inner.read_to_end(buf)
445+
}
442446
}
443447

444448
impl AsInner<AnonPipe> for ChildStderr {

0 commit comments

Comments
 (0)