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
50
51
52
pub struct Scanner<R> {
reader: R,
}
impl<R: std::io::Read> Scanner<R> {
pub fn read<T: std::str::FromStr>(&mut self) -> T {
use std::io::Read;
let buf = self
.reader
.by_ref()
.bytes()
.map(|b| b.unwrap())
.skip_while(|&b| b == b' ' || b == b'\n')
.take_while(|&b| b != b' ' && b != b'\n')
.collect::<Vec<_>>();
unsafe { std::str::from_utf8_unchecked(&buf) }
.parse()
.ok()
.expect("Parse error.")
}
pub fn read_vec<T: std::str::FromStr>(&mut self, n: usize) -> Vec<T> {
(0..n).map(|_| self.read()).collect()
}
pub fn chars(&mut self) -> Vec<char> {
self.read::<String>().chars().collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::io;
#[test]
fn scanner_test() {
let cursor = io::Cursor::new(b"1 2 3 \n4 5 6");
let mut sc = Scanner { reader: cursor };
assert_eq!(1, sc.read());
assert_eq!(2, sc.read());
assert_eq!(3, sc.read());
assert_eq!(4, sc.read());
assert_eq!(5, sc.read());
assert_eq!(6, sc.read());
let cursor = io::Cursor::new(b"1 a 0.1");
let mut sc = Scanner { reader: cursor };
assert_eq!(1, sc.read());
assert_eq!("a".to_string(), sc.read::<String>());
assert_eq!(0.1, sc.read());
}
}