summaryrefslogtreecommitdiffstats
path: root/library/std/src/io/buffered
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /library/std/src/io/buffered
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/std/src/io/buffered')
-rw-r--r--library/std/src/io/buffered/bufreader.rs25
1 files changed, 20 insertions, 5 deletions
diff --git a/library/std/src/io/buffered/bufreader.rs b/library/std/src/io/buffered/bufreader.rs
index 7097dfef8..55aafc3db 100644
--- a/library/std/src/io/buffered/bufreader.rs
+++ b/library/std/src/io/buffered/bufreader.rs
@@ -2,7 +2,8 @@ mod buffer;
use crate::fmt;
use crate::io::{
- self, BorrowedCursor, BufRead, IoSliceMut, Read, Seek, SeekFrom, SizeHint, DEFAULT_BUF_SIZE,
+ self, uninlined_slow_read_byte, BorrowedCursor, BufRead, IoSliceMut, Read, Seek, SeekFrom,
+ SizeHint, SpecReadByte, DEFAULT_BUF_SIZE,
};
use buffer::Buffer;
@@ -259,6 +260,22 @@ impl<R: ?Sized + Seek> BufReader<R> {
}
}
+impl<R> SpecReadByte for BufReader<R>
+where
+ Self: Read,
+{
+ #[inline]
+ fn spec_read_byte(&mut self) -> Option<io::Result<u8>> {
+ let mut byte = 0;
+ if self.buf.consume_with(1, |claimed| byte = claimed[0]) {
+ return Some(Ok(byte));
+ }
+
+ // Fallback case, only reached once per buffer refill.
+ uninlined_slow_read_byte(self)
+ }
+}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl<R: ?Sized + Read> Read for BufReader<R> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
@@ -269,10 +286,8 @@ impl<R: ?Sized + Read> Read for BufReader<R> {
self.discard_buffer();
return self.inner.read(buf);
}
- let nread = {
- let mut rem = self.fill_buf()?;
- rem.read(buf)?
- };
+ let mut rem = self.fill_buf()?;
+ let nread = rem.read(buf)?;
self.consume(nread);
Ok(nread)
}