From 08d44c2cc314aea420a2945ad16528992fb5b666 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Meier?= Date: Sat, 5 Jun 2021 19:02:38 +0200 Subject: [PATCH 1/3] Implement `Cursor::{remaining, is_empty}` --- library/std/src/io/cursor.rs | 63 +++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/library/std/src/io/cursor.rs b/library/std/src/io/cursor.rs index 9527254c94793..c0cb75a0eaef2 100644 --- a/library/std/src/io/cursor.rs +++ b/library/std/src/io/cursor.rs @@ -205,6 +205,62 @@ impl Cursor { } } +impl Cursor +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 Clone for Cursor where @@ -268,7 +324,7 @@ where T: AsRef<[u8]>, { fn read(&mut self, buf: &mut [u8]) -> io::Result { - 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; From 212e91a3568b3f65fb504ce23ffe31d8d00bbb90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Meier?= Date: Wed, 16 Jun 2021 17:25:47 +0200 Subject: [PATCH 2/3] Update tracking issue --- library/std/src/io/cursor.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/std/src/io/cursor.rs b/library/std/src/io/cursor.rs index c0cb75a0eaef2..db720531e3abb 100644 --- a/library/std/src/io/cursor.rs +++ b/library/std/src/io/cursor.rs @@ -230,7 +230,7 @@ where /// buff.set_position(6); /// assert_eq!(buff.remaining(), &[]); /// ``` - #[unstable(feature = "cursor_remaining", issue = "none")] + #[unstable(feature = "cursor_remaining", issue = "86369")] pub fn remaining(&self) -> &[u8] { let len = self.pos.min(self.inner.as_ref().len() as u64); &self.inner.as_ref()[(len as usize)..] @@ -255,7 +255,7 @@ where /// buff.set_position(10); /// assert!(buff.is_empty()); /// ``` - #[unstable(feature = "cursor_remaining", issue = "none")] + #[unstable(feature = "cursor_remaining", issue = "86369")] pub fn is_empty(&self) -> bool { self.pos >= self.inner.as_ref().len() as u64 } From 664bde0770fcd898a6da97a117996de1366098dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Meier?= Date: Thu, 17 Jun 2021 02:14:53 +0200 Subject: [PATCH 3/3] rename `remaining` to `remaining_slice` and add a new `remaining` --- library/std/src/io/cursor.rs | 42 +++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/library/std/src/io/cursor.rs b/library/std/src/io/cursor.rs index db720531e3abb..04f13cdeb88e3 100644 --- a/library/std/src/io/cursor.rs +++ b/library/std/src/io/cursor.rs @@ -209,6 +209,32 @@ impl Cursor where T: AsRef<[u8]>, { + /// Returns the remaining length. + /// + /// # Examples + /// + /// ``` + /// #![feature(cursor_remaining)] + /// use std::io::Cursor; + /// + /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]); + /// + /// assert_eq!(buff.remaining(), 5); + /// + /// buff.set_position(2); + /// assert_eq!(buff.remaining(), 3); + /// + /// buff.set_position(4); + /// assert_eq!(buff.remaining(), 1); + /// + /// buff.set_position(6); + /// assert_eq!(buff.remaining(), 0); + /// ``` + #[unstable(feature = "cursor_remaining", issue = "86369")] + pub fn remaining(&self) -> u64 { + (self.inner.as_ref().len() as u64).checked_sub(self.pos).unwrap_or(0) + } + /// Returns the remaining slice. /// /// # Examples @@ -219,19 +245,19 @@ where /// /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]); /// - /// assert_eq!(buff.remaining(), &[1, 2, 3, 4, 5]); + /// assert_eq!(buff.remaining_slice(), &[1, 2, 3, 4, 5]); /// /// buff.set_position(2); - /// assert_eq!(buff.remaining(), &[3, 4, 5]); + /// assert_eq!(buff.remaining_slice(), &[3, 4, 5]); /// /// buff.set_position(4); - /// assert_eq!(buff.remaining(), &[5]); + /// assert_eq!(buff.remaining_slice(), &[5]); /// /// buff.set_position(6); - /// assert_eq!(buff.remaining(), &[]); + /// assert_eq!(buff.remaining_slice(), &[]); /// ``` #[unstable(feature = "cursor_remaining", issue = "86369")] - pub fn remaining(&self) -> &[u8] { + pub fn remaining_slice(&self) -> &[u8] { let len = self.pos.min(self.inner.as_ref().len() as u64); &self.inner.as_ref()[(len as usize)..] } @@ -324,7 +350,7 @@ where T: AsRef<[u8]>, { fn read(&mut self, buf: &mut [u8]) -> io::Result { - let n = Read::read(&mut self.remaining(), buf)?; + let n = Read::read(&mut self.remaining_slice(), buf)?; self.pos += n as u64; Ok(n) } @@ -347,7 +373,7 @@ where fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> { let n = buf.len(); - Read::read_exact(&mut self.remaining(), buf)?; + Read::read_exact(&mut self.remaining_slice(), buf)?; self.pos += n as u64; Ok(()) } @@ -364,7 +390,7 @@ where T: AsRef<[u8]>, { fn fill_buf(&mut self) -> io::Result<&[u8]> { - Ok(self.remaining()) + Ok(self.remaining_slice()) } fn consume(&mut self, amt: usize) { self.pos += amt as u64;