//! Miscellaneous utilities. #[cold] #[inline(always)] fn cold() {} /// A hint that `b` is likely to be true. See `core::intrinsics::likely`. #[inline(always)] pub fn likely(b: bool) -> bool { if !b { cold() } b } /// A hint that `b` is likely to be false. See `core::intrinsics::unlikely`. #[inline(always)] pub fn unlikely(b: bool) -> bool { if b { cold() } b } /// A version of `std::dbg` built on top of `log::debug` instead of /// `std::eprintln`. /// /// This code is copied from libstd, and inherits its copyright. #[macro_export] macro_rules! dbg { // NOTE: We cannot use `concat!` to make a static string as a format // argument of `log::debug!` because the `$expr` expression could be a // block (`{ .. }`), in which case the format string will be malformed. () => { log::debug!("") }; ($expr:expr $(,)?) => { // Use of `match` here is intentional because it affects the lifetimes // of temporaries - https://stackoverflow.com/a/48732525/1063961 match $expr { tmp => { log::debug!("{} = {:#?}", core::stringify!($expr), &tmp); tmp } } }; ($($expr:expr),+ $(,)?) => { ($($crate::dbg!($expr)),+,) }; }