42 lines
1013 B
Rust
42 lines
1013 B
Rust
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
|
|
}
|
|
}
|