#[macro_export]
#[doc(hidden)]
macro_rules! ordinalize_enum_from_ordinal {
( $name:ident $( , $variants:ident )+ $(,)* ) => {
fn from_ordinal(number: isize) -> Option<$name> {
match number{
$(
n if n == ($name::$variants as isize) => Some($name::$variants),
)+
_ => None
}
}
unsafe fn from_ordinal_unsafe(number: isize) -> $name {
::std::mem::transmute(number)
}
}
}
#[cfg(not(all(windows, target_pointer_width = "32")))]
#[macro_export]
#[doc(hidden)]
macro_rules! ordinalize_enum_ordinal {
( $name:ident $( , $variants:ident )+ $(,)* ) => {
fn ordinal(&self) -> isize {
unsafe {
::std::mem::transmute(::std::mem::discriminant(self))
}
}
}
}
#[cfg(all(windows, target_pointer_width = "32"))]
#[macro_export]
#[doc(hidden)]
macro_rules! ordinalize_enum_ordinal {
( $name:ident $( , $variants:ident )+ $(,)* ) => {
fn ordinal(&self) -> isize {
let n: i64 = unsafe {
::std::mem::transmute(::std::mem::discriminant(self))
};
n as isize
}
}
}
#[macro_export]
#[doc(hidden)]
macro_rules! ordinalize_enum_impl {
( $name:ident $( , $variants:ident )+ $(,)* ) => {
impl $name {
ordinalize_enum_ordinal!(
$name,
$(
$variants,
)+
);
ordinalize_enum_from_ordinal!(
$name,
$(
$variants,
)+
);
}
}
}
#[macro_export]
macro_rules! create_ordinalized_enum {
( $name:ident $( ,$variants:ident )+ $(,)* ) => {
#[derive(Debug, PartialEq, Clone, Eq, Hash)]
enum $name {
$(
$variants,
)+
__DotNotUse = isize::max_value()
}
ordinalize_enum_impl!(
$name,
$(
$variants,
)+
);
};
( $name:ident $( ,$variants:ident = $values:expr )+ $(,)* ) => {
#[derive(Debug, PartialEq, Clone, Eq, Hash)]
enum $name {
$(
$variants = $values,
)+
__DotNotUse = isize::max_value()
}
ordinalize_enum_impl!(
$name,
$(
$variants,
)+
);
};
( pub $name:ident $( ,$variants:ident )+ $(,)* ) => {
#[derive(Debug, PartialEq, Clone, Eq, Hash)]
pub enum $name {
$(
$variants,
)+
__DotNotUse = isize::max_value()
}
ordinalize_enum_impl!(
$name,
$(
$variants,
)+
);
};
( pub $name:ident $( ,$variants:ident = $values:expr )+ $(,)* ) => {
#[derive(Debug, PartialEq, Clone, Eq, Hash)]
pub enum $name {
$(
$variants = $values,
)+
__DotNotUse = isize::max_value()
}
ordinalize_enum_impl!(
$name,
$(
$variants,
)+
);
};
}