1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
pub struct Scanner {
	handle: std::io::Stdin,
	buffer: std::collections::VecDeque<String>
}

impl Scanner {
	pub fn new() -> Scanner {
		Scanner {
			handle: std::io::stdin(),
			buffer: std::collections::VecDeque::new()
		}
	}

	/// Buffered input, one variable at a time.
	/// 
	/// # Example
	/// ```
	/// let mut scanner = Scanner::new();
	/// let x: i32 = scanner.next().unwrap();
	/// println!("{}", x);
	/// let y: String = scanner.next().unwrap();
	/// println!("{}", y);
	/// ```
	pub fn next<T: std::str::FromStr>(&mut self) -> Result<T, T::Err> {
		'populate_buffer: loop {
			if self.buffer.len() > 0 {
				break 'populate_buffer;
			}
			let mut available = String::new();
			self.handle.read_line(&mut available).unwrap();
			self.buffer = available.split_whitespace().map(String::from).collect();
		}
		T::from_str(&self.buffer.pop_front().unwrap())
	}
}

/// In the debug mode, acts like std::dbg.
/// In the release mode, does nothing.
/// 
/// # Example
/// ```
/// dbg!(x, y, z);
/// ```
#[macro_export]
macro_rules! dbg {
	($($x:tt)*) => {
		#[cfg(debug_assertions)] std::dbg!($($x)*)
	}
}