summaryrefslogtreecommitdiffstats
path: root/vendor/mac/src/cfg.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/mac/src/cfg.rs')
-rw-r--r--vendor/mac/src/cfg.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/vendor/mac/src/cfg.rs b/vendor/mac/src/cfg.rs
new file mode 100644
index 000000000..3dbb8fbe0
--- /dev/null
+++ b/vendor/mac/src/cfg.rs
@@ -0,0 +1,90 @@
+//! Macros for conditional compilation.
+
+/// Compile-time matching on config variables.
+///
+/// Only the branch relevant on your machine will be type-checked!
+///
+/// # Example
+///
+/// ```
+/// # #[macro_use] extern crate mac;
+/// # fn main() {
+/// let mascot = match_cfg! {
+/// (target_os = "linux") => "penguin",
+/// (target_os = "openbsd") => "blowfish",
+/// _ => "unknown",
+/// };
+/// println!("{}", mascot);
+/// # }
+/// ```
+///
+#[macro_export]
+macro_rules! match_cfg {
+ ( $( ($cfg:meta) => $e:expr, )* _ => $last:expr, ) => {
+ match () {
+ $(
+ #[cfg($cfg)]
+ () => $e,
+ )*
+
+ #[cfg(all( $( not($cfg) ),* ))]
+ () => $last,
+ }
+ };
+
+ ( $( ($cfg:meta) => $e:expr, )* ) => {
+ match_cfg! {
+ $(
+ ($cfg) => $e,
+ )*
+
+ _ => {
+ #[allow(dead_code)]
+ #[static_assert]
+ static MATCH_CFG_FALLBACK_UNREACHABLE: bool = false;
+ }
+ }
+ };
+}
+
+/// Compile-time conditional expression.
+///
+/// # Example
+///
+/// ```
+/// # #[macro_use] extern crate mac;
+/// # fn main() {
+/// if_cfg!(test {
+/// println!("Crate built as a test suite");
+/// })
+/// # }
+/// ```
+///
+/// Unlike `if cfg!(...)`, this will not even compile the unused branch.
+///
+/// ```
+/// # #[macro_use] extern crate mac;
+/// # fn main() {
+/// let x = if_cfg!(any(bleh, blah="bluh") {
+/// some_undefined_function_name();
+/// 2 + "doesn't even typecheck"
+/// } else {
+/// 3
+/// });
+///
+/// assert_eq!(x, 3);
+/// # }
+/// ```
+#[macro_export]
+macro_rules! if_cfg {
+ ($cfg:meta $t:block else $f:block) => {
+ match_cfg! {
+ ($cfg) => $t,
+ _ => $f,
+ }
+ };
+
+ ($cfg:meta $t:block) => {
+ if_cfg!($cfg $t else { })
+ };
+}