46 lines
1.5 KiB
Rust
46 lines
1.5 KiB
Rust
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
/// A macro for defining `#[cfg]` if-else statements.
|
|
///
|
|
/// This is similar to the `if/elif` C preprocessor macro by allowing definition
|
|
/// of a cascade of `#[cfg]` cases, emitting the implementation which matches
|
|
/// first.
|
|
///
|
|
/// This allows you to conveniently provide a long list `#[cfg]`'d blocks of code
|
|
/// without having to rewrite each clause multiple times.
|
|
macro_rules! cfg_if {
|
|
($(
|
|
if #[cfg($($meta:meta),*)] { $($it:item)* }
|
|
) else * else {
|
|
$($it2:item)*
|
|
}) => {
|
|
__cfg_if_items! {
|
|
() ;
|
|
$( ( ($($meta),*) ($($it)*) ), )*
|
|
( () ($($it2)*) ),
|
|
}
|
|
}
|
|
}
|
|
|
|
macro_rules! __cfg_if_items {
|
|
(($($not:meta,)*) ; ) => {};
|
|
(($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), $($rest:tt)*) => {
|
|
__cfg_if_apply! { cfg(all(not(any($($not),*)), $($m,)*)), $($it)* }
|
|
__cfg_if_items! { ($($not,)* $($m,)*) ; $($rest)* }
|
|
}
|
|
}
|
|
|
|
macro_rules! __cfg_if_apply {
|
|
($m:meta, $($it:item)*) => {
|
|
$(#[$m] $it)*
|
|
}
|
|
}
|