use super::CodecTranscodeDecodeHooks;
use crate::{
CapacityError,
Codec,
CodecDecodeError,
TranscodeDecodeEngine,
TranscodeDecoder,
TranscodeError,
TranscodeProgress,
Transcoder,
};
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
pub struct CodecTranscodeDecoder<C> {
engine: TranscodeDecodeEngine<C, CodecTranscodeDecodeHooks>,
}
impl<C> CodecTranscodeDecoder<C>
where
C: Codec,
{
#[must_use]
#[inline]
pub fn new(codec: C) -> Self {
Self {
engine: TranscodeDecodeEngine::new(
codec,
CodecTranscodeDecodeHooks,
),
}
}
}
impl<C> Transcoder<C::Unit, C::Value> for CodecTranscodeDecoder<C>
where
C: Codec,
{
type Error = CodecDecodeError<C::DecodeError>;
#[inline(always)]
fn max_output_len(&self, input_len: usize) -> Result<usize, CapacityError> {
self.engine.max_output_len(input_len)
}
#[inline(always)]
fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_finish_output_len()
}
#[inline(always)]
fn max_reset_output_len(&self) -> Result<usize, CapacityError> {
Ok(self.engine.max_reset_output_len())
}
#[inline(always)]
fn reset(
&mut self,
output: &mut [C::Value],
output_index: usize,
) -> Result<usize, TranscodeError<Self::Error>> {
self.engine.reset(output, output_index)
}
#[inline(always)]
fn transcode(
&mut self,
input: &[C::Unit],
input_index: usize,
output: &mut [C::Value],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeError<Self::Error>> {
self.engine
.transcode(input, input_index, output, output_index)
}
#[inline(always)]
fn finish(
&mut self,
output: &mut [C::Value],
output_index: usize,
) -> Result<usize, TranscodeError<Self::Error>> {
self.engine.finish(output, output_index)
}
}
impl<C> TranscodeDecoder<C::Unit, C::Value> for CodecTranscodeDecoder<C> where
C: Codec
{
}