use super::super::engine::TranscodeDecodeEngine;
use super::CodecTranscodeDecodeHooks;
use crate::{
CapacityError,
Codec,
TranscodeDecodeErrorOf,
TranscodeDecoder,
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,
),
}
}
#[inline(always)]
#[must_use]
pub fn codec(&self) -> &C {
self.engine.codec()
}
#[inline(always)]
#[must_use]
pub fn codec_mut(&mut self) -> &mut C {
self.engine.codec_mut()
}
#[inline(always)]
#[must_use]
pub fn into_codec(self) -> C {
self.engine.into_parts().0
}
}
impl<C> Transcoder for CodecTranscodeDecoder<C>
where
C: Codec,
{
type Input = C::Unit;
type Output = C::Value;
type Error = TranscodeDecodeErrorOf<C>;
#[inline(always)]
fn max_transcode_output_len(
&self,
input_len: usize,
) -> Result<usize, CapacityError> {
self.engine.max_transcode_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, TranscodeDecodeErrorOf<C>> {
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, TranscodeDecodeErrorOf<C>> {
self.engine
.transcode(input, input_index, output, output_index)
}
#[inline(always)]
fn transcode_eof(
&mut self,
input: &[C::Unit],
input_index: usize,
output: &mut [C::Value],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeDecodeErrorOf<C>> {
self.engine
.transcode_eof(input, input_index, output, output_index)
}
#[inline(always)]
fn finish(
&mut self,
output: &mut [C::Value],
output_index: usize,
) -> Result<usize, TranscodeDecodeErrorOf<C>> {
self.engine.finish(output, output_index)
}
}
impl<C> TranscodeDecoder for CodecTranscodeDecoder<C>
where
C: Codec,
{
type DecodeError = C::DecodeError;
}