diff options
Diffstat (limited to 'build/rust/bitflags/lib.rs')
-rw-r--r-- | build/rust/bitflags/lib.rs | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/build/rust/bitflags/lib.rs b/build/rust/bitflags/lib.rs new file mode 100644 index 0000000000..408d279b9f --- /dev/null +++ b/build/rust/bitflags/lib.rs @@ -0,0 +1,125 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub use bitflags::*; + +// Copy of the macro from bitflags 1.3.2, with the implicit derives +// removed, because in 2.0, they're expected to be explicitly given +// in the macro invocation. And because bitflags 1.3.2 itself always +// adds an impl Debug, we need to remove #[derive(Debug)] from what +// is passed in, which is what the __impl_bitflags_remove_derive_debug +// macro does. +#[macro_export(local_inner_macros)] +macro_rules! bitflags { + ( + $(#[$($outer:tt)+])* + $vis:vis struct $BitFlags:ident: $T:ty { + $( + $(#[$inner:ident $($args:tt)*])* + const $Flag:ident = $value:expr; + )* + } + + $($t:tt)* + ) => { + __impl_bitflags_remove_derive_debug! { + $(#[$($outer)+])* + + $vis struct $BitFlags { + bits: $T, + } + } + + __impl_bitflags! { + $BitFlags: $T { + $( + $(#[$inner $($args)*])* + $Flag = $value; + )* + } + } + + impl $BitFlags { + /// Convert from underlying bit representation, preserving all + /// bits (even those not corresponding to a defined flag). + #[inline] + pub const fn from_bits_retain(bits: $T) -> Self { + Self { bits } + } + } + + bitflags! { + $($t)* + } + }; + () => {}; +} + +#[macro_export(local_inner_macros)] +#[doc(hidden)] +macro_rules! __impl_bitflags_remove_derive_debug { + ( + $(@ $(#[$keep_outer:meta])* @)? + #[derive(@ $($keep_derives:ident),+ @)] + $(#[$($other_outer:tt)+])* + $vis:vis struct $BitFlags:ident { $($t:tt)* } + ) => { + __impl_bitflags_remove_derive_debug! { + @ $($(#[$keep_outer])*)? #[derive($($keep_derives),+)] @ + $(#[$($other_outer)+])* + $vis struct $BitFlags { $($t)* } + } + }; + ( + $(@ $(#[$keep_outer:meta])* @)? + #[derive($(@ $($keep_derives:ident),+ @)? Debug $(,$derives:ident)*)] + $(#[$($other_outer:tt)+])* + $vis:vis struct $BitFlags:ident { $($t:tt)* } + ) => { + __impl_bitflags_remove_derive_debug! { + @ $($(#[$keep_outer])*)? @ + #[derive($(@ $($keep_derives),+ @)? $($derives),*)] + $(#[$($other_outer)+])* + $vis struct $BitFlags { $($t)* } + } + }; + ( + $(@ $(#[$keep_outer:meta])* @)? + #[derive($(@ $($keep_derives:ident),+ @)? $derive:ident $(,$derives:ident)*)] + $(#[$($other_outer:tt)+])* + $vis:vis struct $BitFlags:ident { $($t:tt)* } + ) => { + __impl_bitflags_remove_derive_debug! { + @ $($(#[$keep_outer])*)? @ + #[derive(@ $($($keep_derives,)+)? $derive @ $($derives),*)] + $(#[$($other_outer)+])* + $vis struct $BitFlags { $($t)* } + } + }; + ( + $(@ $(#[$keep_outer:meta])* @)? + #[$outer:meta] + $(#[$($other_outer:tt)+])* + $vis:vis struct $BitFlags:ident { $($t:tt)* } + ) => { + __impl_bitflags_remove_derive_debug! { + @ $($(#[$keep_outer])*)? #[$outer] @ + $(#[$($other_outer)+])* + $vis struct $BitFlags { $($t)* } + } + }; + ( + @ $(#[$keep_outer:meta])* @ + $vis:vis struct $BitFlags:ident { $($t:tt)* } + ) => { + $(#[$keep_outer])* + $vis struct $BitFlags { $($t)* } + }; +} |