bitcram 0.1.0

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

use bitcram::{Packable, packable};

#[derive(Debug, PartialEq, Eq, Clone)]
pub struct U3(pub u8);
impl Packable<u128> for U3 {
    const SIZE: u32 = 3;
    fn pack(&self) -> u128 {
        self.0 as u128
    }
    fn unpack(buffer: u128) -> Self {
        Self(buffer as u8)
    }
}

#[derive(Debug, PartialEq, Eq, Clone)]
pub struct U64v(pub u64);
impl Packable<u128> for U64v {
    const SIZE: u32 = 64;
    fn pack(&self) -> u128 {
        self.0 as u128
    }
    fn unpack(buffer: u128) -> Self {
        Self(buffer as u64)
    }
}

#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Nibble(pub u8);
impl Packable<u8> for Nibble {
    const SIZE: u32 = 4;
    fn pack(&self) -> u8 {
        self.0
    }
    fn unpack(buffer: u8) -> Self {
        Self(buffer)
    }
}

#[packable(u128)]
#[derive(Debug, PartialEq, Eq)]
pub struct UnitStruct;

#[packable(u128)]
#[derive(Debug, PartialEq, Eq)]
pub struct TupleStruct(pub U3, pub U3, pub UnitStruct);

#[packable(u128)]
#[derive(Debug, PartialEq, Eq)]
pub struct NamedStruct {
    pub x: U3,
    pub y: U3,
}

#[packable(u128)]
#[derive(Debug, PartialEq, Eq)]
pub enum MixedEnum {
    UnitVariant,
    EmptyTuple(),
    Tuple(U3, TupleStruct),
    Named { x: UnitStruct, y: TupleStruct },
}

#[packable(u128)]
#[derive(Debug, PartialEq, Eq)]
pub enum SingleVariantEnum {
    Only,
}

#[packable(u128)]
#[derive(Debug, PartialEq, Eq)]
pub struct GenericPair<T: Clone>
where
    T: Debug,
{
    pub x: T,
    pub y: T,
}

#[packable(u128)]
#[derive(Debug, PartialEq, Eq)]
#[allow(dead_code)]
pub enum EmptyEnum {}

#[packable(u8)]
#[derive(Debug, PartialEq, Eq)]
pub struct FullU8 {
    pub hi: Nibble,
    pub lo: Nibble,
}

#[packable(u128)]
#[derive(Debug, PartialEq, Eq)]
pub struct FullU128 {
    pub hi: U64v,
    pub lo: U64v,
}