bitcram 0.3.0

A small, derive-based bit packing library for compact integer representations
Documentation
use bitcram::{Packable, packable};

#[derive(Debug, PartialEq, Eq)]
struct Coord {
    x: u8,
    y: u8,
}

impl Packable<u16> for Coord {
    const SIZE: u32 = 5;
    fn pack(&self) -> u16 {
        (self.y * 5 + self.x) as u16
    }
    fn unpack(buffer: u16) -> Self {
        let i = buffer as u8;
        Self { x: i % 5, y: i / 5 }
    }
}

#[packable(u16)]
#[derive(Debug, PartialEq, Eq)]
enum Piece {
    King,
    Queen,
    Rook,
    Bishop,
    Knight,
    Pawn,
}

#[packable(u16)]
#[derive(Debug, PartialEq, Eq)]
enum Promotion {
    None,
    Queen,
    Rook,
    Bishop,
    Knight,
}

#[packable(u16)]
#[derive(Debug, PartialEq, Eq)]
struct Move {
    from: Coord,
    to: Coord,
    piece: Piece,
    promotion: Promotion,
}

fn main() {
    let m = Move {
        from: Coord { x: 0, y: 1 },
        to: Coord { x: 0, y: 3 },
        piece: Piece::Pawn,
        promotion: Promotion::None,
    };
    let packed: u16 = m.pack();
    assert_eq!(Move::unpack(packed), m);
    println!(
        "Move encodes to {} bits, packed value: {:#018b}",
        Move::SIZE,
        packed
    );
    println!("Round-trip OK");
}