pub fn pack_indices(indices: &[u8], bit_width: u8, packed: &mut [u8]) {
debug_assert_eq!(packed.len(), (indices.len() * bit_width as usize + 7) / 8);
if bit_width == 8 {
packed.copy_from_slice(indices);
return;
}
for b in packed.iter_mut() {
*b = 0;
}
let bw = bit_width as usize;
for (i, &idx) in indices.iter().enumerate() {
let bit_start = i * bw;
let byte_lo = bit_start / 8;
let bit_off = bit_start % 8;
let fits = 8 - bit_off;
let mask_lo = (1u8 << bw.min(fits)) - 1;
#[allow(clippy::indexing_slicing)]
{
packed[byte_lo] |= (idx & mask_lo) << bit_off;
}
if bw > fits {
let byte_hi = byte_lo + 1;
let shift = fits;
let mask_hi = (1u8 << (bw - fits)) - 1;
#[allow(clippy::indexing_slicing)]
{
packed[byte_hi] |= (idx >> shift) & mask_hi;
}
}
}
}