use std::cmp::min; use super::*; /// [Deserializer] for slices. Used in [`FactoryExt::parse_slice`] and [`AtomicExt::parse_slice`]. /// /// [`FactoryExt::parse_slice`]: crate::rcore::FactoryExt::parse_slice /// [`AtomicExt::parse_slice`]: crate::atomic::AtomicExt::parse_slice pub struct SliceDeserializer<'a> { slice: &'a [u8], pos: usize, } impl<'a> From<&'a [u8]> for SliceDeserializer<'a> { fn from(value: &'a [u8]) -> Self { SliceDeserializer { slice: value, pos: 0, } } } impl<'a> Deserializer for SliceDeserializer<'a> { fn read_n(&mut self, n: usize) -> &[u8] { let (slice_l, slice_r) = self.slice.split_at(min(n, self.slice.len())); self.slice = slice_r; self.pos += slice_l.len(); slice_l } fn read_all(&mut self) -> &[u8] { let slice_l = self.slice; self.slice = &[]; self.pos += slice_l.len(); slice_l } fn tell(&self) -> usize { self.pos } }