bitcram 0.1.0

A small, derive-based bit packing library for compact integer representations
Documentation
use std::mem::MaybeUninit;

use crate::{Buffer, Packable, Packer, Unpacker};

impl<B: Buffer, T: Packable<B>, const N: usize> Packable<B> for [T; N] {
    const SIZE: u32 = T::SIZE * N as u32;

    fn pack(&self) -> B {
        let mut packer = Packer::<B>::new();
        for item in self.iter() {
            packer.pack(item);
        }
        packer.into_inner()
    }

    fn unpack(buffer: B) -> Self {
        let mut unpacker = Unpacker::<B>::new(buffer);
        let mut array = [const { MaybeUninit::<T>::uninit() }; N];
        for item in array.iter_mut().rev() {
            item.write(unpacker.unpack());
        }
        unsafe { (&array as *const _ as *const [T; N]).read() }
    }
}