#bit-packing #matching #binary #decoder #macro

macro no-std bitmatch

A macro to allow matching, binding, and packing the individual bits of integers

2 releases

0.1.1 Mar 21, 2020
0.1.0 Jan 20, 2020

#16 in #bit-packing

Download history 718/week @ 2024-07-22 982/week @ 2024-07-29 830/week @ 2024-08-05 846/week @ 2024-08-12 531/week @ 2024-08-19 536/week @ 2024-08-26 612/week @ 2024-09-02 659/week @ 2024-09-09 604/week @ 2024-09-16 667/week @ 2024-09-23 777/week @ 2024-09-30 521/week @ 2024-10-07 637/week @ 2024-10-14 785/week @ 2024-10-21 706/week @ 2024-10-28 977/week @ 2024-11-04

3,136 downloads per month
Used in 11 crates (3 directly)

MPL-2.0 license

24KB
428 lines

Bitmatch

Crates.io Library Version Number Crates.io Library License Docs.rs Documentation Version Number

The bitmatch crate provides tools for packing and unpacking integers as sequences of bits. Supports #![no_std].

Examples

Using #[bitmatch] with a let unpacks the bits into separate single-character variables for each letter you use.

Using bitpack!() re-packs the bits from those single-character variables into a single integer.

use bitmatch::bitmatch;

#[bitmatch]
fn interleave(n: u8) -> u8 {
    #[bitmatch]
    let "xxxx_yyyy" = n;
    bitpack!("xyxy_xyxy")
}

fn main() {
    assert_eq!(interleave(0xF0), 0xAA);
}

You can use #[bitmatch] on a match as well, and it will ensure that the literal portions match, and bind the variable portions.

use bitmatch::bitmatch;
#[bitmatch]
fn decode(inst: u8) -> String {
    #[bitmatch]
    match inst {
        "00oo_aabb" => format!("Op {}, {}, {}", o, a, b),
        "0100_aaii" => format!("Val {}, {}", a, i),
        "01??_????" => format!("Invalid"),
        "10ii_aabb" => format!("Ld {}, {}, {}", a, b, i),
        "11ii_aabb" => format!("St {}, {}, {}", a, b, i),
    }
}

Dependencies

~2MB
~49K SLoC