Newer
Older
use crate::{
buffer::{Buffer, BufferOverflow},
error::EncodeError,
};
pub(crate) fn interleave<const N: usize>(
data: &[u8],
out.try_push(0).map_err(|_| EncodeError::CatsOverflow)?;
let bv_out = out[initial_length..].view_bits_mut::<Msb0>();
let mut out_i = 0;
for i in 0..32 {
for j in (0..bv.len()).step_by(32) {
if i + j >= bv.len() {
continue;
}
bv_out.set(out_i, bv[i + j]);
out_i += 1;
}
}
out: &mut Buffer<N>,
) -> Result<(), BufferOverflow> {
let bv = data.view_bits::<Msb0>();
for _ in 0..data.len() {
}
let bv_out = out.view_bits_mut::<Msb0>();
let mut out_i = 0;
for i in 0..32 {
for j in (0..bv.len()).step_by(32) {
if i + j >= bv.len() {
continue;
}
bv_out.set(i + j, bv[out_i]);
out_i += 1;
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn interleaver_works() {
let mut data = [0x84, 0x73, 0x12, 0xA3, 0xFF, 0x00, 0xC2, 0x1B, 0x77];
let orig = Buffer::new_full(&mut data);
let mut interleaved = [0; 10];
let mut interleaved = Buffer::new(&mut interleaved, 0);
interleave(&orig, &mut interleaved).unwrap();
let expected = [b'H', 0xCD, 0xB5, 0xDB, 0x2A, 0x0A, 0x52, 0x0C, 0x89, 0x4F];
let mut uninterleaved = [0; 10];
let mut uninterleaved = Buffer::new(&mut uninterleaved, 0);
uninterleave(&interleaved[1..], &mut uninterleaved).unwrap();
assert_eq!(*orig, *uninterleaved);