libc_interface/
macros.rs

1/// A macro for defining #[cfg] if-else statements.
2///
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
5/// first.
6///
7/// This allows you to conveniently provide a long list #[cfg]'d blocks of code
8/// without having to rewrite each clause multiple times.
9macro_rules! cfg_if {
10    ($(
11        if #[cfg($($meta:meta),*)] { $($it:item)* }
12    ) else * else {
13        $($it2:item)*
14    }) => {
15        __cfg_if_items! {
16            () ;
17            $( ( ($($meta),*) ($($it)*) ), )*
18            ( () ($($it2)*) ),
19        }
20    }
21}
22
23macro_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)* }
28    }
29}
30
31macro_rules! __cfg_if_apply {
32    ($m:meta, $($it:item)*) => {
33        $(#[$m] $it)*
34    }
35}
36
37macro_rules! s {
38    ($($(#[$attr:meta])* pub $t:ident $i:ident { $($field:tt)* })*) => ($(
39        __item! {
40            #[repr(C)]
41            #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
42            $(#[$attr])*
43            pub $t $i { $($field)* }
44        }
45    )*)
46}
47
48macro_rules! f {
49    ($(pub fn $i:ident($($arg:ident: $argty:ty),*) -> $ret:ty {
50        $($body:stmt);*
51    })*) => ($(
52        #[inline]
53        #[cfg(not(cross_platform_docs))]
54        pub unsafe extern fn $i($($arg: $argty),*) -> $ret {
55            $($body);*
56        }
57
58        #[cfg(cross_platform_docs)]
59        #[allow(dead_code)]
60        pub unsafe extern fn $i($($arg: $argty),*) -> $ret {
61            loop {}
62        }
63    )*)
64}
65
66macro_rules! __item {
67    ($i:item) => ($i)
68}
69
70#[allow(unused_macros)]
71macro_rules! align_const {
72    ($($(#[$attr:meta])* pub const $name:ident : $t1:ty = $t2:ident { $($field:tt)* };)*) => ($(
73        #[cfg(feature = "align")]
74        $(#[$attr])*
75        pub const $name : $t1 = $t2 {
76            $($field)*
77        };
78        #[cfg(not(feature = "align"))]
79        $(#[$attr])*
80        pub const $name : $t1 = $t2 {
81            $($field)*
82            __align: [],
83        };
84    )*)
85}