use core::fmt;
use super::{
super::engine::TranscodeConvertEngine,
CodecTranscodeDecodeHooks,
CodecTranscodeEncodeHooks,
};
use crate::{
CapacityError,
Codec,
TranscodeConvertErrorOf,
TranscodeConverter,
TranscodeProgress,
Transcoder,
};
pub struct CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
{
engine: TranscodeConvertEngine<
D,
E,
CodecTranscodeDecodeHooks,
CodecTranscodeEncodeHooks,
>,
}
impl<D, E> CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
{
#[inline(always)]
#[must_use]
pub fn new(decoder: D, encoder: E) -> Self {
Self {
engine: TranscodeConvertEngine::new(
decoder,
encoder,
CodecTranscodeDecodeHooks,
CodecTranscodeEncodeHooks,
),
}
}
#[inline(always)]
#[must_use]
pub fn source_codec(&self) -> &D {
self.engine.source_codec()
}
#[inline(always)]
#[must_use]
pub fn source_codec_mut(&mut self) -> &mut D {
self.engine.source_codec_mut()
}
#[inline(always)]
#[must_use]
pub fn target_codec(&self) -> &E {
self.engine.target_codec()
}
#[inline(always)]
#[must_use]
pub fn target_codec_mut(&mut self) -> &mut E {
self.engine.target_codec_mut()
}
#[inline(always)]
#[must_use]
pub fn into_codecs(self) -> (D, E) {
let (source, target, _, _) = self.engine.into_parts();
(source, target)
}
#[must_use = "capacity planning can fail on overflow"]
#[inline(always)]
pub fn max_transcode_output_len(
&self,
input_len: usize,
) -> Result<usize, CapacityError> {
self.engine.max_transcode_output_len(input_len)
}
#[must_use = "capacity planning can fail on overflow"]
#[inline(always)]
pub fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_finish_output_len()
}
#[must_use = "capacity planning can fail on overflow"]
#[inline(always)]
pub fn max_reset_output_len(&self) -> Result<usize, CapacityError> {
self.engine.max_reset_output_len()
}
#[inline(always)]
pub fn reset(
&mut self,
output: &mut [E::Unit],
output_index: usize,
) -> Result<usize, TranscodeConvertErrorOf<D, E>>
where
D::Value: Default,
{
self.engine.reset(output, output_index)
}
#[inline(always)]
pub fn transcode(
&mut self,
input: &[D::Unit],
input_index: usize,
output: &mut [E::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeConvertErrorOf<D, E>> {
self.engine
.transcode(input, input_index, output, output_index)
}
#[inline(always)]
pub fn transcode_eof(
&mut self,
input: &[D::Unit],
input_index: usize,
output: &mut [E::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeConvertErrorOf<D, E>> {
self.engine
.transcode_eof(input, input_index, output, output_index)
}
#[inline(always)]
pub fn finish(
&mut self,
output: &mut [E::Unit],
output_index: usize,
) -> Result<usize, TranscodeConvertErrorOf<D, E>>
where
D::Value: Default,
{
self.engine.finish(output, output_index)
}
}
impl<D, E> Transcoder for CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
D::Value: Default,
{
type Input = D::Unit;
type Output = E::Unit;
type Error = TranscodeConvertErrorOf<D, E>;
#[inline(always)]
fn max_transcode_output_len(
&self,
input_len: usize,
) -> Result<usize, CapacityError> {
CodecTranscodeConverter::max_transcode_output_len(self, input_len)
}
#[inline(always)]
fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
CodecTranscodeConverter::max_finish_output_len(self)
}
#[inline(always)]
fn max_reset_output_len(&self) -> Result<usize, CapacityError> {
CodecTranscodeConverter::max_reset_output_len(self)
}
#[inline(always)]
fn reset(
&mut self,
output: &mut [E::Unit],
output_index: usize,
) -> Result<usize, TranscodeConvertErrorOf<D, E>> {
CodecTranscodeConverter::reset(self, output, output_index)
}
#[inline(always)]
fn transcode(
&mut self,
input: &[D::Unit],
input_index: usize,
output: &mut [E::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeConvertErrorOf<D, E>> {
CodecTranscodeConverter::transcode(
self,
input,
input_index,
output,
output_index,
)
}
#[inline(always)]
fn transcode_eof(
&mut self,
input: &[D::Unit],
input_index: usize,
output: &mut [E::Unit],
output_index: usize,
) -> Result<TranscodeProgress, TranscodeConvertErrorOf<D, E>> {
CodecTranscodeConverter::transcode_eof(
self,
input,
input_index,
output,
output_index,
)
}
#[inline(always)]
fn finish(
&mut self,
output: &mut [E::Unit],
output_index: usize,
) -> Result<usize, TranscodeConvertErrorOf<D, E>> {
CodecTranscodeConverter::finish(self, output, output_index)
}
}
impl<D, E> TranscodeConverter for CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
D::Value: Default,
{
type DecodeError = D::DecodeError;
type EncodeError = E::EncodeError;
type Value = D::Value;
}
impl<D, E> Default for CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
TranscodeConvertEngine<
D,
E,
CodecTranscodeDecodeHooks,
CodecTranscodeEncodeHooks,
>: Default,
{
#[inline(always)]
fn default() -> Self {
Self {
engine: TranscodeConvertEngine::default(),
}
}
}
impl<D, E> fmt::Debug for CodecTranscodeConverter<D, E>
where
D: Codec,
E: Codec<Value = D::Value>,
TranscodeConvertEngine<
D,
E,
CodecTranscodeDecodeHooks,
CodecTranscodeEncodeHooks,
>: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("CodecTranscodeConverter")
.field("engine", &self.engine)
.finish()
}
}