diff options
Diffstat (limited to 'src/libstd/io/impls.rs')
| -rw-r--r-- | src/libstd/io/impls.rs | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/src/libstd/io/impls.rs b/src/libstd/io/impls.rs index ec75a87aec3..4bba4af77c4 100644 --- a/src/libstd/io/impls.rs +++ b/src/libstd/io/impls.rs @@ -1,5 +1,6 @@ use cmp; -use io::{self, SeekFrom, Read, Initializer, Write, Seek, BufRead, Error, ErrorKind}; +use io::{self, SeekFrom, Read, Initializer, Write, Seek, BufRead, Error, ErrorKind, IoVecMut, + IoVec}; use fmt; use mem; @@ -14,6 +15,11 @@ impl<'a, R: Read + ?Sized> Read for &'a mut R { } #[inline] + fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { + (**self).read_vectored(bufs) + } + + #[inline] unsafe fn initializer(&self) -> Initializer { (**self).initializer() } @@ -39,6 +45,11 @@ impl<'a, W: Write + ?Sized> Write for &'a mut W { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { (**self).write(buf) } #[inline] + fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { + (**self).write_vectored(bufs) + } + + #[inline] fn flush(&mut self) -> io::Result<()> { (**self).flush() } #[inline] @@ -83,6 +94,11 @@ impl<R: Read + ?Sized> Read for Box<R> { } #[inline] + fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { + (**self).read_vectored(bufs) + } + + #[inline] unsafe fn initializer(&self) -> Initializer { (**self).initializer() } @@ -108,6 +124,11 @@ impl<W: Write + ?Sized> Write for Box<W> { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { (**self).write(buf) } #[inline] + fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { + (**self).write_vectored(bufs) + } + + #[inline] fn flush(&mut self) -> io::Result<()> { (**self).flush() } #[inline] @@ -172,6 +193,19 @@ impl<'a> Read for &'a [u8] { } #[inline] + fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { + let mut nread = 0; + for buf in bufs { + nread += self.read(buf.as_mut_slice())?; + if self.is_empty() { + break; + } + } + + Ok(nread) + } + + #[inline] unsafe fn initializer(&self) -> Initializer { Initializer::nop() } @@ -232,6 +266,19 @@ impl<'a> Write for &'a mut [u8] { } #[inline] + fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { + let mut nwritten = 0; + for buf in bufs { + nwritten += self.write(buf.as_slice())?; + if self.is_empty() { + break; + } + } + + Ok(nwritten) + } + + #[inline] fn write_all(&mut self, data: &[u8]) -> io::Result<()> { if self.write(data)? == data.len() { Ok(()) @@ -255,6 +302,16 @@ impl Write for Vec<u8> { } #[inline] + fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { + let len = bufs.iter().map(|b| b.as_slice().len()).sum(); + self.reserve(len); + for buf in bufs { + self.extend_from_slice(buf.as_slice()); + } + Ok(len) + } + + #[inline] fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { self.extend_from_slice(buf); Ok(()) |
