Skip to content

Commit e8e89b9

Browse files
committed
Move std::io::Read to alloc::io
1 parent b49b7e2 commit e8e89b9

18 files changed

Lines changed: 1674 additions & 1602 deletions

File tree

library/alloc/src/io/cursor.rs

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,92 @@
11
use crate::alloc::Allocator;
22
use crate::boxed::Box;
33
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,
66
};
7+
use crate::string::String;
78
use crate::vec::Vec;
89

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+
990
/// Reserves the required space, and pads the vec with 0s if necessary.
1091
fn reserve_and_pad<A: Allocator>(
1192
pos_mut: &mut u64,

0 commit comments

Comments
 (0)