2 use crate::io::{self, SeekFrom, Read, Initializer, Write, Seek, BufRead, Error, ErrorKind, IoVecMut,
7 // =============================================================================
8 // Forwarding implementations
10 #[stable(feature = "rust1", since = "1.0.0")]
11 impl<R: Read + ?Sized> Read for &mut R {
13 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
18 fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
19 (**self).read_vectored(bufs)
23 unsafe fn initializer(&self) -> Initializer {
24 (**self).initializer()
28 fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
29 (**self).read_to_end(buf)
33 fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
34 (**self).read_to_string(buf)
38 fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
39 (**self).read_exact(buf)
42 #[stable(feature = "rust1", since = "1.0.0")]
43 impl<W: Write + ?Sized> Write for &mut W {
45 fn write(&mut self, buf: &[u8]) -> io::Result<usize> { (**self).write(buf) }
48 fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
49 (**self).write_vectored(bufs)
53 fn flush(&mut self) -> io::Result<()> { (**self).flush() }
56 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
57 (**self).write_all(buf)
61 fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> {
62 (**self).write_fmt(fmt)
65 #[stable(feature = "rust1", since = "1.0.0")]
66 impl<S: Seek + ?Sized> Seek for &mut S {
68 fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> { (**self).seek(pos) }
70 #[stable(feature = "rust1", since = "1.0.0")]
71 impl<B: BufRead + ?Sized> BufRead for &mut B {
73 fn fill_buf(&mut self) -> io::Result<&[u8]> { (**self).fill_buf() }
76 fn consume(&mut self, amt: usize) { (**self).consume(amt) }
79 fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> io::Result<usize> {
80 (**self).read_until(byte, buf)
84 fn read_line(&mut self, buf: &mut String) -> io::Result<usize> {
85 (**self).read_line(buf)
89 #[stable(feature = "rust1", since = "1.0.0")]
90 impl<R: Read + ?Sized> Read for Box<R> {
92 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
97 fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
98 (**self).read_vectored(bufs)
102 unsafe fn initializer(&self) -> Initializer {
103 (**self).initializer()
107 fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
108 (**self).read_to_end(buf)
112 fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
113 (**self).read_to_string(buf)
117 fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
118 (**self).read_exact(buf)
121 #[stable(feature = "rust1", since = "1.0.0")]
122 impl<W: Write + ?Sized> Write for Box<W> {
124 fn write(&mut self, buf: &[u8]) -> io::Result<usize> { (**self).write(buf) }
127 fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
128 (**self).write_vectored(bufs)
132 fn flush(&mut self) -> io::Result<()> { (**self).flush() }
135 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
136 (**self).write_all(buf)
140 fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> {
141 (**self).write_fmt(fmt)
144 #[stable(feature = "rust1", since = "1.0.0")]
145 impl<S: Seek + ?Sized> Seek for Box<S> {
147 fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> { (**self).seek(pos) }
149 #[stable(feature = "rust1", since = "1.0.0")]
150 impl<B: BufRead + ?Sized> BufRead for Box<B> {
152 fn fill_buf(&mut self) -> io::Result<&[u8]> { (**self).fill_buf() }
155 fn consume(&mut self, amt: usize) { (**self).consume(amt) }
158 fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> io::Result<usize> {
159 (**self).read_until(byte, buf)
163 fn read_line(&mut self, buf: &mut String) -> io::Result<usize> {
164 (**self).read_line(buf)
168 // =============================================================================
169 // In-memory buffer implementations
171 /// Read is implemented for `&[u8]` by copying from the slice.
173 /// Note that reading updates the slice to point to the yet unread part.
174 /// The slice will be empty when EOF is reached.
175 #[stable(feature = "rust1", since = "1.0.0")]
176 impl Read for &[u8] {
178 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
179 let amt = cmp::min(buf.len(), self.len());
180 let (a, b) = self.split_at(amt);
182 // First check if the amount of bytes we want to read is small:
183 // `copy_from_slice` will generally expand to a call to `memcpy`, and
184 // for a single byte the overhead is significant.
188 buf[..amt].copy_from_slice(a);
196 fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
199 nread += self.read(buf)?;
209 unsafe fn initializer(&self) -> Initializer {
214 fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
215 if buf.len() > self.len() {
216 return Err(Error::new(ErrorKind::UnexpectedEof,
217 "failed to fill whole buffer"));
219 let (a, b) = self.split_at(buf.len());
221 // First check if the amount of bytes we want to read is small:
222 // `copy_from_slice` will generally expand to a call to `memcpy`, and
223 // for a single byte the overhead is significant.
227 buf.copy_from_slice(a);
235 fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
236 buf.extend_from_slice(*self);
237 let len = self.len();
238 *self = &self[len..];
243 #[stable(feature = "rust1", since = "1.0.0")]
244 impl BufRead for &[u8] {
246 fn fill_buf(&mut self) -> io::Result<&[u8]> { Ok(*self) }
249 fn consume(&mut self, amt: usize) { *self = &self[amt..]; }
252 /// Write is implemented for `&mut [u8]` by copying into the slice, overwriting
255 /// Note that writing updates the slice to point to the yet unwritten part.
256 /// The slice will be empty when it has been completely overwritten.
257 #[stable(feature = "rust1", since = "1.0.0")]
258 impl Write for &mut [u8] {
260 fn write(&mut self, data: &[u8]) -> io::Result<usize> {
261 let amt = cmp::min(data.len(), self.len());
262 let (a, b) = mem::replace(self, &mut []).split_at_mut(amt);
263 a.copy_from_slice(&data[..amt]);
269 fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
270 let mut nwritten = 0;
272 nwritten += self.write(buf)?;
282 fn write_all(&mut self, data: &[u8]) -> io::Result<()> {
283 if self.write(data)? == data.len() {
286 Err(Error::new(ErrorKind::WriteZero, "failed to write whole buffer"))
291 fn flush(&mut self) -> io::Result<()> { Ok(()) }
294 /// Write is implemented for `Vec<u8>` by appending to the vector.
295 /// The vector will grow as needed.
296 #[stable(feature = "rust1", since = "1.0.0")]
297 impl Write for Vec<u8> {
299 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
300 self.extend_from_slice(buf);
305 fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
306 let len = bufs.iter().map(|b| b.len()).sum();
309 self.extend_from_slice(buf);
315 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
316 self.extend_from_slice(buf);
321 fn flush(&mut self) -> io::Result<()> { Ok(()) }
326 use crate::io::prelude::*;
329 fn bench_read_slice(b: &mut test::Bencher) {
331 let mut dst = [0; 128];
334 let mut rd = &buf[..];
336 let _ = rd.read(&mut dst);
337 test::black_box(&dst);
343 fn bench_write_slice(b: &mut test::Bencher) {
344 let mut buf = [0; 1024];
348 let mut wr = &mut buf[..];
350 let _ = wr.write_all(&src);
351 test::black_box(&wr);
357 fn bench_read_vec(b: &mut test::Bencher) {
358 let buf = vec![5; 1024];
359 let mut dst = [0; 128];
362 let mut rd = &buf[..];
364 let _ = rd.read(&mut dst);
365 test::black_box(&dst);
371 fn bench_write_vec(b: &mut test::Bencher) {
372 let mut buf = Vec::with_capacity(1024);
376 let mut wr = &mut buf[..];
378 let _ = wr.write_all(&src);
379 test::black_box(&wr);