use super::super::engine::TranscodeDecodeEngine;
use super::CodecTranscodeDecodeHooks;
use crate::CapacityError;
use crate::Codec;
use crate::TranscodeDecodeErrorOf;
use crate::TranscodeDecoder;
use crate::TranscodeProgress;
use crate::Transcoder;
#[derive(Debug)]
pub struct CodecTranscodeDecoder<C> {
engine: TranscodeDecodeEngine<C, CodecTranscodeDecodeHooks>,
}
impl<C> Default for CodecTranscodeDecoder<C>
where
C: Codec + Default,
{
#[inline]
fn default() -> Self {
Self::new(C::default())
}
}
impl<C> CodecTranscodeDecoder<C>
where
C: Codec,
{
#[inline]
#[must_use]
pub fn new(codec: C) -> Self {
Self {
engine: TranscodeDecodeEngine::new(codec, CodecTranscodeDecodeHooks),
}
}
#[inline]
#[must_use]
pub fn codec(&self) -> &C {
self.engine.codec()
}
#[inline]
#[must_use]
pub fn codec_mut(&mut self) -> &mut C {
self.engine.codec_mut()
}
#[inline]
#[must_use]
pub fn into_codec(self) -> C {
let (codec, _) = self.engine.into_parts();
codec
}
}
impl<C> Transcoder for CodecTranscodeDecoder<C>
where
C: Codec,
{
type Input = C::Unit;
type Output = C::Value;
type Error = TranscodeDecodeErrorOf<C>;
#[inline]
fn max_transcode_output_len(&self, input_len: usize) -> Result<usize, CapacityError> {
self.engine.max_transcode_output_len(input_len)
}
#[inline]
fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_finish_output_len()
}
#[inline]
fn max_reset_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_reset_output_len()
}
#[inline]
fn reset(&mut self, output: &mut [C::Value], output_index: usize) -> Result<usize, TranscodeDecodeErrorOf<C>> {
self.engine.reset(output, output_index)
}
#[inline]
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]
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]
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;
}