diff options
| author | Ben Kimock <kimockb@gmail.com> | 2022-07-26 20:03:14 -0400 |
|---|---|---|
| committer | Ben Kimock <kimockb@gmail.com> | 2022-07-26 20:16:55 -0400 |
| commit | 5fa19266348c4d52d444bf8289851e374e38887d (patch) | |
| tree | 5ed2b3c07b01533683e04f4828e3b07a8ede2866 /library/std/src/io/buffered/bufreader | |
| parent | 5e5ce4327a4574cd207f0a427822848be7f71e8d (diff) | |
| download | rust-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.rs | 17 |
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); |
