#[macro_export] macro_rules! define_print { ($name:ident, $start:expr) => { paste::paste!( #[allow(unused_macros)] macro_rules! $name { () => {{ // #[cfg(debug_assertions)] println!($start) }}; ($fmt:literal) => {{ // #[cfg(debug_assertions)] println!(concat!($start, " {}"), format!($fmt)) }}; } ); }; ($name:ident, $start:expr, $b:expr) => { paste::paste!( #[allow(unused_macros)] macro_rules! $name { () => {{ // #[cfg(debug_assertions)] println!($start); $b }}; ($fmt:literal) => {{ // #[cfg(debug_assertions)] println!(concat!($start, " {}"), format!($fmt)); $b }}; } ); }; ($prefix:expr) => { define_print!(fail, concat!($prefix, " ", "!!"), break); define_print!(flush, concat!($prefix, " ", "<<")); define_print!(input, concat!($prefix, " ", "<")); define_print!(output, concat!($prefix, " ", ">")); }; } #[macro_export] macro_rules! dummy_print { ($name:ident, $start:expr) => { paste::paste!( #[allow(unused_macros)] macro_rules! $name { () => { () }; ($fmt:literal) => { () }; } ); }; ($name:ident, $start:expr, $b:expr) => { paste::paste!( #[allow(unused_macros)] macro_rules! $name { () => {{ $b }}; ($fmt:literal) => {{ $b }}; } ); }; ($prefix:expr) => { dummy_print!(fail, concat!($prefix, " ", "!!"), break); dummy_print!(flush, concat!($prefix, " ", "<<")); dummy_print!(nooutput, concat!($prefix, " ", "!>")); dummy_print!(input, concat!($prefix, " ", "<")); dummy_print!(output, concat!($prefix, " ", ">")); }; }