Macro bitfield_layout::layout[][src]

macro_rules! layout {
    (item = DualView ; [] -> [$($output : tt) *]) => { ... };
    (item = DualView ; [$m : literal $d : literal, $($input : tt) *] ->
 [$($output : tt) *]) => { ... };
    (item = DualView ; [$m : literal, $($input : tt) *] -> [$($output : tt) *]) => { ... };
    (DualView ; $(#[$meta : meta]) * $vis : vis $ident : ident $name :
 ident($value : tt) ; $($input : tt) *) => { ... };
    (item = FlagType ; array = $a : expr ; index = $i : expr ;) => { ... };
    (item = FlagType ; array = $a : expr ; index = $i : expr ; Undefined,
 $($input : tt) *) => { ... };
    (item = FlagType ; array = $a : expr ; index = $i : expr ; Unknown,
 $($input : tt) *) => { ... };
    (item = FlagType ; array = $a : expr ; index = $i : expr ; ShouldBe1,
 $($input : tt) *) => { ... };
    (item = FlagType ; array = $a : expr ; index = $i : expr ; ShouldBe0,
 $($input : tt) *) => { ... };
    (item = FlagType ; array = $a : expr ; index = $i : expr ; $m : literal : $n :
 expr, $($input : tt) *) => { ... };
    (item = FlagType ; array = $a : expr ; index = $i : expr ; $m : literal $d :
 literal, $($input : tt) *) => { ... };
    (item = FlagType ; array = $a : expr ; index = $i : expr ; $m : literal,
 $($input : tt) *) => { ... };
    (FlagType ; $(#[$meta : meta]) * $vis : vis $ident : ident $name :
 ident($value : tt) ; $($input : tt) *) => { ... };
    (@ as_expr $expr : expr) => { ... };
    (@ as_ty $ty : ty) => { ... };
    (@ count_bytes u8) => { ... };
    (@ count_bytes u16) => { ... };
    (@ count_bytes u32) => { ... };
    (@ count_bytes u64) => { ... };
    (@ count_bytes u128) => { ... };
    (@ count_bytes [u8 ; $n : expr]) => { ... };
}
Expand description

Fast defining of useful types

This macro helps to implement crate::BitFieldLayout trait and create associated const layout. Macro may be used for following data types:

DualView


// Data created by macro
let macro_data = {
    layout!(
        DualView;
        struct Letters(u8);
        "a",
        "b" "B",
        "c",
        "d",
        "e",
        "f" "F",
        "g" "G",
        "h" "H",
    );

    Letters(42).flags()
};
// Expands to:
let manual_data = {
    struct Letters(u8);
    impl Letters {
        const LAYOUT: [DualView<'static>; 8] = [
            DualView("a", "a"),
            DualView("b", "B"),
            DualView("c", "c"),
            DualView("d", "d"),
            DualView("e", "e"),
            DualView("f", "F"),
            DualView("g", "G"),
            DualView("h", "H"),
        ];
    }
     
    impl Layout for Letters {
        type Layout = slice::Iter<'static, DualView<'static>>;
        fn layout() -> Self::Layout { Letters::LAYOUT.iter() }
    }
    impl BitFieldLayout for Letters {
        type Value = u8;
        fn get(&self) -> Self::Value { self.0 }
        fn set(&mut self, new: Self::Value) { self.0 = new; }
    }

    Letters(42).flags()
};

assert_eq!(macro_data.collect::<Vec<_>>(), manual_data.collect::<Vec<_>>());

FlagType

let macro_data = {
    layout!(
        FlagType;
        struct EightFlags(u8);
        "Significant: meaning",
        "Significant: meaning" "Significant: description",
        "Reserved: 2 bits": 2,
        "Reserved: shouldn't exists": 0,
        ShouldBe0,
        ShouldBe1,
        Unknown,
        Undefined,
    );

    EightFlags(73).flags()
};
// Expands to:
let manual_data = {
    struct EightFlags(u8);
    impl EightFlags {
        const LAYOUT: [FlagType<'static>; 8] = [
            FlagType::Significant("Significant: meaning", "Significant: meaning"),
            FlagType::Significant("Significant: meaning", "Significant: description"),
            FlagType::Reserved("Reserved: 2 bits"),
            FlagType::Reserved("Reserved: 2 bits"),
            FlagType::ShouldBe0,
            FlagType::ShouldBe1,
            FlagType::Unknown,
            FlagType::Undefined,
        ];
    }
     
    impl Layout for EightFlags {
        type Layout = slice::Iter<'static, FlagType<'static>>;
        fn layout() -> Self::Layout { EightFlags::LAYOUT.iter() }
    }
    impl BitFieldLayout for EightFlags {
        type Value = u8;
        fn get(&self) -> Self::Value { self.0 }
        fn set(&mut self, new: Self::Value) { self.0 = new; }
    }

    EightFlags(73).flags()
};

assert_eq!(macro_data.collect::<Vec<_>>(), manual_data.collect::<Vec<_>>());