Elide unnecessary copy when consuming a byte buffer. (#223)

This commit is contained in:
Kyle Huey 2017-12-01 10:26:08 -08:00 committed by Ty Overby
parent 1ecdeefe3d
commit 093bc24a13
1 changed files with 8 additions and 7 deletions

View File

@ -124,12 +124,13 @@ where
let current_length = self.temp_buffer.len();
if length > current_length {
self.temp_buffer.reserve_exact(length - current_length);
unsafe {
self.temp_buffer.set_len(length);
}
}
self.reader.read_exact(&mut self.temp_buffer[..length])?;
unsafe {
self.temp_buffer.set_len(length);
}
self.reader.read_exact(&mut self.temp_buffer)?;
Ok(())
}
}
@ -144,7 +145,7 @@ where
{
self.fill_buffer(length)?;
let string = match ::std::str::from_utf8(&self.temp_buffer[..length]) {
let string = match ::std::str::from_utf8(&self.temp_buffer[..]) {
Ok(s) => s,
Err(e) => return Err(::ErrorKind::InvalidUtf8Encoding(e).into()),
};
@ -155,7 +156,7 @@ where
fn get_byte_buffer(&mut self, length: usize) -> Result<Vec<u8>> {
self.fill_buffer(length)?;
Ok(self.temp_buffer[..length].to_vec())
Ok(::std::mem::replace(&mut self.temp_buffer, Vec::new()))
}
fn forward_read_bytes<V>(&mut self, length: usize, visitor: V) -> Result<V::Value>
@ -163,7 +164,7 @@ where
V: serde::de::Visitor<'static>,
{
self.fill_buffer(length)?;
let r = visitor.visit_bytes(&self.temp_buffer[..length]);
let r = visitor.visit_bytes(&self.temp_buffer[..]);
r
}
}