|
1 | 1 | use crate::alloc::Allocator; |
2 | 2 | use crate::boxed::Box; |
3 | 3 | use crate::io::{ |
4 | | - self, Cursor, ErrorKind, IoSlice, WriteThroughCursor, slice_write, slice_write_all, |
5 | | - slice_write_all_vectored, slice_write_vectored, |
| 4 | + self, BorrowedCursor, Cursor, ErrorKind, IoSlice, IoSliceMut, Read, WriteThroughCursor, |
| 5 | + slice_write, slice_write_all, slice_write_all_vectored, slice_write_vectored, |
6 | 6 | }; |
| 7 | +use crate::string::String; |
7 | 8 | use crate::vec::Vec; |
8 | 9 |
|
| 10 | +#[stable(feature = "rust1", since = "1.0.0")] |
| 11 | +impl<T> Read for Cursor<T> |
| 12 | +where |
| 13 | + T: AsRef<[u8]>, |
| 14 | +{ |
| 15 | + fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { |
| 16 | + let n = Read::read(&mut Cursor::split(self).1, buf)?; |
| 17 | + self.set_position(self.position() + n as u64); |
| 18 | + Ok(n) |
| 19 | + } |
| 20 | + |
| 21 | + fn read_buf(&mut self, mut cursor: BorrowedCursor<'_>) -> io::Result<()> { |
| 22 | + let prev_written = cursor.written(); |
| 23 | + |
| 24 | + Read::read_buf(&mut Cursor::split(self).1, cursor.reborrow())?; |
| 25 | + |
| 26 | + self.set_position(self.position() + (cursor.written() - prev_written) as u64); |
| 27 | + |
| 28 | + Ok(()) |
| 29 | + } |
| 30 | + |
| 31 | + fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { |
| 32 | + let mut nread = 0; |
| 33 | + for buf in bufs { |
| 34 | + let n = self.read(buf)?; |
| 35 | + nread += n; |
| 36 | + if n < buf.len() { |
| 37 | + break; |
| 38 | + } |
| 39 | + } |
| 40 | + Ok(nread) |
| 41 | + } |
| 42 | + |
| 43 | + fn is_read_vectored(&self) -> bool { |
| 44 | + true |
| 45 | + } |
| 46 | + |
| 47 | + fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> { |
| 48 | + let result = Read::read_exact(&mut Cursor::split(self).1, buf); |
| 49 | + |
| 50 | + match result { |
| 51 | + Ok(_) => self.set_position(self.position() + buf.len() as u64), |
| 52 | + // The only possible error condition is EOF, so place the cursor at "EOF" |
| 53 | + Err(_) => self.set_position(self.get_ref().as_ref().len() as u64), |
| 54 | + } |
| 55 | + |
| 56 | + result |
| 57 | + } |
| 58 | + |
| 59 | + fn read_buf_exact(&mut self, mut cursor: BorrowedCursor<'_>) -> io::Result<()> { |
| 60 | + let prev_written = cursor.written(); |
| 61 | + |
| 62 | + let result = Read::read_buf_exact(&mut Cursor::split(self).1, cursor.reborrow()); |
| 63 | + self.set_position(self.position() + (cursor.written() - prev_written) as u64); |
| 64 | + |
| 65 | + result |
| 66 | + } |
| 67 | + |
| 68 | + fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> { |
| 69 | + let content = Cursor::split(self).1; |
| 70 | + let len = content.len(); |
| 71 | + buf.try_reserve(len)?; |
| 72 | + buf.extend_from_slice(content); |
| 73 | + self.set_position(self.position() + len as u64); |
| 74 | + |
| 75 | + Ok(len) |
| 76 | + } |
| 77 | + |
| 78 | + fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> { |
| 79 | + let content = |
| 80 | + crate::str::from_utf8(Cursor::split(self).1).map_err(|_| io::Error::INVALID_UTF8)?; |
| 81 | + let len = content.len(); |
| 82 | + buf.try_reserve(len)?; |
| 83 | + buf.push_str(content); |
| 84 | + self.set_position(self.position() + len as u64); |
| 85 | + |
| 86 | + Ok(len) |
| 87 | + } |
| 88 | +} |
| 89 | + |
9 | 90 | /// Reserves the required space, and pads the vec with 0s if necessary. |
10 | 91 | fn reserve_and_pad<A: Allocator>( |
11 | 92 | pos_mut: &mut u64, |
|
0 commit comments