From 539906f441b53503c4f66fc89f182ba719f1e447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lena=20Hellstr=C3=B6m?= Date: Fri, 22 Oct 2021 14:47:05 +0200 Subject: [PATCH] Optimize performance of slice writing --- src/enc/write.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/enc/write.rs b/src/enc/write.rs index e5e16a2..dc57096 100644 --- a/src/enc/write.rs +++ b/src/enc/write.rs @@ -26,33 +26,35 @@ pub trait Writer { /// ``` pub struct SliceWriter<'storage> { slice: &'storage mut [u8], - idx: usize, + original_length: usize, } impl<'storage> SliceWriter<'storage> { /// Create a new instance of `SliceWriter` with the given byte array. pub fn new(bytes: &'storage mut [u8]) -> SliceWriter<'storage> { + let original = bytes.len(); SliceWriter { slice: bytes, - idx: 0, + original_length: original, } } /// Return the amount of bytes written so far. pub fn bytes_written(&self) -> usize { - self.idx + self.original_length - self.slice.len() } } impl<'storage> Writer for SliceWriter<'storage> { + #[inline(always)] fn write(&mut self, bytes: &[u8]) -> Result<(), EncodeError> { - let remaining = &mut self.slice[self.idx..]; - if bytes.len() > remaining.len() { + if bytes.len() > self.slice.len() { return Err(EncodeError::UnexpectedEnd); } - self.idx += bytes.len(); - let write_slice = &mut remaining[..bytes.len()]; - write_slice.copy_from_slice(bytes); + let (a, b) = core::mem::replace(&mut self.slice, &mut []).split_at_mut(bytes.len()); + a.copy_from_slice(&bytes[..]); + self.slice = b; + Ok(()) } }