about summary refs log tree commit diff
path: root/library/std/src/io/buffered/bufreader
diff options
context:
space:
mode:
authorBen Kimock <kimockb@gmail.com>2022-07-26 20:03:14 -0400
committerBen Kimock <kimockb@gmail.com>2022-07-26 20:16:55 -0400
commit5fa19266348c4d52d444bf8289851e374e38887d (patch)
tree5ed2b3c07b01533683e04f4828e3b07a8ede2866 /library/std/src/io/buffered/bufreader
parent5e5ce4327a4574cd207f0a427822848be7f71e8d (diff)
downloadrust-5fa19266348c4d52d444bf8289851e374e38887d.tar.gz
rust-5fa19266348c4d52d444bf8289851e374e38887d.zip
Add Buffer::consume_with to enable direct buffer access with one check
Diffstat (limited to 'library/std/src/io/buffered/bufreader')
-rw-r--r--library/std/src/io/buffered/bufreader/buffer.rs17
1 files changed, 17 insertions, 0 deletions
diff --git a/library/std/src/io/buffered/bufreader/buffer.rs b/library/std/src/io/buffered/bufreader/buffer.rs
index bf3462bf00c..8ae01f3b0ad 100644
--- a/library/std/src/io/buffered/bufreader/buffer.rs
+++ b/library/std/src/io/buffered/bufreader/buffer.rs
@@ -62,6 +62,23 @@ impl Buffer {
         self.pos = cmp::min(self.pos + amt, self.filled);
     }
 
+    /// If there are `amt` bytes available in the buffer, pass a slice containing those bytes to
+    /// `visitor` and return true. If there are not enough bytes available, return false.
+    #[inline]
+    pub fn consume_with<V>(&mut self, amt: usize, mut visitor: V) -> bool
+    where
+        V: FnMut(&[u8]),
+    {
+        if let Some(claimed) = self.buffer().get(..amt) {
+            visitor(claimed);
+            // If the indexing into self.buffer() succeeds, amt must be a valid increment.
+            self.pos += amt;
+            true
+        } else {
+            false
+        }
+    }
+
     #[inline]
     pub fn unconsume(&mut self, amt: usize) {
         self.pos = self.pos.saturating_sub(amt);