Skip to content

Commit b1c0672

Browse files
committed
add readbufref
1 parent 1e12aef commit b1c0672

File tree

19 files changed

+227
-58
lines changed

19 files changed

+227
-58
lines changed

library/std/src/fs.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ mod tests;
1313

1414
use crate::ffi::OsString;
1515
use crate::fmt;
16-
use crate::io::{self, IoSlice, IoSliceMut, Read, ReadBuf, Seek, SeekFrom, Write};
16+
use crate::io::{self, IoSlice, IoSliceMut, Read, ReadBufRef, Seek, SeekFrom, Write};
1717
use crate::path::{Path, PathBuf};
1818
use crate::sys::fs as fs_imp;
1919
use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner};
@@ -624,7 +624,7 @@ impl Read for File {
624624
self.inner.read_vectored(bufs)
625625
}
626626

627-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> io::Result<()> {
627+
fn read_buf(&mut self, buf: ReadBufRef<'_, '_>) -> io::Result<()> {
628628
self.inner.read_buf(buf)
629629
}
630630

@@ -676,7 +676,7 @@ impl Read for &File {
676676
self.inner.read(buf)
677677
}
678678

679-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> io::Result<()> {
679+
fn read_buf(&mut self, buf: ReadBufRef<'_, '_>) -> io::Result<()> {
680680
self.inner.read_buf(buf)
681681
}
682682

library/std/src/io/buffered/bufreader.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::cmp;
22
use crate::fmt;
33
use crate::io::{
4-
self, BufRead, IoSliceMut, Read, ReadBuf, Seek, SeekFrom, SizeHint, DEFAULT_BUF_SIZE,
4+
self, BufRead, IoSliceMut, Read, ReadBuf, ReadBufRef, Seek, SeekFrom, SizeHint, DEFAULT_BUF_SIZE,
55
};
66
use crate::mem::MaybeUninit;
77

@@ -271,7 +271,7 @@ impl<R: Read> Read for BufReader<R> {
271271
Ok(nread)
272272
}
273273

274-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> io::Result<()> {
274+
fn read_buf(&mut self, mut buf: ReadBufRef<'_, '_>) -> io::Result<()> {
275275
// If we don't have any buffered data and we're doing a massive read
276276
// (larger than our internal buffer), bypass our internal buffer
277277
// entirely.
@@ -283,7 +283,7 @@ impl<R: Read> Read for BufReader<R> {
283283
let prev = buf.filled_len();
284284

285285
let mut rem = self.fill_buf()?;
286-
rem.read_buf(buf)?;
286+
rem.read_buf(buf.reborrow())?;
287287

288288
self.consume(buf.filled_len() - prev); //slice impl of read_buf known to never unfill buf
289289

@@ -386,7 +386,7 @@ impl<R: Read> BufRead for BufReader<R> {
386386
readbuf.assume_init(self.init);
387387
}
388388

389-
self.inner.read_buf(&mut readbuf)?;
389+
self.inner.read_buf(readbuf.borrow())?;
390390

391391
self.cap = readbuf.filled_len();
392392
self.init = readbuf.initialized_len();

library/std/src/io/buffered/tests.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -64,43 +64,43 @@ fn test_buffered_reader_read_buf() {
6464
let mut buf = [MaybeUninit::uninit(); 3];
6565
let mut buf = ReadBuf::uninit(&mut buf);
6666

67-
reader.read_buf(&mut buf).unwrap();
67+
reader.read_buf(buf.borrow()).unwrap();
6868

6969
assert_eq!(buf.filled(), [5, 6, 7]);
7070
assert_eq!(reader.buffer(), []);
7171

7272
let mut buf = [MaybeUninit::uninit(); 2];
7373
let mut buf = ReadBuf::uninit(&mut buf);
7474

75-
reader.read_buf(&mut buf).unwrap();
75+
reader.read_buf(buf.borrow()).unwrap();
7676

7777
assert_eq!(buf.filled(), [0, 1]);
7878
assert_eq!(reader.buffer(), []);
7979

8080
let mut buf = [MaybeUninit::uninit(); 1];
8181
let mut buf = ReadBuf::uninit(&mut buf);
8282

83-
reader.read_buf(&mut buf).unwrap();
83+
reader.read_buf(buf.borrow()).unwrap();
8484

8585
assert_eq!(buf.filled(), [2]);
8686
assert_eq!(reader.buffer(), [3]);
8787

8888
let mut buf = [MaybeUninit::uninit(); 3];
8989
let mut buf = ReadBuf::uninit(&mut buf);
9090

91-
reader.read_buf(&mut buf).unwrap();
91+
reader.read_buf(buf.borrow()).unwrap();
9292

9393
assert_eq!(buf.filled(), [3]);
9494
assert_eq!(reader.buffer(), []);
9595

96-
reader.read_buf(&mut buf).unwrap();
96+
reader.read_buf(buf.borrow()).unwrap();
9797

9898
assert_eq!(buf.filled(), [3, 4]);
9999
assert_eq!(reader.buffer(), []);
100100

101101
buf.clear();
102102

103-
reader.read_buf(&mut buf).unwrap();
103+
reader.read_buf(buf.borrow()).unwrap();
104104

105105
assert_eq!(buf.filled_len(), 0);
106106
}

library/std/src/io/copy.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ impl<I: Write> BufferedCopySpec for BufWriter<I> {
9595
}
9696

9797
if read_buf.capacity() >= DEFAULT_BUF_SIZE {
98-
match reader.read_buf(&mut read_buf) {
98+
match reader.read_buf(read_buf.borrow()) {
9999
Ok(()) => {
100100
let bytes_read = read_buf.filled_len();
101101

@@ -132,7 +132,7 @@ fn stack_buffer_copy<R: Read + ?Sized, W: Write + ?Sized>(
132132
let mut len = 0;
133133

134134
loop {
135-
match reader.read_buf(&mut buf) {
135+
match reader.read_buf(buf.borrow()) {
136136
Ok(()) => {}
137137
Err(e) if e.kind() == ErrorKind::Interrupted => continue,
138138
Err(e) => return Err(e),

library/std/src/io/cursor.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ mod tests;
44
use crate::io::prelude::*;
55

66
use crate::cmp;
7-
use crate::io::{self, ErrorKind, IoSlice, IoSliceMut, ReadBuf, SeekFrom};
7+
use crate::io::{self, ErrorKind, IoSlice, IoSliceMut, ReadBufRef, SeekFrom};
88

99
use core::convert::TryInto;
1010

@@ -324,10 +324,10 @@ where
324324
Ok(n)
325325
}
326326

327-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> io::Result<()> {
327+
fn read_buf(&mut self, mut buf: ReadBufRef<'_, '_>) -> io::Result<()> {
328328
let prev_filled = buf.filled_len();
329329

330-
Read::read_buf(&mut self.fill_buf()?, buf)?;
330+
Read::read_buf(&mut self.fill_buf()?, buf.reborrow())?;
331331

332332
self.pos += (buf.filled_len() - prev_filled) as u64;
333333

library/std/src/io/impls.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::alloc::Allocator;
55
use crate::cmp;
66
use crate::fmt;
77
use crate::io::{
8-
self, BufRead, ErrorKind, IoSlice, IoSliceMut, Read, ReadBuf, Seek, SeekFrom, Write,
8+
self, BufRead, ErrorKind, IoSlice, IoSliceMut, Read, ReadBufRef, Seek, SeekFrom, Write,
99
};
1010
use crate::mem;
1111

@@ -20,7 +20,7 @@ impl<R: Read + ?Sized> Read for &mut R {
2020
}
2121

2222
#[inline]
23-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> io::Result<()> {
23+
fn read_buf(&mut self, buf: ReadBufRef<'_, '_>) -> io::Result<()> {
2424
(**self).read_buf(buf)
2525
}
2626

@@ -124,7 +124,7 @@ impl<R: Read + ?Sized> Read for Box<R> {
124124
}
125125

126126
#[inline]
127-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> io::Result<()> {
127+
fn read_buf(&mut self, buf: ReadBufRef<'_, '_>) -> io::Result<()> {
128128
(**self).read_buf(buf)
129129
}
130130

@@ -248,7 +248,7 @@ impl Read for &[u8] {
248248
}
249249

250250
#[inline]
251-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> io::Result<()> {
251+
fn read_buf(&mut self, mut buf: ReadBufRef<'_, '_>) -> io::Result<()> {
252252
let amt = cmp::min(buf.remaining(), self.len());
253253
let (a, b) = self.split_at(amt);
254254

library/std/src/io/mod.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ pub use self::{
281281
};
282282

283283
#[unstable(feature = "read_buf", issue = "78485")]
284-
pub use self::readbuf::ReadBuf;
284+
pub use self::readbuf::{ReadBuf, ReadBufRef};
285285
pub(crate) use error::const_io_error;
286286

287287
mod buffered;
@@ -372,7 +372,7 @@ pub(crate) fn default_read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>
372372
read_buf.assume_init(initialized);
373373
}
374374

375-
match r.read_buf(&mut read_buf) {
375+
match r.read_buf(read_buf.borrow()) {
376376
Ok(()) => {}
377377
Err(e) if e.kind() == ErrorKind::Interrupted => continue,
378378
Err(e) => return Err(e),
@@ -464,7 +464,7 @@ pub(crate) fn default_read_exact<R: Read + ?Sized>(this: &mut R, mut buf: &mut [
464464
}
465465
}
466466

467-
pub(crate) fn default_read_buf<F>(read: F, buf: &mut ReadBuf<'_>) -> Result<()>
467+
pub(crate) fn default_read_buf<F>(read: F, mut buf: ReadBufRef<'_, '_>) -> Result<()>
468468
where
469469
F: FnOnce(&mut [u8]) -> Result<usize>,
470470
{
@@ -811,7 +811,7 @@ pub trait Read {
811811
///
812812
/// The default implementation delegates to `read`.
813813
#[unstable(feature = "read_buf", issue = "78485")]
814-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> Result<()> {
814+
fn read_buf(&mut self, buf: ReadBufRef<'_, '_>) -> Result<()> {
815815
default_read_buf(|b| self.read(b), buf)
816816
}
817817

@@ -820,10 +820,10 @@ pub trait Read {
820820
/// This is equivalent to the [`read_exact`](Read::read_exact) method, except that it is passed a [`ReadBuf`] rather than `[u8]` to
821821
/// allow use with uninitialized buffers.
822822
#[unstable(feature = "read_buf", issue = "78485")]
823-
fn read_buf_exact(&mut self, buf: &mut ReadBuf<'_>) -> Result<()> {
823+
fn read_buf_exact(&mut self, mut buf: ReadBufRef<'_, '_>) -> Result<()> {
824824
while buf.remaining() > 0 {
825825
let prev_filled = buf.filled().len();
826-
match self.read_buf(buf) {
826+
match self.read_buf(buf.reborrow()) {
827827
Ok(()) => {}
828828
Err(e) if e.kind() == ErrorKind::Interrupted => continue,
829829
Err(e) => return Err(e),
@@ -2565,7 +2565,7 @@ impl<T: Read> Read for Take<T> {
25652565
Ok(n)
25662566
}
25672567

2568-
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> Result<()> {
2568+
fn read_buf(&mut self, mut buf: ReadBufRef<'_, '_>) -> Result<()> {
25692569
// Don't call into inner reader at all at EOF because it may still block
25702570
if self.limit == 0 {
25712571
return Ok(());
@@ -2589,7 +2589,7 @@ impl<T: Read> Read for Take<T> {
25892589
sliced_buf.assume_init(extra_init);
25902590
}
25912591

2592-
self.inner.read_buf(&mut sliced_buf)?;
2592+
self.inner.read_buf(sliced_buf.borrow())?;
25932593

25942594
let new_init = sliced_buf.initialized_len();
25952595
let filled = sliced_buf.filled_len();
@@ -2605,7 +2605,7 @@ impl<T: Read> Read for Take<T> {
26052605

26062606
self.limit -= filled as u64;
26072607
} else {
2608-
self.inner.read_buf(buf)?;
2608+
self.inner.read_buf(buf.reborrow())?;
26092609

26102610
//inner may unfill
26112611
self.limit -= buf.filled_len().saturating_sub(prev_filled) as u64;

0 commit comments

Comments
 (0)