1#[cfg(test)]
2mod tests;
3
4#[stable(feature = "rust1", since = "1.0.0")]
5pub use core::io::Cursor;
6
7use crate::io::prelude::*;
8use crate::io::{self, BorrowedCursor, IoSliceMut};
9
10#[stable(feature = "rust1", since = "1.0.0")]
11impl<T> Read for Cursor<T>
12where
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<'_, u8>) -> 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 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<'_, u8>) -> 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
90#[stable(feature = "rust1", since = "1.0.0")]
91impl<T> BufRead for Cursor<T>
92where
93 T: AsRef<[u8]>,
94{
95 fn fill_buf(&mut self) -> io::Result<&[u8]> {
96 Ok(Cursor::split(self).1)
97 }
98 fn consume(&mut self, amt: usize) {
99 self.set_position(self.position() + amt as u64);
100 }
101}