Add Buffer::consume_with to enable direct buffer access with one check
This commit is contained in:
parent
5e5ce4327a
commit
5fa1926634
2 changed files with 18 additions and 3 deletions
|
@ -290,9 +290,7 @@ impl<R: Read> Read for BufReader<R> {
|
|||
// generation for the common path where the buffer has enough bytes to fill the passed-in
|
||||
// buffer.
|
||||
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
|
||||
if let Some(claimed) = self.buffer().get(..buf.len()) {
|
||||
buf.copy_from_slice(claimed);
|
||||
self.consume(claimed.len());
|
||||
if self.buf.consume_with(buf.len(), |claimed| buf.copy_from_slice(claimed)) {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue