Skip to main content

bytestruct

Macro bytestruct 

Source
macro_rules! bytestruct {
    (
        $(#[$meta:meta])*
        $vis:vis struct $name:ident ($N:tt) {
            $(
                $field_vis:vis $field_name:ident: $field_type:tt = $bits:tt
            ),* $(,)?
        }
    ) => { ... };
    (@impl_conversions $name:ident, 1) => { ... };
    (@impl_conversions $name:ident, 2) => { ... };
    (@impl_conversions $name:ident, 3) => { ... };
    (@impl_conversions $name:ident, 4) => { ... };
    (@impl_conversions $name:ident, 5) => { ... };
    (@impl_conversions $name:ident, 6) => { ... };
    (@impl_conversions $name:ident, 7) => { ... };
    (@impl_conversions $name:ident, 8) => { ... };
    (@impl_conversions $name:ident, 9) => { ... };
    (@impl_conversions $name:ident, 10) => { ... };
    (@impl_conversions $name:ident, 11) => { ... };
    (@impl_conversions $name:ident, 12) => { ... };
    (@impl_conversions $name:ident, 13) => { ... };
    (@impl_conversions $name:ident, 14) => { ... };
    (@impl_conversions $name:ident, 15) => { ... };
    (@impl_conversions $name:ident, 16) => { ... };
    (@impl_wide_conv $name:ident, $N:tt, $prim:ty, $to_name:ident, $from_name:ident, $($idx:literal)*) => { ... };
    (@route_fields $name:ident, 1, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 2, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 3, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 4, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 5, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 6, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 7, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 8, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 9, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 10, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 11, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 12, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 13, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 14, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 15, $($rest:tt)*) => { ... };
    (@route_fields $name:ident, 16, $($rest:tt)*) => { ... };
    (@impl_fields $name:ident, $prim:ty, $shift:expr, ) => { ... };
    (@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident bool $bits:tt $($rest:tt)*) => { ... };
    (@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u8 $bits:tt $($rest:tt)*) => { ... };
    (@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u16 $bits:tt $($rest:tt)*) => { ... };
    (@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u32 $bits:tt $($rest:tt)*) => { ... };
    (@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u64 $bits:tt $($rest:tt)*) => { ... };
    (@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u128 $bits:tt $($rest:tt)*) => { ... };
    (@impl_int $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident $field_type:tt $bits:tt $($rest:tt)*) => { ... };
    (@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident $field_type:tt $bits:tt $($rest:tt)*) => { ... };
    (@read_localized_prim $arr:expr, $shift:expr, $bits:tt) => { ... };
    (@write_localized_prim $arr:expr, $shift:expr, $bits:tt, $val:expr) => { ... };
}
Expand description

A unique declarative macro for generating bitfields backed by fixed-size byte arrays.

Unlike standard bitfield libraries that restrict storage to primitives (u8-u128), bytestruct allows array-backed storage ([u8; 1-16]) while maintaining register-wide optimization through “Acting Primitives”.

This macro generates a struct wrapping [u8; N]. It uses an internal “acting primitive” (u32, u64, or u128) based on $N$ to perform efficient bitwise operations.

§Example

use bitcraft::bytestruct;

bytestruct! {
    pub struct Example(2) {
        pub a: u8 = 4,   // 4 bits
        pub b: bool = 1, // 1 bit
        pub c: u16 = 11, // 11 bits
    }
}