diff options
| author | Sören Meier <soeren@s-me.ch> | 2021-06-05 19:02:38 +0200 |
|---|---|---|
| committer | Sören Meier <soeren@s-me.ch> | 2021-06-05 19:02:38 +0200 |
| commit | 08d44c2cc314aea420a2945ad16528992fb5b666 (patch) | |
| tree | 820a08bdbff809a78b693f6aea3174f5e08cc5c1 | |
| parent | 5ea19239d9d6f49fdd76513a36386d7e83708e3f (diff) | |
| download | rust-08d44c2cc314aea420a2945ad16528992fb5b666.tar.gz rust-08d44c2cc314aea420a2945ad16528992fb5b666.zip | |
Implement `Cursor::{remaining, is_empty}`
| -rw-r--r-- | library/std/src/io/cursor.rs | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/library/std/src/io/cursor.rs b/library/std/src/io/cursor.rs index 9527254c947..c0cb75a0eae 100644 --- a/library/std/src/io/cursor.rs +++ b/library/std/src/io/cursor.rs @@ -205,6 +205,62 @@ impl<T> Cursor<T> { } } +impl<T> Cursor<T> +where + T: AsRef<[u8]>, +{ + /// Returns the remaining slice. + /// + /// # Examples + /// + /// ``` + /// #![feature(cursor_remaining)] + /// use std::io::Cursor; + /// + /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]); + /// + /// assert_eq!(buff.remaining(), &[1, 2, 3, 4, 5]); + /// + /// buff.set_position(2); + /// assert_eq!(buff.remaining(), &[3, 4, 5]); + /// + /// buff.set_position(4); + /// assert_eq!(buff.remaining(), &[5]); + /// + /// buff.set_position(6); + /// assert_eq!(buff.remaining(), &[]); + /// ``` + #[unstable(feature = "cursor_remaining", issue = "none")] + pub fn remaining(&self) -> &[u8] { + let len = self.pos.min(self.inner.as_ref().len() as u64); + &self.inner.as_ref()[(len as usize)..] + } + + /// Returns `true` if the remaining slice is empty. + /// + /// # Examples + /// + /// ``` + /// #![feature(cursor_remaining)] + /// use std::io::Cursor; + /// + /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]); + /// + /// buff.set_position(2); + /// assert!(!buff.is_empty()); + /// + /// buff.set_position(5); + /// assert!(buff.is_empty()); + /// + /// buff.set_position(10); + /// assert!(buff.is_empty()); + /// ``` + #[unstable(feature = "cursor_remaining", issue = "none")] + pub fn is_empty(&self) -> bool { + self.pos >= self.inner.as_ref().len() as u64 + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl<T> Clone for Cursor<T> where @@ -268,7 +324,7 @@ where T: AsRef<[u8]>, { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { - let n = Read::read(&mut self.fill_buf()?, buf)?; + let n = Read::read(&mut self.remaining(), buf)?; self.pos += n as u64; Ok(n) } @@ -291,7 +347,7 @@ where fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> { let n = buf.len(); - Read::read_exact(&mut self.fill_buf()?, buf)?; + Read::read_exact(&mut self.remaining(), buf)?; self.pos += n as u64; Ok(()) } @@ -308,8 +364,7 @@ where T: AsRef<[u8]>, { fn fill_buf(&mut self) -> io::Result<&[u8]> { - let amt = cmp::min(self.pos, self.inner.as_ref().len() as u64); - Ok(&self.inner.as_ref()[(amt as usize)..]) + Ok(self.remaining()) } fn consume(&mut self, amt: usize) { self.pos += amt as u64; |
