| 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<u8>, |
| dest: &'bufs mut Vec<u8>, |
| } |
| |
| 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<u8>) { |
| match self.ro_src { |
| Some(src) => (src, &mut self.dest), |
| None => (self.src, &mut self.dest), |
| } |
| } |
| } |