use crate::prelude::*;
use super::ReadNoStd;
#[derive(Debug)]
#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))]
pub struct ReaderWithPos<'a, F: ReadNoStd> {
backend: &'a mut F,
pos: usize,
}
impl<'a, F: ReadNoStd> ReaderWithPos<'a, F> {
#[inline(always)]
pub const fn new(backend: &'a mut F) -> Self {
Self { backend, pos: 0 }
}
}
impl<F: ReadNoStd> ReadNoStd for ReaderWithPos<'_, F> {
fn read_exact(&mut self, buf: &mut [u8]) -> deser::Result<()> {
self.backend.read_exact(buf)?;
self.pos += buf.len();
Ok(())
}
}
impl<F: ReadNoStd> ReadWithPos for ReaderWithPos<'_, F> {
fn pos(&self) -> usize {
self.pos
}
fn align<T: AlignTo>(&mut self) -> deser::Result<()> {
let mut padding = crate::pad_align_to(self.pos, T::align_to());
let mut buf = [0u8; 64];
while padding > 0 {
let n = padding.min(buf.len());
self.read_exact(&mut buf[..n])?;
padding -= n;
}
Ok(())
}
}