diff options
Diffstat (limited to 'src/macros.rs')
-rw-r--r-- | src/macros.rs | 211 |
1 files changed, 16 insertions, 195 deletions
diff --git a/src/macros.rs b/src/macros.rs index 39bc466d..15f7505c 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,6 +1,6 @@ -/// The `libc_bitflags!` macro helps with a common use case of defining bitflags with values from -/// the libc crate. It is used the same way as the `bitflags!` macro, except that only the name of -/// the flag value has to be given. +/// The `libc_bitflags!` macro helps with a common use case of defining a public bitflags type +/// with values from the libc crate. It is used the same way as the `bitflags!` macro, except +/// that only the name of the flag value has to be given. /// /// The `libc` crate must be in scope with the name `libc`. /// @@ -10,6 +10,7 @@ /// pub struct ProtFlags: libc::c_int { /// PROT_NONE; /// PROT_READ; +/// /// PROT_WRITE enables write protect /// PROT_WRITE; /// PROT_EXEC; /// #[cfg(any(target_os = "linux", target_os = "android"))] @@ -38,205 +39,25 @@ /// } /// ``` macro_rules! libc_bitflags { - // (non-pub) Exit rule. - (@call_bitflags - { - name: $BitFlags:ident, - type: $T:ty, - attrs: [$($attrs:tt)*], - flags: [$($flags:tt)*], - } - ) => { - bitflags! { - $($attrs)* - struct $BitFlags: $T { - $($flags)* - } - } - }; - - // (pub) Exit rule. - (@call_bitflags - { - pub, - name: $BitFlags:ident, - type: $T:ty, - attrs: [$($attrs:tt)*], - flags: [$($flags:tt)*], + ( + $(#[$outer:meta])* + pub struct $BitFlags:ident: $T:ty { + $( + $(#[$inner:ident $($args:tt)*])* + $Flag:ident $(as $cast:ty)*; + )+ } ) => { bitflags! { - $($attrs)* + $(#[$outer])* pub struct $BitFlags: $T { - $($flags)* - } - } - }; - - // (non-pub) Done accumulating. - (@accumulate_flags - { - name: $BitFlags:ident, - type: $T:ty, - attrs: $attrs:tt, - }, - $flags:tt; - ) => { - libc_bitflags! { - @call_bitflags - { - name: $BitFlags, - type: $T, - attrs: $attrs, - flags: $flags, + $( + $(#[$inner $($args)*])* + const $Flag = libc::$Flag $(as $cast)*; + )+ } } }; - - // (pub) Done accumulating. - (@accumulate_flags - { - pub, - name: $BitFlags:ident, - type: $T:ty, - attrs: $attrs:tt, - }, - $flags:tt; - ) => { - libc_bitflags! { - @call_bitflags - { - pub, - name: $BitFlags, - type: $T, - attrs: $attrs, - flags: $flags, - } - } - }; - - // Munch an attr. - (@accumulate_flags - $prefix:tt, - [$($flags:tt)*]; - #[$attr:meta] $($tail:tt)* - ) => { - libc_bitflags! { - @accumulate_flags - $prefix, - [ - $($flags)* - #[$attr] - ]; - $($tail)* - } - }; - - // Munch last ident if not followed by a semicolon. - (@accumulate_flags - $prefix:tt, - [$($flags:tt)*]; - $flag:ident - ) => { - libc_bitflags! { - @accumulate_flags - $prefix, - [ - $($flags)* - const $flag = libc::$flag; - ]; - } - }; - - // Munch last ident and cast it to the given type. - (@accumulate_flags - $prefix:tt, - [$($flags:tt)*]; - $flag:ident as $ty:ty - ) => { - libc_bitflags! { - @accumulate_flags - $prefix, - [ - $($flags)* - const $flag = libc::$flag as $ty; - ]; - } - }; - - // Munch an ident; covers terminating semicolon case. - (@accumulate_flags - $prefix:tt, - [$($flags:tt)*]; - $flag:ident; $($tail:tt)* - ) => { - libc_bitflags! { - @accumulate_flags - $prefix, - [ - $($flags)* - const $flag = libc::$flag; - ]; - $($tail)* - } - }; - - // Munch an ident and cast it to the given type; covers terminating semicolon - // case. - (@accumulate_flags - $prefix:tt, - [$($flags:tt)*]; - $flag:ident as $ty:ty; $($tail:tt)* - ) => { - libc_bitflags! { - @accumulate_flags - $prefix, - [ - $($flags)* - const $flag = libc::$flag as $ty; - ]; - $($tail)* - } - }; - - // (non-pub) Entry rule. - ( - $(#[$attr:meta])* - struct $BitFlags:ident: $T:ty { - $($vals:tt)* - } - ) => { - libc_bitflags! { - @accumulate_flags - { - name: $BitFlags, - type: $T, - attrs: [$(#[$attr])*], - }, - []; - $($vals)* - } - }; - - // (pub) Entry rule. - ( - $(#[$attr:meta])* - pub struct $BitFlags:ident: $T:ty { - $($vals:tt)* - } - ) => { - libc_bitflags! { - @accumulate_flags - { - pub, - name: $BitFlags, - type: $T, - attrs: [$(#[$attr])*], - }, - []; - $($vals)* - } - }; } /// The `libc_enum!` macro helps with a common use case of defining an enum exclusively using |