use super::ValueEncoder;
use crate::{
Codec,
codec::assert_unit_bounds,
};
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
pub struct CodecValueEncoder<C> {
codec: C,
}
impl<C> CodecValueEncoder<C> {
#[must_use]
#[inline(always)]
pub const fn new(codec: C) -> Self {
Self { codec }
}
}
impl<C> ValueEncoder<C::Value> for CodecValueEncoder<C>
where
C: Codec,
C::Unit: Default,
{
type Output = Vec<C::Unit>;
type Error = C::EncodeError;
fn encode(&self, input: &C::Value) -> Result<Self::Output, Self::Error> {
assert_unit_bounds::<C>(&self.codec);
let mut output = vec![C::Unit::default(); self.codec.max_units_per_value().get()];
let written = unsafe { self.codec.encode_unchecked(input, &mut output, 0) }?;
assert!(
written <= output.len(),
"Codec::encode_unchecked wrote beyond allocated output",
);
output.truncate(written);
Ok(output)
}
}