#[doc(hidden)]
#[macro_export]
macro_rules! _enumset {
(
// $enum_attr: the attributes of the enum.
// $enum_vis: the visibility of the enum.
// $enum_name: the name of the new enum.
// $set_attr: the attributes of the set.
// $set_vis: the visibility of the set.
// $set_name: the name of the associated set.
// $set_ty: the inner integer primitive type for the bitfield (u8, i32, …).
$( #[$enum_attr:meta] )*
$enum_vis:vis enum $enum_name:ident
$( < $($gen:tt),* $(,)? > )? ( $( #[$set_attr:meta] )* $set_vis:vis $set_name:ident: $set_ty:ty )
$([where $($where:tt)+ $(,)? ] $(,)? )? {
$(
$( #[$variant_attr:meta] )*
$variant_name:ident
$(( $($tuple_type:ty),* $(,)? ))?
$({ $( $( #[$field_attr:meta] )* $field_name:ident : $field_type:ty),* $(,)? })?
$(= $discriminant:expr)?
$(,)?
)*
}
) => { $crate::paste! {
$( #[$enum_attr] )*
$enum_vis enum $enum_name $( < $($gen),* > )? $(where $($where)+)? {
$(
$( #[$variant_attr] )*
$variant_name
$(( $($tuple_type),* ))?
$({ $( $( #[$field_attr] )* $field_name : $field_type),* })?
$(= $discriminant)?
),*
}
#[allow(non_snake_case)]
mod [<_$enum_name _private>] {
pub(super) const ENUM_VARIANTS: usize = $crate::ident_total!($($variant_name)*);
$crate::ident_const_index!(pub(super), ENUM_VARIANTS; $($variant_name)*);
}
#[allow(dead_code)]
impl $( < $($gen),* > )? $enum_name $( < $($gen),* > )? $( where $($where)* )? {
$set_vis const ENUM_VARIANTS: usize = [<_$enum_name _private>]::ENUM_VARIANTS;
$set_vis const fn enum_variants(&self) -> usize { Self::ENUM_VARIANTS }
$set_vis const fn new_empty_set() -> $set_name {
$set_name::without_fields()
}
$set_vis const fn new_full_set() -> $set_name {
$set_name::with_all_fields()
}
}
$crate::data::bitfield! { $( #[$set_attr] )*
$set_vis struct $set_name($set_ty) {
$(
#[doc = "The bit index that corresponds to `" $enum_name "::`[`"
$variant_name "`][" $enum_name "::" $variant_name "]."]
#[allow(non_upper_case_globals)]
$variant_name: [<_$enum_name _private>]::$variant_name as u32;
)*
}
}
}};
}
#[doc(inline)]
#[cfg_attr(nightly_doc, doc(cfg(_bit_·)))]
pub use _enumset as enumset;