desse 0.2.1

Ultra fast binary serialization and deserialization for types with size known at compile time.
Documentation
use rand::random;

use desse::{Desse, DesseSized};

#[allow(unused)]
#[derive(Debug, PartialEq, DesseSized)]
enum MyEnum {
    Variant1,
    Variant2(u8, u16),
    Variant3 { a: u32, b: u32 },
}

impl Desse for MyEnum {
    type Output = [u8; Self::SIZE];

    #[inline]
    fn serialize(&self) -> Self::Output {
        let mut bytes: Self::Output = [0; Self::SIZE];
        self.serialize_into(&mut bytes);
        bytes
    }

    #[inline]
    fn serialize_into(&self, bytes: &mut Self::Output) {
        match self {
            MyEnum::Variant1 => (&mut bytes[0..1]).copy_from_slice(&Desse::serialize(&0u8)),
            MyEnum::Variant2(ref a, ref b) => {
                (&mut bytes[0..1]).copy_from_slice(&Desse::serialize(&1u8));
                (&mut bytes[1..2]).copy_from_slice(&Desse::serialize(a));
                (&mut bytes[2..4]).copy_from_slice(&Desse::serialize(b));
            }
            MyEnum::Variant3 { ref a, ref b } => {
                (&mut bytes[0..1]).copy_from_slice(&Desse::serialize(&2u8));
                (&mut bytes[1..5]).copy_from_slice(&Desse::serialize(a));
                (&mut bytes[5..9]).copy_from_slice(&Desse::serialize(b));
            }
        }
    }

    #[inline]
    fn deserialize_from(bytes: &Self::Output) -> Self {
        let variant = unsafe { <u8>::deserialize_from(&*(bytes[0..1].as_ptr() as *const [u8; 1])) };

        match variant {
            0 => MyEnum::Variant1,
            1 => unsafe {
                MyEnum::Variant2(
                    <u8>::deserialize_from(&*(bytes[1..2].as_ptr() as *const [u8; 1])),
                    <u16>::deserialize_from(&*(bytes[2..4].as_ptr() as *const [u8; 2])),
                )
            },
            2 => unsafe {
                MyEnum::Variant3 {
                    a: <u32>::deserialize_from(&*(bytes[1..5].as_ptr() as *const [u8; 4])),
                    b: <u32>::deserialize_from(&*(bytes[5..9].as_ptr() as *const [u8; 4])),
                }
            },
            _ => unreachable!(),
        }
    }
}

fn main() {
    let my_enum = MyEnum::Variant3 {
        a: random(),
        b: random(),
    };

    println! {"Serialized: {:?}", my_enum.serialize()};

    assert_eq!(my_enum, MyEnum::deserialize_from(&my_enum.serialize()));
}