packtool 0.6.0

In memory packing made easy
Documentation
use crate::{Error, Packed};
use std::convert::TryInto as _;

impl<const SIZE: usize> Packed for [u8; SIZE] {
    const SIZE: usize = SIZE;

    #[inline]
    fn check(_slice: &[u8]) -> Result<(), Error> {
        Ok(())
    }

    #[inline]
    fn unchecked_read_from_slice(slice: &[u8]) -> Self {
        match slice.try_into() {
            Ok(array) => array,
            Err(error) => {
                panic!("the slice does not have the appropriate size {}", error)
            }
        }
    }

    #[inline]
    fn unchecked_write_to_slice(&self, slice: &mut [u8]) {
        slice.copy_from_slice(self)
    }
}

#[cfg(test)]
mod tests {
    use quickcheck::{Arbitrary, Gen};

    use super::*;
    use crate::View;

    #[derive(Debug, PartialEq, Eq, Clone, Copy)]
    struct Array<const SIZE: usize>([u8; SIZE]);

    impl<const SIZE: usize> Arbitrary for Array<SIZE> {
        fn arbitrary(g: &mut Gen) -> Self {
            let mut array = Array([0; SIZE]);

            array.0.iter_mut().for_each(|byte| {
                *byte = u8::arbitrary(g);
            });

            array
        }
    }

    macro_rules! mk_primitive_test {
        ($f:ident, $SIZE:expr_2021) => {
            #[quickcheck]
            fn $f(Array(v): Array<$SIZE>) -> bool {
                let mut slice = [0; $SIZE];
                v.unchecked_write_to_slice(&mut slice);

                let view = View::<[u8; $SIZE]>::try_from_slice(&slice).unwrap();
                let r = view.unpack();

                v == r
            }
        };
    }

    mk_primitive_test!(array0, 0);
    mk_primitive_test!(array1, 1);
    mk_primitive_test!(array2, 2);
    mk_primitive_test!(array3, 3);
    mk_primitive_test!(array4, 4);
    mk_primitive_test!(array5, 5);
    mk_primitive_test!(array6, 6);
    mk_primitive_test!(array7, 7);
    mk_primitive_test!(array8, 8);
    mk_primitive_test!(array9, 9);
    mk_primitive_test!(array10, 10);
    mk_primitive_test!(array11, 11);
    mk_primitive_test!(array12, 12);
    mk_primitive_test!(array13, 13);
    mk_primitive_test!(array14, 14);
    mk_primitive_test!(array15, 15);
    mk_primitive_test!(array16, 16);
    mk_primitive_test!(array17, 17);
    mk_primitive_test!(array18, 18);
    mk_primitive_test!(array19, 19);
    mk_primitive_test!(array20, 20);
    mk_primitive_test!(array21, 21);
    mk_primitive_test!(array22, 22);
    mk_primitive_test!(array23, 23);
    mk_primitive_test!(array24, 24);
    mk_primitive_test!(array25, 25);
    mk_primitive_test!(array26, 26);
    mk_primitive_test!(array27, 27);
    mk_primitive_test!(array28, 28);
    mk_primitive_test!(array29, 29);
    mk_primitive_test!(array30, 30);
    mk_primitive_test!(array31, 31);
    mk_primitive_test!(array32, 32);
    mk_primitive_test!(array33, 33);
    mk_primitive_test!(array34, 34);
    mk_primitive_test!(array35, 35);
    mk_primitive_test!(array36, 36);
    mk_primitive_test!(array37, 37);
    mk_primitive_test!(array38, 38);
    mk_primitive_test!(array39, 39);
    mk_primitive_test!(array40, 40);
    mk_primitive_test!(array41, 41);
    mk_primitive_test!(array42, 42);
    mk_primitive_test!(array43, 43);
    mk_primitive_test!(array44, 44);
    mk_primitive_test!(array45, 45);
    mk_primitive_test!(array46, 46);
    mk_primitive_test!(array47, 47);
    mk_primitive_test!(array48, 48);
    mk_primitive_test!(array49, 49);
    mk_primitive_test!(array50, 50);
    mk_primitive_test!(array51, 51);
    mk_primitive_test!(array52, 52);
    mk_primitive_test!(array53, 53);
    mk_primitive_test!(array54, 54);
    mk_primitive_test!(array55, 55);
    mk_primitive_test!(array56, 56);
    mk_primitive_test!(array57, 57);
    mk_primitive_test!(array58, 58);
    mk_primitive_test!(array59, 59);
    mk_primitive_test!(array60, 60);
    mk_primitive_test!(array61, 61);
    mk_primitive_test!(array62, 62);
    mk_primitive_test!(array63, 63);
    mk_primitive_test!(array64, 64);
    mk_primitive_test!(array65, 65);
    mk_primitive_test!(array66, 66);
    mk_primitive_test!(array67, 67);
    mk_primitive_test!(array68, 68);
    mk_primitive_test!(array69, 69);
    mk_primitive_test!(array70, 70);
    mk_primitive_test!(array71, 71);
    mk_primitive_test!(array72, 72);
    mk_primitive_test!(array73, 73);
    mk_primitive_test!(array74, 74);
    mk_primitive_test!(array75, 75);
    mk_primitive_test!(array76, 76);
    mk_primitive_test!(array77, 77);
    mk_primitive_test!(array78, 78);
    mk_primitive_test!(array79, 79);
    mk_primitive_test!(array80, 80);
    mk_primitive_test!(array81, 81);
    mk_primitive_test!(array82, 82);
    mk_primitive_test!(array83, 83);
    mk_primitive_test!(array84, 84);
    mk_primitive_test!(array85, 85);
    mk_primitive_test!(array86, 86);
    mk_primitive_test!(array87, 87);
    mk_primitive_test!(array88, 88);
    mk_primitive_test!(array89, 89);
    mk_primitive_test!(array90, 90);
    mk_primitive_test!(array91, 91);
    mk_primitive_test!(array92, 92);
    mk_primitive_test!(array93, 93);
    mk_primitive_test!(array94, 94);
    mk_primitive_test!(array95, 95);
    mk_primitive_test!(array96, 96);
    mk_primitive_test!(array97, 97);
    mk_primitive_test!(array98, 98);
    mk_primitive_test!(array99, 99);
    mk_primitive_test!(array100, 100);
    mk_primitive_test!(array101, 101);
    mk_primitive_test!(array102, 102);
    mk_primitive_test!(array103, 103);
    mk_primitive_test!(array104, 104);
    mk_primitive_test!(array105, 105);
    mk_primitive_test!(array106, 106);
    mk_primitive_test!(array107, 107);
    mk_primitive_test!(array108, 108);
    mk_primitive_test!(array109, 109);
    mk_primitive_test!(array110, 110);
    mk_primitive_test!(array111, 111);
    mk_primitive_test!(array112, 112);
    mk_primitive_test!(array113, 113);
    mk_primitive_test!(array114, 114);
    mk_primitive_test!(array115, 115);
    mk_primitive_test!(array116, 116);
    mk_primitive_test!(array117, 117);
    mk_primitive_test!(array118, 118);
    mk_primitive_test!(array119, 119);
    mk_primitive_test!(array120, 120);
    mk_primitive_test!(array121, 121);
    mk_primitive_test!(array122, 122);
    mk_primitive_test!(array123, 123);
    mk_primitive_test!(array124, 124);
    mk_primitive_test!(array125, 125);
    mk_primitive_test!(array126, 126);
    mk_primitive_test!(array127, 127);
    mk_primitive_test!(array128, 128);
}