use alloc::vec::Vec;
use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct VectorCodecError {
pub byte_len: usize,
}
impl fmt::Display for VectorCodecError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"f32 vector byte length {} is not a multiple of 4",
self.byte_len
)
}
}
impl core::error::Error for VectorCodecError {}
pub fn encode_f32_le(values: &[f32]) -> Vec<u8> {
values
.iter()
.flat_map(|value| value.to_le_bytes())
.collect()
}
pub fn decode_f32_le(bytes: &[u8]) -> Result<Vec<f32>, VectorCodecError> {
decode(bytes, f32::from_le_bytes)
}
pub fn encode_f32_native(values: &[f32]) -> Vec<u8> {
values
.iter()
.flat_map(|value| value.to_ne_bytes())
.collect()
}
pub fn decode_f32_native(bytes: &[u8]) -> Result<Vec<f32>, VectorCodecError> {
decode(bytes, f32::from_ne_bytes)
}
fn decode(bytes: &[u8], from_bytes: fn([u8; 4]) -> f32) -> Result<Vec<f32>, VectorCodecError> {
let (values, remainder) = bytes.as_chunks::<4>();
if !remainder.is_empty() {
return Err(VectorCodecError {
byte_len: bytes.len(),
});
}
Ok(values.iter().map(|bytes| from_bytes(*bytes)).collect())
}
#[cfg(test)]
#[path = "codec_tests.rs"]
mod tests;