#[doc = crate::_tags!(code debug)]
#[doc = crate::_doc_meta!{location("code/util")}]
#[macro_export]
#[cfg_attr(nightly_doc, doc(cfg(feature = "std")))]
#[cfg_attr(cargo_primary_package, doc(hidden))]
macro_rules! cdbg {
(
// shows no location (pretty-print) cdbg![# x];
# $v:expr $(,)?) => { $crate::cdbg![%fmt # concat!(stringify!($v), " = "), $v] };
(# $($v:expr),+ $(,)?) => { ($($crate::cdbg![# $v]),+,) };
(
$(@)? $v:expr $(,)?) => { $crate::cdbg![%fmt ? concat!(stringify!($v), " = "), $v] };
($($v:expr),+ $(,)?) => { ($($crate::cdbg![$v]),+,) };
(
$prefix:literal ; # $v:expr $(,)?) => { $crate::cdbg![%fmt # $prefix, $v] };
($prefix:literal ; # $($v:expr),+ $(,)?) => { ($($crate::cdbg![$prefix; # $v]),+,) };
(
$prefix:literal ; $(@)? $v:expr $(,)?) => { $crate::cdbg![%fmt ? $prefix, $v] };
($prefix:literal ; $($v:expr),+ $(,)?) => { ($($crate::cdbg![$prefix; $v]),+,) };
(
$prefix:literal ; $n:literal @ $v:expr $(,)?) => {{
if $crate::cif!(diff($n, 0)) {
let (path, mut new_path) = (std::path::Path::new(file!()), std::path::PathBuf::new());
for c in path.components().rev().take($n).collect::<Vec<_>>().into_iter().rev() {
new_path.push(c.as_os_str()); }
eprint!("[{}:{}:{}] ", new_path.display(), line!(), column!());
}
$crate::cdbg![$prefix; $v]
}};
($prefix:literal ; $n:literal @ $($v:expr),+ $(,)?) => {
($( $crate::cdbg![$prefix; $n@ $v] ),+,)
};
(
$n:literal @ $v:expr $(,)?) => {{
if $crate::cif!(diff($n, 0)) {
let (path, mut new_path) = (std::path::Path::new(file!()), std::path::PathBuf::new());
for c in path.components().rev().take($n).collect::<Vec<_>>().into_iter().rev() {
new_path.push(c.as_os_str()); }
eprint!("[{}:{}:{}] ", new_path.display(), line!(), column!());
}
$crate::cdbg![$v]
}};
($n:literal @ $($v:expr),+ $(,)?) => { ($( $crate::cdbg![$n@ $v] ),+,) };
($n:literal @) => {{
let (path, mut new_path) = (std::path::Path::new(file!()), std::path::PathBuf::new());
for c in path.components().rev().take($n).collect::<Vec<_>>().into_iter().rev() {
new_path.push(c.as_os_str()); }
eprintln!("[{}:{}:{}]", new_path.display(), line!(), column!())
}};
( $prefix:literal ; $n:literal # $v:expr $(,)?) => {{
if $crate::cif!(diff($n, 0)) {
let (path, mut new_path) = (std::path::Path::new(file!()), std::path::PathBuf::new());
for c in path.components().rev().take($n).collect::<Vec<_>>().into_iter().rev() {
new_path.push(c.as_os_str()); }
eprint!("[{}:{}:{}] ", new_path.display(), line!(), column!());
}
$crate::cdbg![$prefix; # $v]
}};
($prefix:literal ; $n:literal # $($v:expr),+ $(,)?) => {
($( $crate::cdbg![$prefix; $n # $v] ),+,)
};
( $n:literal # $v:expr $(,)?) => {{
if $crate::cif!(diff($n, 0)) {
let (path, mut new_path) = (std::path::Path::new(file!()), std::path::PathBuf::new());
for c in path.components().rev().take($n).collect::<Vec<_>>().into_iter().rev() {
new_path.push(c.as_os_str()); }
eprint!("[{}:{}:{}] ", new_path.display(), line!(), column!());
}
$crate::cdbg![# $v]
}};
($n:literal # $($v:expr),+ $(,)?) => { ($( $crate::cdbg![$n # $v] ),+,) };
($n:literal #) => {{
let (path, mut new_path) = (std::path::Path::new(file!()), std::path::PathBuf::new());
for c in path.components().rev().take($n).collect::<Vec<_>>().into_iter().rev() {
new_path.push(c.as_os_str()); }
eprintln!("[{}:{}:{}]", new_path.display(), line!(), column!())
}};
(
$prefix:literal ; f @ $v:expr $(,)?) => {{
eprint!("[{}:{}:{}] ", file!(), line!(), column!());
$crate::cdbg![$prefix; $v]
}};
($prefix:literal ; f @ $($v:expr),+ $(,)?) => {
($($crate::cdbg![$prefix; f @ $v]),+,)
};
(
f @ $v:expr $(,)?) => {{
eprint!("[{}:{}:{}] ", file!(), line!(), column!());
$crate::cdbg![$v]
}};
(f @ $($v:expr),+ $(,)?) => { ($($crate::cdbg![f @ $v]),+,) };
(f @) => { eprintln!("[{}:{}:{}]", file!(), line!(), column!()) };
( $prefix:literal ; f # $v:expr $(,)?) => {{
eprint!("[{}:{}:{}] ", file!(), line!(), column!());
$crate::cdbg![$prefix; # $v]
}};
($prefix:literal ; f # $($v:expr),+ $(,)?) => {
($($crate::cdbg![$prefix; f # $v]),+,)
};
( f # $v:expr $(,)?) => {{
eprint!("[{}:{}:{}] ", file!(), line!(), column!());
$crate::cdbg![# $v]
}};
(f # $($v:expr),+ $(,)?) => { ($($crate::cdbg![f # $v]),+,) };
(f #) => { eprintln!("[{}:{}:{}]", file!(), line!(), column!()) };
(
$prefix:literal ; fln @ $v:expr $(,)?) => {{
eprintln!("[{}:{}:{}]", file!(), line!(), column!());
$crate::cdbg![$prefix; $v]
}};
($prefix:literal ; fln @ $($v:expr),+ $(,)?) => {
($($crate::cdbg![$prefix; fln @ $v]),+,)
};
(
fln @ $v:expr $(,)?) => {{
eprintln!("[{}:{}:{}]", file!(), line!(), column!());
$crate::cdbg![$v]
}};
(fln @ $($v:expr),+ $(,)?) => { ($($crate::cdbg![fln @ $v]),+,) };
(fln @) => { eprintln!("[{}:{}:{}]", file!(), line!(), column!()) };
( $prefix:literal ; fln # $v:expr $(,)?) => {{
eprintln!("[{}:{}:{}]", file!(), line!(), column!());
$crate::cdbg![$prefix; # $v]
}};
($prefix:literal ; fln # $($v:expr),+ $(,)?) => {
($($crate::cdbg![$prefix; fln # $v]),+,)
};
( fln # $v:expr $(,)?) => {{
eprintln!("[{}:{}:{}]", file!(), line!(), column!());
$crate::cdbg![# $v]
}};
(fln # $($v:expr),+ $(,)?) => { ($($crate::cdbg![fln # $v]),+,) };
(fln #) => { eprintln!("[{}:{}:{}]", file!(), line!(), column!()) };
(%fmt ? $prefix:expr, $v:expr $(,)?) => {{
let prefix: &str = $prefix;
match $v { v => { eprintln!("{}{:?}", prefix, &v); v } }
}};
(%fmt # $prefix:expr, $v:expr $(,)?) => {{
let prefix: &str = $prefix;
match $v { v => { eprintln!("{}{:#?}", prefix, &v); v } }
}};
(
; $($tt:tt)+) => { $crate::cdbg![""; $($tt)+] };
(
;) => { () };
() => { () };
}
#[doc(inline)]
pub use cdbg;