#[doc(hidden)]
#[macro_export]
macro_rules! cfg_if {
(
$(
if #[cfg( $i_meta:meta )] { $( $i_tokens:tt )* }
) else+
else { $( $e_tokens:tt )* }
) => {
$crate::cfg_if! {
@__items () ;
$(
(( $i_meta ) ( $( $i_tokens )* )) ,
)+
(() ( $( $e_tokens )* )) ,
};
};
(
if #[cfg( $i_meta:meta )] { $( $i_tokens:tt )* }
$(
else if #[cfg( $e_meta:meta )] { $( $e_tokens:tt )* }
)*
) => {
$crate::cfg_if! {
@__items () ;
(( $i_meta ) ( $( $i_tokens )* )) ,
$(
(( $e_meta ) ( $( $e_tokens )* )) ,
)*
};
};
(@__items ( $( $_:meta , )* ) ; ) => {};
(
@__items ( $( $no:meta , )* ) ;
(( $( $yes:meta )? ) ( $( $tokens:tt )* )) ,
$( $rest:tt , )*
) => {
#[cfg(all(
$( $yes , )?
not(any( $( $no ),* ))
))]
$crate::cfg_if! { @__identity $( $tokens )* }
$crate::cfg_if! {
@__items ( $( $no , )* $( $yes , )? ) ;
$( $rest , )*
};
};
(@__identity $( $tokens:tt )* ) => {
$( $tokens )*
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! cfg_if_expr {
(
$( $ret_ty:ty : )?
$(
#[cfg( $i_meta:meta )] => $i_val:expr
),+ ,
_ => $rem_val:expr $(,)?
) => {
(|| $( -> $ret_ty )? {
$crate::cfg_if_expr! {
@__items ();
$(
(( $i_meta ) (
#[allow(unreachable_code)]
return $i_val ;
)) ,
)+
(() (
#[allow(unreachable_code)]
return $rem_val ;
)) ,
}
})()
};
(
$( $ret_ty:ty : )?
$(
#[cfg( $i_meta:meta )] => $i_val:expr
),+ $(,)?
) => {
(|| $( -> $ret_ty )? {
$crate::cfg_if_expr! {
@__items ();
$(
(( $i_meta ) (
#[allow(unreachable_code)]
return $i_val ;
)) ,
)+
}
})()
};
(@__items ( $( $_:meta , )* ) ; ) => {};
(
@__items ( $( $no:meta , )* ) ;
(( $( $yes:meta )? ) ( $( $tokens:tt )* )) ,
$( $rest:tt , )*
) => {
#[cfg(all(
$( $yes , )?
not(any( $( $no ),* ))
))]
$crate::cfg_if_expr! { @__identity $( $tokens )* }
$crate::cfg_if_expr! {
@__items ( $( $no , )* $( $yes , )? ) ;
$( $rest , )*
};
};
(@__identity $( $tokens:tt )* ) => {
$( $tokens )*
};
}