| #[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); | |
| } | |
| } |