about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSören Meier <soeren@s-me.ch>2021-06-05 19:02:38 +0200
committerSören Meier <soeren@s-me.ch>2021-06-05 19:02:38 +0200
commit08d44c2cc314aea420a2945ad16528992fb5b666 (patch)
tree820a08bdbff809a78b693f6aea3174f5e08cc5c1
parent5ea19239d9d6f49fdd76513a36386d7e83708e3f (diff)
downloadrust-08d44c2cc314aea420a2945ad16528992fb5b666.tar.gz
rust-08d44c2cc314aea420a2945ad16528992fb5b666.zip
Implement `Cursor::{remaining, is_empty}`
-rw-r--r--library/std/src/io/cursor.rs63
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;