mopenzl 0.2.3

OpenZL compression and decompression in safe Rust; encoding is byte-identical to Meta's reference library
Documentation
//! The `transpose_split` node 3 (`encode_transpose_binding.c`).
//!
//! A struct stream of `N` elements of `W` bytes becomes `W` serial streams of
//! `N` bytes: stream `j` holds byte `j` of every element. This is the
//! non-deprecated node; the pre-format-11 `transpose` and `transpose_split2/4/8`
//! nodes are never written at the supported format versions.

use alloc::vec::Vec;

use crate::compressor::core::codecs::FnEncoder;
use crate::compressor::core::data::Stream;
use crate::compressor::core::error::NodeError;
use crate::compressor::core::exec::NodeCx;
use crate::shared::byte_transpose;

/// `EI_transpose_split`.
pub(crate) static TRANSPOSE_SPLIT: FnEncoder = FnEncoder(transpose_split);

fn transpose_split<'a>(cx: &mut NodeCx<'_, 'a>, inputs: &[Stream<'a>]) -> Result<(), NodeError> {
    let input = &inputs[0];
    let width = input.width();
    let n_elts = input.n_elts();
    let mut lanes: Vec<Vec<u8>> = (0..width).map(|_| Vec::new()).collect();
    byte_transpose::split(cx.simd, &input.bytes()[..n_elts * width], &mut lanes);
    for lane in lanes {
        cx.emit(0, 1, lane)?;
    }
    Ok(())
}