12add0d91Sopenharmony_ci/// A macro for defining #[cfg] if-else statements. 22add0d91Sopenharmony_ci/// 32add0d91Sopenharmony_ci/// This is similar to the `if/elif` C preprocessor macro by allowing definition 42add0d91Sopenharmony_ci/// of a cascade of `#[cfg]` cases, emitting the implementation which matches 52add0d91Sopenharmony_ci/// first. 62add0d91Sopenharmony_ci/// 72add0d91Sopenharmony_ci/// This allows you to conveniently provide a long list #[cfg]'d blocks of code 82add0d91Sopenharmony_ci/// without having to rewrite each clause multiple times. 92add0d91Sopenharmony_cimacro_rules! cfg_if { 102add0d91Sopenharmony_ci // match if/else chains with a final `else` 112add0d91Sopenharmony_ci ($( 122add0d91Sopenharmony_ci if #[cfg($($meta:meta),*)] { $($it:item)* } 132add0d91Sopenharmony_ci ) else * else { 142add0d91Sopenharmony_ci $($it2:item)* 152add0d91Sopenharmony_ci }) => { 162add0d91Sopenharmony_ci cfg_if! { 172add0d91Sopenharmony_ci @__items 182add0d91Sopenharmony_ci () ; 192add0d91Sopenharmony_ci $( ( ($($meta),*) ($($it)*) ), )* 202add0d91Sopenharmony_ci ( () ($($it2)*) ), 212add0d91Sopenharmony_ci } 222add0d91Sopenharmony_ci }; 232add0d91Sopenharmony_ci 242add0d91Sopenharmony_ci // match if/else chains lacking a final `else` 252add0d91Sopenharmony_ci ( 262add0d91Sopenharmony_ci if #[cfg($($i_met:meta),*)] { $($i_it:item)* } 272add0d91Sopenharmony_ci $( 282add0d91Sopenharmony_ci else if #[cfg($($e_met:meta),*)] { $($e_it:item)* } 292add0d91Sopenharmony_ci )* 302add0d91Sopenharmony_ci ) => { 312add0d91Sopenharmony_ci cfg_if! { 322add0d91Sopenharmony_ci @__items 332add0d91Sopenharmony_ci () ; 342add0d91Sopenharmony_ci ( ($($i_met),*) ($($i_it)*) ), 352add0d91Sopenharmony_ci $( ( ($($e_met),*) ($($e_it)*) ), )* 362add0d91Sopenharmony_ci ( () () ), 372add0d91Sopenharmony_ci } 382add0d91Sopenharmony_ci }; 392add0d91Sopenharmony_ci 402add0d91Sopenharmony_ci // Internal and recursive macro to emit all the items 412add0d91Sopenharmony_ci // 422add0d91Sopenharmony_ci // Collects all the negated `cfg`s in a list at the beginning and after the 432add0d91Sopenharmony_ci // semicolon is all the remaining items 442add0d91Sopenharmony_ci (@__items ($($not:meta,)*) ; ) => {}; 452add0d91Sopenharmony_ci (@__items ($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), 462add0d91Sopenharmony_ci $($rest:tt)*) => { 472add0d91Sopenharmony_ci // Emit all items within one block, applying an appropriate #[cfg]. The 482add0d91Sopenharmony_ci // #[cfg] will require all `$m` matchers specified and must also negate 492add0d91Sopenharmony_ci // all previous matchers. 502add0d91Sopenharmony_ci cfg_if! { @__apply cfg(all($($m,)* not(any($($not),*)))), $($it)* } 512add0d91Sopenharmony_ci 522add0d91Sopenharmony_ci // Recurse to emit all other items in `$rest`, and when we do so add all 532add0d91Sopenharmony_ci // our `$m` matchers to the list of `$not` matchers as future emissions 542add0d91Sopenharmony_ci // will have to negate everything we just matched as well. 552add0d91Sopenharmony_ci cfg_if! { @__items ($($not,)* $($m,)*) ; $($rest)* } 562add0d91Sopenharmony_ci }; 572add0d91Sopenharmony_ci 582add0d91Sopenharmony_ci // Internal macro to Apply a cfg attribute to a list of items 592add0d91Sopenharmony_ci (@__apply $m:meta, $($it:item)*) => { 602add0d91Sopenharmony_ci $(#[$m] $it)* 612add0d91Sopenharmony_ci }; 622add0d91Sopenharmony_ci} 632add0d91Sopenharmony_ci 642add0d91Sopenharmony_cimacro_rules! s { 652add0d91Sopenharmony_ci ($($(#[$attr:meta])* pub $t:ident $i:ident { $($field:tt)* })*) => ($( 662add0d91Sopenharmony_ci s!(it: $(#[$attr])* pub $t $i { $($field)* }); 672add0d91Sopenharmony_ci )*); 682add0d91Sopenharmony_ci (it: $(#[$attr:meta])* pub union $i:ident { $($field:tt)* }) => ( 692add0d91Sopenharmony_ci compile_error!("unions cannot derive extra traits, use s_no_extra_traits instead"); 702add0d91Sopenharmony_ci ); 712add0d91Sopenharmony_ci (it: $(#[$attr:meta])* pub struct $i:ident { $($field:tt)* }) => ( 722add0d91Sopenharmony_ci __item! { 732add0d91Sopenharmony_ci #[repr(C)] 742add0d91Sopenharmony_ci #[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] 752add0d91Sopenharmony_ci #[allow(deprecated)] 762add0d91Sopenharmony_ci $(#[$attr])* 772add0d91Sopenharmony_ci pub struct $i { $($field)* } 782add0d91Sopenharmony_ci } 792add0d91Sopenharmony_ci #[allow(deprecated)] 802add0d91Sopenharmony_ci impl ::Copy for $i {} 812add0d91Sopenharmony_ci #[allow(deprecated)] 822add0d91Sopenharmony_ci impl ::Clone for $i { 832add0d91Sopenharmony_ci fn clone(&self) -> $i { *self } 842add0d91Sopenharmony_ci } 852add0d91Sopenharmony_ci ); 862add0d91Sopenharmony_ci} 872add0d91Sopenharmony_ci 882add0d91Sopenharmony_cimacro_rules! s_no_extra_traits { 892add0d91Sopenharmony_ci ($($(#[$attr:meta])* pub $t:ident $i:ident { $($field:tt)* })*) => ($( 902add0d91Sopenharmony_ci s_no_extra_traits!(it: $(#[$attr])* pub $t $i { $($field)* }); 912add0d91Sopenharmony_ci )*); 922add0d91Sopenharmony_ci (it: $(#[$attr:meta])* pub union $i:ident { $($field:tt)* }) => ( 932add0d91Sopenharmony_ci cfg_if! { 942add0d91Sopenharmony_ci if #[cfg(libc_union)] { 952add0d91Sopenharmony_ci __item! { 962add0d91Sopenharmony_ci #[repr(C)] 972add0d91Sopenharmony_ci $(#[$attr])* 982add0d91Sopenharmony_ci pub union $i { $($field)* } 992add0d91Sopenharmony_ci } 1002add0d91Sopenharmony_ci 1012add0d91Sopenharmony_ci impl ::Copy for $i {} 1022add0d91Sopenharmony_ci impl ::Clone for $i { 1032add0d91Sopenharmony_ci fn clone(&self) -> $i { *self } 1042add0d91Sopenharmony_ci } 1052add0d91Sopenharmony_ci } 1062add0d91Sopenharmony_ci } 1072add0d91Sopenharmony_ci ); 1082add0d91Sopenharmony_ci (it: $(#[$attr:meta])* pub struct $i:ident { $($field:tt)* }) => ( 1092add0d91Sopenharmony_ci __item! { 1102add0d91Sopenharmony_ci #[repr(C)] 1112add0d91Sopenharmony_ci $(#[$attr])* 1122add0d91Sopenharmony_ci pub struct $i { $($field)* } 1132add0d91Sopenharmony_ci } 1142add0d91Sopenharmony_ci #[allow(deprecated)] 1152add0d91Sopenharmony_ci impl ::Copy for $i {} 1162add0d91Sopenharmony_ci #[allow(deprecated)] 1172add0d91Sopenharmony_ci impl ::Clone for $i { 1182add0d91Sopenharmony_ci fn clone(&self) -> $i { *self } 1192add0d91Sopenharmony_ci } 1202add0d91Sopenharmony_ci ); 1212add0d91Sopenharmony_ci} 1222add0d91Sopenharmony_ci 1232add0d91Sopenharmony_cimacro_rules! e { 1242add0d91Sopenharmony_ci ($($(#[$attr:meta])* pub enum $i:ident { $($field:tt)* })*) => ($( 1252add0d91Sopenharmony_ci __item! { 1262add0d91Sopenharmony_ci #[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] 1272add0d91Sopenharmony_ci $(#[$attr])* 1282add0d91Sopenharmony_ci pub enum $i { $($field)* } 1292add0d91Sopenharmony_ci } 1302add0d91Sopenharmony_ci impl ::Copy for $i {} 1312add0d91Sopenharmony_ci impl ::Clone for $i { 1322add0d91Sopenharmony_ci fn clone(&self) -> $i { *self } 1332add0d91Sopenharmony_ci } 1342add0d91Sopenharmony_ci )*); 1352add0d91Sopenharmony_ci} 1362add0d91Sopenharmony_ci 1372add0d91Sopenharmony_cimacro_rules! s_paren { 1382add0d91Sopenharmony_ci ($($(#[$attr:meta])* pub struct $i:ident ( $($field:tt)* ); )* ) => ($( 1392add0d91Sopenharmony_ci __item! { 1402add0d91Sopenharmony_ci #[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] 1412add0d91Sopenharmony_ci $(#[$attr])* 1422add0d91Sopenharmony_ci pub struct $i ( $($field)* ); 1432add0d91Sopenharmony_ci } 1442add0d91Sopenharmony_ci impl ::Copy for $i {} 1452add0d91Sopenharmony_ci impl ::Clone for $i { 1462add0d91Sopenharmony_ci fn clone(&self) -> $i { *self } 1472add0d91Sopenharmony_ci } 1482add0d91Sopenharmony_ci )*); 1492add0d91Sopenharmony_ci} 1502add0d91Sopenharmony_ci 1512add0d91Sopenharmony_ci// This is a pretty horrible hack to allow us to conditionally mark 1522add0d91Sopenharmony_ci// some functions as 'const', without requiring users of this macro 1532add0d91Sopenharmony_ci// to care about the "const-extern-fn" feature. 1542add0d91Sopenharmony_ci// 1552add0d91Sopenharmony_ci// When 'const-extern-fn' is enabled, we emit the captured 'const' keyword 1562add0d91Sopenharmony_ci// in the expanded function. 1572add0d91Sopenharmony_ci// 1582add0d91Sopenharmony_ci// When 'const-extern-fn' is disabled, we always emit a plain 'pub unsafe extern fn'. 1592add0d91Sopenharmony_ci// Note that the expression matched by the macro is exactly the same - this allows 1602add0d91Sopenharmony_ci// users of this macro to work whether or not 'const-extern-fn' is enabled 1612add0d91Sopenharmony_ci// 1622add0d91Sopenharmony_ci// Unfortunately, we need to duplicate most of this macro between the 'cfg_if' blocks. 1632add0d91Sopenharmony_ci// This is because 'const unsafe extern fn' won't even parse on older compilers, 1642add0d91Sopenharmony_ci// so we need to avoid emitting it at all of 'const-extern-fn'. 1652add0d91Sopenharmony_ci// 1662add0d91Sopenharmony_ci// Specifically, moving the 'cfg_if' into the macro body will *not* work. 1672add0d91Sopenharmony_ci// Doing so would cause the '#[cfg(feature = "const-extern-fn")]' to be emitted 1682add0d91Sopenharmony_ci// into user code. The 'cfg' gate will not stop Rust from trying to parse the 1692add0d91Sopenharmony_ci// 'pub const unsafe extern fn', so users would get a compiler error even when 1702add0d91Sopenharmony_ci// the 'const-extern-fn' feature is disabled 1712add0d91Sopenharmony_ci// 1722add0d91Sopenharmony_ci// Note that users of this macro need to place 'const' in a weird position 1732add0d91Sopenharmony_ci// (after the closing ')' for the arguments, but before the return type). 1742add0d91Sopenharmony_ci// This was the only way I could satisfy the following two requirements: 1752add0d91Sopenharmony_ci// 1. Avoid ambiguity errors from 'macro_rules!' (which happen when writing '$foo:ident fn' 1762add0d91Sopenharmony_ci// 2. Allow users of this macro to mix 'pub fn foo' and 'pub const fn bar' within the same 1772add0d91Sopenharmony_ci// 'f!' block 1782add0d91Sopenharmony_cicfg_if! { 1792add0d91Sopenharmony_ci if #[cfg(libc_const_extern_fn)] { 1802add0d91Sopenharmony_ci macro_rules! f { 1812add0d91Sopenharmony_ci ($($(#[$attr:meta])* pub $({$constness:ident})* fn $i:ident( 1822add0d91Sopenharmony_ci $($arg:ident: $argty:ty),* 1832add0d91Sopenharmony_ci ) -> $ret:ty { 1842add0d91Sopenharmony_ci $($body:stmt);* 1852add0d91Sopenharmony_ci })*) => ($( 1862add0d91Sopenharmony_ci #[inline] 1872add0d91Sopenharmony_ci $(#[$attr])* 1882add0d91Sopenharmony_ci pub $($constness)* unsafe extern fn $i($($arg: $argty),* 1892add0d91Sopenharmony_ci ) -> $ret { 1902add0d91Sopenharmony_ci $($body);* 1912add0d91Sopenharmony_ci } 1922add0d91Sopenharmony_ci )*) 1932add0d91Sopenharmony_ci } 1942add0d91Sopenharmony_ci 1952add0d91Sopenharmony_ci macro_rules! safe_f { 1962add0d91Sopenharmony_ci ($($(#[$attr:meta])* pub $({$constness:ident})* fn $i:ident( 1972add0d91Sopenharmony_ci $($arg:ident: $argty:ty),* 1982add0d91Sopenharmony_ci ) -> $ret:ty { 1992add0d91Sopenharmony_ci $($body:stmt);* 2002add0d91Sopenharmony_ci })*) => ($( 2012add0d91Sopenharmony_ci #[inline] 2022add0d91Sopenharmony_ci $(#[$attr])* 2032add0d91Sopenharmony_ci pub $($constness)* extern fn $i($($arg: $argty),* 2042add0d91Sopenharmony_ci ) -> $ret { 2052add0d91Sopenharmony_ci $($body);* 2062add0d91Sopenharmony_ci } 2072add0d91Sopenharmony_ci )*) 2082add0d91Sopenharmony_ci } 2092add0d91Sopenharmony_ci 2102add0d91Sopenharmony_ci macro_rules! const_fn { 2112add0d91Sopenharmony_ci ($($(#[$attr:meta])* $({$constness:ident})* fn $i:ident( 2122add0d91Sopenharmony_ci $($arg:ident: $argty:ty),* 2132add0d91Sopenharmony_ci ) -> $ret:ty { 2142add0d91Sopenharmony_ci $($body:stmt);* 2152add0d91Sopenharmony_ci })*) => ($( 2162add0d91Sopenharmony_ci #[inline] 2172add0d91Sopenharmony_ci $(#[$attr])* 2182add0d91Sopenharmony_ci $($constness)* fn $i($($arg: $argty),* 2192add0d91Sopenharmony_ci ) -> $ret { 2202add0d91Sopenharmony_ci $($body);* 2212add0d91Sopenharmony_ci } 2222add0d91Sopenharmony_ci )*) 2232add0d91Sopenharmony_ci } 2242add0d91Sopenharmony_ci 2252add0d91Sopenharmony_ci } else { 2262add0d91Sopenharmony_ci macro_rules! f { 2272add0d91Sopenharmony_ci ($($(#[$attr:meta])* pub $({$constness:ident})* fn $i:ident( 2282add0d91Sopenharmony_ci $($arg:ident: $argty:ty),* 2292add0d91Sopenharmony_ci ) -> $ret:ty { 2302add0d91Sopenharmony_ci $($body:stmt);* 2312add0d91Sopenharmony_ci })*) => ($( 2322add0d91Sopenharmony_ci #[inline] 2332add0d91Sopenharmony_ci $(#[$attr])* 2342add0d91Sopenharmony_ci pub unsafe extern fn $i($($arg: $argty),* 2352add0d91Sopenharmony_ci ) -> $ret { 2362add0d91Sopenharmony_ci $($body);* 2372add0d91Sopenharmony_ci } 2382add0d91Sopenharmony_ci )*) 2392add0d91Sopenharmony_ci } 2402add0d91Sopenharmony_ci 2412add0d91Sopenharmony_ci macro_rules! safe_f { 2422add0d91Sopenharmony_ci ($($(#[$attr:meta])* pub $({$constness:ident})* fn $i:ident( 2432add0d91Sopenharmony_ci $($arg:ident: $argty:ty),* 2442add0d91Sopenharmony_ci ) -> $ret:ty { 2452add0d91Sopenharmony_ci $($body:stmt);* 2462add0d91Sopenharmony_ci })*) => ($( 2472add0d91Sopenharmony_ci #[inline] 2482add0d91Sopenharmony_ci $(#[$attr])* 2492add0d91Sopenharmony_ci pub extern fn $i($($arg: $argty),* 2502add0d91Sopenharmony_ci ) -> $ret { 2512add0d91Sopenharmony_ci $($body);* 2522add0d91Sopenharmony_ci } 2532add0d91Sopenharmony_ci )*) 2542add0d91Sopenharmony_ci } 2552add0d91Sopenharmony_ci 2562add0d91Sopenharmony_ci macro_rules! const_fn { 2572add0d91Sopenharmony_ci ($($(#[$attr:meta])* $({$constness:ident})* fn $i:ident( 2582add0d91Sopenharmony_ci $($arg:ident: $argty:ty),* 2592add0d91Sopenharmony_ci ) -> $ret:ty { 2602add0d91Sopenharmony_ci $($body:stmt);* 2612add0d91Sopenharmony_ci })*) => ($( 2622add0d91Sopenharmony_ci #[inline] 2632add0d91Sopenharmony_ci $(#[$attr])* 2642add0d91Sopenharmony_ci fn $i($($arg: $argty),* 2652add0d91Sopenharmony_ci ) -> $ret { 2662add0d91Sopenharmony_ci $($body);* 2672add0d91Sopenharmony_ci } 2682add0d91Sopenharmony_ci )*) 2692add0d91Sopenharmony_ci } 2702add0d91Sopenharmony_ci } 2712add0d91Sopenharmony_ci} 2722add0d91Sopenharmony_ci 2732add0d91Sopenharmony_cimacro_rules! __item { 2742add0d91Sopenharmony_ci ($i:item) => { 2752add0d91Sopenharmony_ci $i 2762add0d91Sopenharmony_ci }; 2772add0d91Sopenharmony_ci} 2782add0d91Sopenharmony_ci 2792add0d91Sopenharmony_cimacro_rules! align_const { 2802add0d91Sopenharmony_ci ($($(#[$attr:meta])* 2812add0d91Sopenharmony_ci pub const $name:ident : $t1:ty 2822add0d91Sopenharmony_ci = $t2:ident { $($field:tt)* };)*) => ($( 2832add0d91Sopenharmony_ci #[cfg(libc_align)] 2842add0d91Sopenharmony_ci $(#[$attr])* 2852add0d91Sopenharmony_ci pub const $name : $t1 = $t2 { 2862add0d91Sopenharmony_ci $($field)* 2872add0d91Sopenharmony_ci }; 2882add0d91Sopenharmony_ci #[cfg(not(libc_align))] 2892add0d91Sopenharmony_ci $(#[$attr])* 2902add0d91Sopenharmony_ci pub const $name : $t1 = $t2 { 2912add0d91Sopenharmony_ci $($field)* 2922add0d91Sopenharmony_ci __align: [], 2932add0d91Sopenharmony_ci }; 2942add0d91Sopenharmony_ci )*) 2952add0d91Sopenharmony_ci} 2962add0d91Sopenharmony_ci 2972add0d91Sopenharmony_ci// This macro is used to deprecate items that should be accessed via the mach2 crate 2982add0d91Sopenharmony_cimacro_rules! deprecated_mach { 2992add0d91Sopenharmony_ci (pub const $id:ident: $ty:ty = $expr:expr;) => { 3002add0d91Sopenharmony_ci #[deprecated( 3012add0d91Sopenharmony_ci since = "0.2.55", 3022add0d91Sopenharmony_ci note = "Use the `mach2` crate instead", 3032add0d91Sopenharmony_ci )] 3042add0d91Sopenharmony_ci #[allow(deprecated)] 3052add0d91Sopenharmony_ci pub const $id: $ty = $expr; 3062add0d91Sopenharmony_ci }; 3072add0d91Sopenharmony_ci ($(pub const $id:ident: $ty:ty = $expr:expr;)*) => { 3082add0d91Sopenharmony_ci $( 3092add0d91Sopenharmony_ci deprecated_mach!( 3102add0d91Sopenharmony_ci pub const $id: $ty = $expr; 3112add0d91Sopenharmony_ci ); 3122add0d91Sopenharmony_ci )* 3132add0d91Sopenharmony_ci }; 3142add0d91Sopenharmony_ci (pub type $id:ident = $ty:ty;) => { 3152add0d91Sopenharmony_ci #[deprecated( 3162add0d91Sopenharmony_ci since = "0.2.55", 3172add0d91Sopenharmony_ci note = "Use the `mach2` crate instead", 3182add0d91Sopenharmony_ci )] 3192add0d91Sopenharmony_ci #[allow(deprecated)] 3202add0d91Sopenharmony_ci pub type $id = $ty; 3212add0d91Sopenharmony_ci }; 3222add0d91Sopenharmony_ci ($(pub type $id:ident = $ty:ty;)*) => { 3232add0d91Sopenharmony_ci $( 3242add0d91Sopenharmony_ci deprecated_mach!( 3252add0d91Sopenharmony_ci pub type $id = $ty; 3262add0d91Sopenharmony_ci ); 3272add0d91Sopenharmony_ci )* 3282add0d91Sopenharmony_ci } 3292add0d91Sopenharmony_ci} 3302add0d91Sopenharmony_ci 3312add0d91Sopenharmony_ci#[cfg(not(libc_ptr_addr_of))] 3322add0d91Sopenharmony_cimacro_rules! ptr_addr_of { 3332add0d91Sopenharmony_ci ($place:expr) => { 3342add0d91Sopenharmony_ci &$place 3352add0d91Sopenharmony_ci }; 3362add0d91Sopenharmony_ci} 3372add0d91Sopenharmony_ci 3382add0d91Sopenharmony_ci#[cfg(libc_ptr_addr_of)] 3392add0d91Sopenharmony_cimacro_rules! ptr_addr_of { 3402add0d91Sopenharmony_ci ($place:expr) => { 3412add0d91Sopenharmony_ci ::core::ptr::addr_of!($place) 3422add0d91Sopenharmony_ci }; 3432add0d91Sopenharmony_ci} 344