diff options
| author | YuhanLiin <yuhanliin+github@protonmail.com> | 2021-05-29 17:47:51 -0400 |
|---|---|---|
| committer | YuhanLiin <yuhanliin+github@protonmail.com> | 2021-05-29 17:47:51 -0400 |
| commit | e76929ff981cd50e6a4d4936bf1f89ed625b032a (patch) | |
| tree | cd1767fe850a5e4023f9059a57ac6cbdadbd74a0 | |
| parent | ff5522fc1ae2c1d66fb2a465f48e03732fa8570b (diff) | |
| download | rust-e76929ff981cd50e6a4d4936bf1f89ed625b032a.tar.gz rust-e76929ff981cd50e6a4d4936bf1f89ed625b032a.zip | |
Add has_data_left() to BufRead
| -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 4c154dbe01a..21cad51bf93 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -1953,6 +1953,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 = "40745")] + 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 2b14e161503..4206b794058 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(); |
