use super::{
read::{BorrowReader, Reader},
BorrowDecoder, Decoder,
};
use crate::{config::Config, error::DecodeError, utils::Sealed};
pub struct DecoderImpl<R, C: Config> {
reader: R,
config: C,
bytes_read: usize,
}
impl<R: Reader, C: Config> DecoderImpl<R, C> {
pub fn new(reader: R, config: C) -> DecoderImpl<R, C> {
DecoderImpl {
reader,
config,
bytes_read: 0,
}
}
}
impl<R, C: Config> Sealed for DecoderImpl<R, C> {}
impl<'de, R: BorrowReader<'de>, C: Config> BorrowDecoder<'de> for DecoderImpl<R, C> {
type BR = R;
fn borrow_reader(&mut self) -> &mut Self::BR {
&mut self.reader
}
}
impl<R: Reader, C: Config> Decoder for DecoderImpl<R, C> {
type R = R;
type C = C;
fn reader(&mut self) -> &mut Self::R {
&mut self.reader
}
fn config(&self) -> &Self::C {
&self.config
}
#[inline]
fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError> {
if let Some(limit) = C::LIMIT {
self.bytes_read = self
.bytes_read
.checked_add(n)
.ok_or(DecodeError::LimitExceeded)?;
if self.bytes_read > limit {
Err(DecodeError::LimitExceeded)
} else {
Ok(())
}
} else {
Ok(())
}
}
#[inline]
fn unclaim_bytes_read(&mut self, n: usize) {
if C::LIMIT.is_some() {
self.bytes_read -= n;
}
}
}