Skip to main content

competitive/
prelude.rs

1pub use crate::tools::{
2    Bytes, Chars, FastInput, FastIterPrint, FastOutput, FastPrint, IterPrint, Scan, ScanSource,
3    Scanner, Usize1, read_all_unchecked,
4};
5pub use crate::{iter_print, prepare_io, scan};
6pub use std::io::{Read, Write};
7
8/// Prepare `sc!`, `sv!`, `pp!`, and `dg!` with fast I/O for the supplied reader and writer.
9/// `prepare_io!(buffered; reader, writer)` reads incrementally for large numeric inputs.
10/// Every read must satisfy [`FastInput`]'s token requirements.
11#[macro_export]
12macro_rules! prepare_io {
13    (@inner ($dol:tt) $scanner:expr, $writer:expr) => {
14        #[allow(unused_imports)]
15        use $crate::tools::{FastIterPrint, FastOutput, FastPrint, IterPrint, ScanSource as _};
16        #[allow(unused_mut, unused_variables)]
17        let mut __scanner = $scanner;
18        #[allow(unused_mut, unused_variables)]
19        let mut __out = FastOutput::new($writer);
20        #[allow(unused_macros)]
21        macro_rules! sc { ($dol($dol t:tt)*) => { $crate::scan!(__scanner, $dol($dol t)*) } }
22        #[allow(unused_macros)]
23        macro_rules! sv { ($dol($dol t:tt)*) => { $crate::scan_value!(__scanner, $dol($dol t)*) } }
24        #[allow(unused_macros)]
25        macro_rules! pp { ($dol($dol t:tt)*) => { $crate::iter_print!(fast; __out, $dol($dol t)*) } }
26        $crate::prepare!(@debug ($));
27    };
28    (buffered; $reader:expr, $writer:expr $(,)?) => {
29        $crate::prepare_io!(@inner ($) unsafe { $crate::tools::BufferedInput::new($reader) }, $writer);
30    };
31    ($reader:expr, $writer:expr $(,)?) => {
32        let mut __in_buf = $crate::tools::read_all_unchecked($reader);
33        __in_buf.push_str("                 ");
34        $crate::prepare_io!(@inner ($) unsafe { $crate::tools::FastInput::from_slice(__in_buf.as_bytes()) }, $writer);
35    };
36}