1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
pub fn _assert_send<T: Send>() {} pub fn _assert_sync<T: Sync>() {} #[derive(Debug, Default)] pub struct PartialBuffer<B: AsRef<[u8]>> { buffer: B, index: usize, } impl<B: AsRef<[u8]>> PartialBuffer<B> { pub(crate) fn new(buffer: B) -> Self { Self { buffer, index: 0 } } pub(crate) fn written(&self) -> &[u8] { &self.buffer.as_ref()[..self.index] } pub(crate) fn unwritten(&self) -> &[u8] { &self.buffer.as_ref()[self.index..] } pub(crate) fn advance(&mut self, amount: usize) { self.index += amount; } pub(crate) fn get_mut(&mut self) -> &mut B { &mut self.buffer } pub(crate) fn into_inner(self) -> B { self.buffer } } impl<B: AsRef<[u8]> + AsMut<[u8]>> PartialBuffer<B> { pub(crate) fn unwritten_mut(&mut self) -> &mut [u8] { &mut self.buffer.as_mut()[self.index..] } pub(crate) fn copy_unwritten_from<C: AsRef<[u8]>>(&mut self, other: &mut PartialBuffer<C>) { let len = std::cmp::min(self.unwritten().len(), other.unwritten().len()); self.unwritten_mut()[..len].copy_from_slice(&other.unwritten()[..len]); self.advance(len); other.advance(len); } } impl<B: AsRef<[u8]> + Default> PartialBuffer<B> { pub(crate) fn take(&mut self) -> Self { std::mem::replace(self, Self::new(B::default())) } } impl<B: AsRef<[u8]> + AsMut<[u8]>> From<B> for PartialBuffer<B> { fn from(buffer: B) -> Self { Self::new(buffer) } }