use crate::Buffers; /// Lifecycle impl Buffers { /// Use this if there is an input buffer `src` which isn't owned by you, but which should be used as source when /// asking for [`src_and_dest()`](WithForeignSource::src_and_dest()). pub fn use_foreign_src<'a, 'src>(&'a mut self, src: &'src [u8]) -> WithForeignSource<'src, 'a> { self.clear(); WithForeignSource { ro_src: Some(src), src: &mut self.src, dest: &mut self.dest, } } } impl Buffers { /// Clear all buffers, which should be called once processing is done. pub fn clear(&mut self) { self.src.clear(); self.dest.clear(); } /// Must be called after every change (i.e. when it's known that `dest` was written. pub fn swap(&mut self) { std::mem::swap(&mut self.src, &mut self.dest); } } /// A utility to do buffer-swapping with, similar to [`Buffers`], but with support for a /// read-only one-time buffer as source. pub struct WithForeignSource<'src, 'bufs> { /// The original source buffer, or `None` if already altered. pub ro_src: Option<&'src [u8]>, /// The source buffer that will be used after the first call to `swap`. pub src: &'bufs mut Vec, dest: &'bufs mut Vec, } impl<'bufs> WithForeignSource<'_, 'bufs> { /// Must be called after every change (i.e. when it's known that `dest` was written. pub fn swap(&mut self) { self.ro_src.take(); std::mem::swap(&mut self.src, &mut self.dest); self.dest.clear(); } /// Obtain `(source, destination)`, which reads from the read-only source exactly once. pub fn src_and_dest(&mut self) -> (&[u8], &mut Vec) { match self.ro_src { Some(src) => (src, &mut self.dest), None => (self.src, &mut self.dest), } } }