X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibrustc_data_structures%2Fmacros.rs;h=67fbe3058cdb981170ce653c9d22c0695f8f753c;hb=5e9888eec5f5e5d41be0d6ccd0b55bbd536f44e9;hp=3f75523a81584a7bc62330d01ab267200f68ec75;hpb=88629778e6faeda18409ffaa9a00291e3605bae3;p=rust.git diff --git a/src/librustc_data_structures/macros.rs b/src/librustc_data_structures/macros.rs index 3f75523a815..67fbe3058cd 100644 --- a/src/librustc_data_structures/macros.rs +++ b/src/librustc_data_structures/macros.rs @@ -7,7 +7,7 @@ macro_rules! static_assert { // is out-of-bounds. #[allow(dead_code)] const _: () = [()][!($test: bool) as usize]; - } + }; } /// Type size assertion. The first argument is a type and the second argument is its expected size. @@ -15,5 +15,43 @@ macro_rules! static_assert { macro_rules! static_assert_size { ($ty:ty, $size:expr) => { const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()]; + }; +} + +#[macro_export] +macro_rules! enum_from_u32 { + ($(#[$attr:meta])* pub enum $name:ident { + $($variant:ident = $e:expr,)* + }) => { + $(#[$attr])* + pub enum $name { + $($variant = $e),* + } + + impl $name { + pub fn from_u32(u: u32) -> Option<$name> { + $(if u == $name::$variant as u32 { + return Some($name::$variant) + })* + None + } + } + }; + ($(#[$attr:meta])* pub enum $name:ident { + $($variant:ident,)* + }) => { + $(#[$attr])* + pub enum $name { + $($variant,)* + } + + impl $name { + pub fn from_u32(u: u32) -> Option<$name> { + $(if u == $name::$variant as u32 { + return Some($name::$variant) + })* + None + } + } } }