1 /// A macro for defining #[cfg] if-else statements.
3 /// This is similar to the `if/elif` C preprocessor macro by allowing definition
4 /// of a cascade of `#[cfg]` cases, emitting the implementation which matches
7 /// This allows you to conveniently provide a long list #[cfg]'d blocks of code
8 /// without having to rewrite each clause multiple times.
11 if #[cfg($($meta:meta),*)] { $($it:item)* }
17 $
( ( ($
($meta
),*) ($
($it
)*) ), )*
23 macro_rules
! __cfg_if_items
{
24 (($
($not
:meta
,)*) ; ) => {}
;
25 (($
($not
:meta
,)*) ; ( ($
($m
:meta
),*) ($
($it
:item
)*) ), $
($rest
:tt
)*) => {
26 __cfg_if_apply
! { cfg(all(not(any($($not),*)), $($m,)*)), $($it)* }
27 __cfg_if_items
! { ($($not,)* $($m,)*) ; $($rest)* }
31 macro_rules
! __cfg_if_apply
{
32 ($m
:meta
, $
($it
:item
)*) => {
38 ($
($
(#[$attr:meta])* pub struct $i:ident { $($field:tt)* })*) => ($(
42 pub struct $i { $($field)* }
44 impl ::dox
::Copy
for $i {}
45 impl ::dox
::Clone
for $i
{
46 fn clone(&self) -> $i { *self }
52 ($
(pub fn $i
:ident($
($arg
:ident
: $argty
:ty
),*) -> $ret
:ty
{
57 pub unsafe extern fn $
i($
($arg
: $argty
),*) -> $ret
{
63 pub unsafe extern fn $
i($
($arg
: $argty
),*) -> $ret
{
77 use std
::option
::Option
as Option2
;
78 fn works1() -> Option2
<u32> { Some(1) }
80 fn works1() -> Option
<u32> { None }
86 fn works2() -> bool { false }
87 } else if #[cfg(test)] {
88 fn works2() -> bool { true }
90 fn works2() -> bool { false }
96 fn works3() -> bool { false }
98 fn works3() -> bool { true }
104 assert
!(works1().is_some());