diff options
| author | bors <bors@rust-lang.org> | 2021-06-18 20:11:51 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-06-18 20:11:51 +0000 |
| commit | ce1d5611a28468663e275078649e7ca6eef735a8 (patch) | |
| tree | 941809ffb25c8d908adee20f61895a44bb28583c /library/std/src | |
| parent | 88ba8ad730a124f7e1d4f1bd17f2b14cb18eed3c (diff) | |
| parent | 99939c44c3fabbd4bfcb87839072ba563ce12d9b (diff) | |
| download | rust-ce1d5611a28468663e275078649e7ca6eef735a8.tar.gz rust-ce1d5611a28468663e275078649e7ca6eef735a8.zip | |
Auto merge of #85815 - YuhanLiin:buf-read-data-left, r=m-ou-se
Add has_data_left() to BufRead This is a continuation of #40747 and also addresses #40745. The problem with the previous PR was that it had "eof" in its method name. This PR uses a more descriptive method name, but I'm open to changing it.
Diffstat (limited to 'library/std/src')
| -rw-r--r-- | library/std/src/io/mod.rs | 31 | ||||
| -rw-r--r-- | library/std/src/io/tests.rs | 10 |
2 files changed, 41 insertions, 0 deletions
diff --git a/library/std/src/io/mod.rs b/library/std/src/io/mod.rs index a25ef8c87a5..00b85604a3f 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -2005,6 +2005,37 @@ pub trait BufRead: Read { #[stable(feature = "rust1", since = "1.0.0")] fn consume(&mut self, amt: usize); + /// Check if the underlying `Read` has any data left to be read. + /// + /// This function may fill the buffer to check for data, + /// so this functions returns `Result<bool>`, not `bool`. + /// + /// Default implementation calls `fill_buf` and checks that + /// returned slice is empty (which means that there is no data left, + /// since EOF is reached). + /// + /// Examples + /// + /// ``` + /// #![feature(buf_read_has_data_left)] + /// use std::io; + /// use std::io::prelude::*; + /// + /// let stdin = io::stdin(); + /// let mut stdin = stdin.lock(); + /// + /// while stdin.has_data_left().unwrap() { + /// let mut line = String::new(); + /// stdin.read_line(&mut line).unwrap(); + /// // work with line + /// println!("{:?}", line); + /// } + /// ``` + #[unstable(feature = "buf_read_has_data_left", reason = "recently added", issue = "86423")] + fn has_data_left(&mut self) -> Result<bool> { + self.fill_buf().map(|b| !b.is_empty()) + } + /// Read all bytes into `buf` until the delimiter `byte` or EOF is reached. /// /// This function will read bytes from the underlying stream until the diff --git a/library/std/src/io/tests.rs b/library/std/src/io/tests.rs index 2ee30f5fb4f..b73bcf85fbe 100644 --- a/library/std/src/io/tests.rs +++ b/library/std/src/io/tests.rs @@ -72,6 +72,16 @@ fn lines() { } #[test] +fn buf_read_has_data_left() { + let mut buf = Cursor::new(&b"abcd"[..]); + assert!(buf.has_data_left().unwrap()); + buf.read_exact(&mut [0; 2]).unwrap(); + assert!(buf.has_data_left().unwrap()); + buf.read_exact(&mut [0; 2]).unwrap(); + assert!(!buf.has_data_left().unwrap()); +} + +#[test] fn read_to_end() { let mut c = Cursor::new(&b""[..]); let mut v = Vec::new(); |
