macro_rules! bitmask {
(
$(#[$st_attr: meta])* mask $st_name: ident : $T: tt where
$(#[$en_attr: meta])* flags $en_name: ident { $($token: tt)+ }
) => { ... };
(
st_meta: [ $(#[$st_attr: meta])* ],
st_name: $st_name: ident,
mask_type: $T: tt,
en_meta: [ $(#[$en_attr: meta])* ],
en_name: $en_name: ident,
flags: [
$(
meta: [ $(#[$flag_attr: meta])* ]
flag: $flag_name: ident = $flag_value: expr;
)*
[ $(#[$prev_attr: meta])* ]
],
#[$next_attr: meta] $($token: tt)*
) => { ... };
(
st_meta: [ $(#[$st_attr: meta])* ],
st_name: $st_name: ident,
mask_type: $T: tt,
en_meta: [ $(#[$en_attr: meta])* ],
en_name: $en_name: ident,
flags: [
$(
meta: [ $(#[$flag_attr: meta])* ]
flag: $flag_name: ident = $flag_value: expr;
)*
[ $(#[$next_attr: meta])* ]
],
$next_name: ident = $next_value: expr, $($token: tt)*
) => { ... };
(
st_meta: [ $(#[$st_attr: meta])* ],
st_name: $st_name: ident,
mask_type: $T: tt,
en_meta: [ $(#[$en_attr: meta])* ],
en_name: $en_name: ident,
flags: [
$(
meta: [ $(#[$flag_attr: meta])* ]
flag: $flag_name: ident = $flag_value: expr;
)*
[ $(#[$next_attr: meta])* ]
],
$next_name: ident = $next_value: expr
) => { ... };
(
st_meta: [ $(#[$st_attr: meta])* ],
st_name: $st_name: ident,
mask_type: $T: tt,
en_meta: [ $(#[$en_attr: meta])* ],
en_name: $en_name: ident,
flags: [
$(
meta: [ $(#[$flag_attr: meta])* ]
flag: $flag_name: ident = $flag_value: expr;
)+
[]
],
) => { ... };
(
$(#[$st_attr: meta])* pub mask $st_name: ident : $T: tt where
$(#[$en_attr: meta])* flags $en_name: ident { $($token: tt)+ }
) => { ... };
(
pub
st_meta: [ $(#[$st_attr: meta])* ],
st_name: $st_name: ident,
mask_type: $T: tt,
en_meta: [ $(#[$en_attr: meta])* ],
en_name: $en_name: ident,
flags: [
$(
meta: [ $(#[$flag_attr: meta])* ]
flag: $flag_name: ident = $flag_value: expr;
)*
[ $(#[$prev_attr: meta])* ]
],
#[$next_attr: meta] $($token: tt)*
) => { ... };
(
pub
st_meta: [ $(#[$st_attr: meta])* ],
st_name: $st_name: ident,
mask_type: $T: tt,
en_meta: [ $(#[$en_attr: meta])* ],
en_name: $en_name: ident,
flags: [
$(
meta: [ $(#[$flag_attr: meta])* ]
flag: $flag_name: ident = $flag_value: expr;
)*
[ $(#[$next_attr: meta])* ]
],
$next_name: ident = $next_value: expr, $($token: tt)*
) => { ... };
(
pub
st_meta: [ $(#[$st_attr: meta])* ],
st_name: $st_name: ident,
mask_type: $T: tt,
en_meta: [ $(#[$en_attr: meta])* ],
en_name: $en_name: ident,
flags: [
$(
meta: [ $(#[$flag_attr: meta])* ]
flag: $flag_name: ident = $flag_value: expr;
)*
[ $(#[$next_attr: meta])* ]
],
$next_name: ident = $next_value: expr
) => { ... };
(
pub
st_meta: [ $(#[$st_attr: meta])* ],
st_name: $st_name: ident,
mask_type: $T: tt,
en_meta: [ $(#[$en_attr: meta])* ],
en_name: $en_name: ident,
flags: [
$(
meta: [ $(#[$flag_attr: meta])* ]
flag: $flag_name: ident = $flag_value: expr;
)+
[]
],
) => { ... };
(@IMPL $st_name: ident $T: tt $en_name: ident, {
$($flag_name: ident = $flag_val: expr),+
}) => { ... };
(@IMPL_BITOR $($target: ty, $other: ty, $st_name: ident);*;) => { ... };
(@IMPL_BITAND $($target: ty, $other: ty, $st_name: ident);*;) => { ... };
(@IMPL_BITXOR $($target: ty, $other: ty, $st_name: ident);*;) => { ... };
(@IMPL_BITOR_ASSIGN $($target: ty, $other: ty);*;) => { ... };
(@IMPL_BITAND_ASSIGN $($target: ty, $other: ty);*;) => { ... };
(@IMPL_BITXOR_ASSIGN $($target: ty, $other: ty);*;) => { ... };
(@IMPL_NOT $($target: ty, $st_name: ident);*;) => { ... };
}