use super::CodecTranscodeDecodeHooks;
use crate::{
CapacityError,
Codec,
CodecDecodeError,
TranscodeDecodeEngine,
TranscodeDecodeEngineError,
TranscodeDecoder,
TranscodeError,
TranscodeProgress,
Transcoder,
};
#[derive(Debug, Default)]
pub struct CodecTranscodeDecoder<C> {
engine: TranscodeDecodeEngine<C, CodecTranscodeDecodeHooks>,
}
impl<C> CodecTranscodeDecoder<C>
where
C: Codec,
{
#[inline]
#[must_use]
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> {
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)
.map_err(|error| error.map_domain(flatten_decode_engine_error))
}
#[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)
.map_err(|error| error.map_domain(flatten_decode_engine_error))
}
#[inline(always)]
fn finish(
&mut self,
output: &mut [C::Value],
output_index: usize,
) -> Result<usize, TranscodeError<Self::Error>> {
self.engine
.finish(output, output_index)
.map_err(|error| error.map_domain(flatten_decode_engine_error))
}
}
impl<C> TranscodeDecoder<C::Unit, C::Value> for CodecTranscodeDecoder<C> where
C: Codec
{
}
#[inline(always)]
fn flatten_decode_engine_error<E>(
error: TranscodeDecodeEngineError<E, CodecDecodeError<E>>,
) -> CodecDecodeError<E> {
match error {
TranscodeDecodeEngineError::Codec(error)
| TranscodeDecodeEngineError::Hook(error) => error,
}
}