| #[cfg(test)] |
| mod tests; |
| |
| #[stable(feature = "rust1", since = "1.0.0")] |
| pub use core::io::Cursor; |
| |
| use crate::io::prelude::*; |
| use crate::io::{self, BorrowedCursor, IoSliceMut}; |
| |
| #[stable(feature = "rust1", since = "1.0.0")] |
| impl<T> Read for Cursor<T> |
| where |
| T: AsRef<[u8]>, |
| { |
| fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { |
| let n = Read::read(&mut Cursor::split(self).1, buf)?; |
| self.set_position(self.position() + n as u64); |
| Ok(n) |
| } |
| |
| fn read_buf(&mut self, mut cursor: BorrowedCursor<'_, u8>) -> io::Result<()> { |
| let prev_written = cursor.written(); |
| |
| Read::read_buf(&mut Cursor::split(self).1, cursor.reborrow())?; |
| |
| self.set_position(self.position() + (cursor.written() - prev_written) as u64); |
| |
| Ok(()) |
| } |
| |
| fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { |
| let mut nread = 0; |
| for buf in bufs { |
| let n = self.read(buf)?; |
| nread += n; |
| if n < buf.len() { |
| break; |
| } |
| } |
| Ok(nread) |
| } |
| |
| fn is_read_vectored(&self) -> bool { |
| true |
| } |
| |
| fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> { |
| let result = Read::read_exact(&mut Cursor::split(self).1, buf); |
| |
| match result { |
| Ok(_) => self.set_position(self.position() + buf.len() as u64), |
| // The only possible error condition is EOF, so place the cursor at "EOF" |
| Err(_) => self.set_position(self.get_ref().as_ref().len() as u64), |
| } |
| |
| result |
| } |
| |
| fn read_buf_exact(&mut self, mut cursor: BorrowedCursor<'_, u8>) -> io::Result<()> { |
| let prev_written = cursor.written(); |
| |
| let result = Read::read_buf_exact(&mut Cursor::split(self).1, cursor.reborrow()); |
| self.set_position(self.position() + (cursor.written() - prev_written) as u64); |
| |
| result |
| } |
| |
| fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> { |
| let content = Cursor::split(self).1; |
| let len = content.len(); |
| buf.try_reserve(len)?; |
| buf.extend_from_slice(content); |
| self.set_position(self.position() + len as u64); |
| |
| Ok(len) |
| } |
| |
| fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> { |
| let content = |
| crate::str::from_utf8(Cursor::split(self).1).map_err(|_| io::Error::INVALID_UTF8)?; |
| let len = content.len(); |
| buf.try_reserve(len)?; |
| buf.push_str(content); |
| self.set_position(self.position() + len as u64); |
| |
| Ok(len) |
| } |
| } |
| |
| #[stable(feature = "rust1", since = "1.0.0")] |
| impl<T> BufRead for Cursor<T> |
| where |
| T: AsRef<[u8]>, |
| { |
| fn fill_buf(&mut self) -> io::Result<&[u8]> { |
| Ok(Cursor::split(self).1) |
| } |
| fn consume(&mut self, amt: usize) { |
| self.set_position(self.position() + amt as u64); |
| } |
| } |