Skip to main content

TranscodeEncoder

Trait TranscodeEncoder 

Source
pub trait TranscodeEncoder: Transcoder<Error = TranscodeEncodeError<Self::EncodeError, <Self as Transcoder>::Input>> {
    type EncodeError;
}
Expand description

Encodes logical values into encoded units over caller-provided buffers.

TranscodeEncoder refines Transcoder for implementations whose input is the logical value stream and whose output is the encoded unit stream. The trait adds no methods; it exists to make generic bounds distinguish encoding direction from decoding and unit-to-unit conversion.

The word “buffered” describes the caller-managed buffer and progress model. It does not require the implementor to own an internal buffer. An encoder may retain consumed input internally, but Transcoder::transcode must consume every visible input value before returning crate::TranscodeStatus::Complete and must never return crate::TranscodeStatus::NeedInput. It returns crate::TranscodeStatus::NeedOutput when more output capacity is needed; Transcoder::finish emits any retained output after the caller has supplied the complete logical input stream.

§Examples

use core::convert::Infallible;
use core::num::NonZeroUsize;

use qubit_codec::Codec;
use qubit_codec::CodecTranscodeEncoder;
use qubit_codec::DecodeFailure;
use qubit_codec::TranscodeEncoder;
use qubit_codec::Transcoder;

struct ByteCodec;
impl Codec for ByteCodec {
    type Value = u8;
    type Unit = u8;
    type DecodeError = Infallible;
    type EncodeError = Infallible;
    const MIN_UNITS_PER_VALUE: usize = 1;
    const MAX_ENCODE_UNITS_PER_VALUE: usize = 1;
    const MAX_DECODE_UNITS_PER_VALUE: usize = 1;

    unsafe fn decode(&mut self, input: &[u8], index: usize)
        -> Result<(u8, NonZeroUsize), DecodeFailure<Infallible>>
    {
        Ok((input[index], NonZeroUsize::MIN))
    }

    unsafe fn encode(&mut self, value: &u8, output: &mut [u8], index: usize)
        -> Result<usize, Infallible>
    {
        output[index] = *value;
        Ok(1)
    }
}

fn accepts_encoder<E: TranscodeEncoder>(_: &E) {}
let mut encoder = CodecTranscodeEncoder::new(ByteCodec);
accepts_encoder(&encoder);
let mut output = [0; 2];
let written = encoder.transcode_complete_into(&[1, 2], &mut output).unwrap();
assert_eq!(written, 2);
assert_eq!(output, [1, 2]);

Required Associated Types§

Source

type EncodeError

Domain error type produced by encode internals.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§