#[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 $(,)?) => { match $v { v => { eprintln!("{} = {:#?}", stringify!($v), &v); v } } };
(# $($v:expr),+ $(,)?) => { ($($crate::cdbg![# $v]),+,) };
(
$(@)? $v:expr $(,)?) => { match $v { v => { eprintln!("{} = {:?}", stringify!($v), &v); v } } };
($($v:expr),+ $(,)?) => { ($($crate::cdbg![$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!())
}};
( $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!())
}};
(
f @ $v:expr $(,)?) => {{
eprint!("[{}:{}:{}] ", file!(), line!(), column!());
$crate::cdbg![$v]
}};
(f @ $($v:expr),+ $(,)?) => { ($($crate::cdbg![f @ $v]),+,) };
(f @) => { eprintln!("[{}:{}:{}]", file!(), line!(), column!()) };
( f # $v:expr $(,)?) => {{
eprint!("[{}:{}:{}] ", file!(), line!(), column!());
$crate::cdbg![# $v]
}};
(f # $($v:expr),+ $(,)?) => { ($($crate::cdbg![f # $v]),+,) };
(f #) => { eprintln!("[{}:{}:{}]", file!(), line!(), column!()) };
(
fln @ $v:expr $(,)?) => {{
eprintln!("[{}:{}:{}]", file!(), line!(), column!());
$crate::cdbg![$v]
}};
(fln @ $($v:expr),+ $(,)?) => { ($($crate::cdbg![fln @ $v]),+,) };
(fln @) => { eprintln!("[{}:{}:{}]", file!(), line!(), column!()) };
( fln # $v:expr $(,)?) => {{
eprintln!("[{}:{}:{}]", file!(), line!(), column!());
$crate::cdbg![# $v]
}};
(fln # $($v:expr),+ $(,)?) => { ($($crate::cdbg![fln # $v]),+,) };
(fln #) => { eprintln!("[{}:{}:{}]", file!(), line!(), column!()) };
() => { () };
}
#[doc(inline)]
pub use cdbg;