1use std::io::{self, Read};
7
8pub struct Reader {
29 buffer: Vec<u8>,
30 index: usize,
31 len: usize,
32}
33impl Iterator for Reader {
38 type Item = u8;
39
40 #[cfg(not(test))]
41 fn next(&mut self) -> Option<Self::Item> {
42 if self.index >= self.len {
44 if self.len < 400_000 {
45 return None;
46 }
47 self.buffer.clear(); self.len = io::stdin()
50 .lock()
51 .take(400_000)
52 .read_to_end(&mut self.buffer)
53 .ok()?;
54 self.index = 0;
55 }
56 let n = self.buffer[self.index];
57 self.index += 1;
58 Some(n)
59 }
60
61 #[cfg(test)]
62 fn next(&mut self) -> Option<Self::Item> {
63 if self.index >= self.len {
65 return None;
66 }
67 let n = self.buffer[self.index];
68 self.index += 1;
69 Some(n)
70 }
71}
72
73impl Reader {
74 pub fn new() -> Self {
82 Reader {
83 buffer: Vec::<u8>::with_capacity(400_000),
84 index: usize::MAX,
85 len: usize::MAX,
86 }
87 }
88
89 pub fn from_str(input: &str) -> Self {
99 Reader {
100 buffer: input.as_bytes().to_vec(),
101 index: 0,
102 len: input.len(),
103 }
104 }
105
106 fn read_i32(&mut self) -> Option<(i32, i32)> {
107 let mut r = 0;
111 let (mut val, neg) = match self.next()? {
112 v @ b'0'..=b'9' => (v as i32, false), b'-' => (48, true),
114 b'+' => (48, false),
115 _ => return None, };
117
118 while val >= b'0' as i32 && val <= b'9' as i32 {
119 r = r * 10 + val - 48;
120
121 val = match self.next() {
122 Some(a) => a as i32,
123 None => break,
124 };
125 }
126 Some((if neg { -r } else { r }, val))
127 }
128
129 pub fn next_u32(&mut self) -> Option<u32> {
131 Some(self.read_i32()?.0.unsigned_abs())
132 }
133
134 pub fn next_usize(&mut self) -> Option<usize> {
136 Some(self.read_i32()?.0.unsigned_abs() as usize)
137 }
138
139 pub fn next_i32(&mut self) -> Option<i32> {
141 Some(self.read_i32()?.0)
142 }
143
144 pub fn next_char(&mut self) -> Option<char> {
146 Some(self.next()? as char)
147 }
148
149 pub fn next_pair(&mut self) -> Option<(i32, i32)> {
151 Some((self.read_i32()?.0, self.read_i32()?.0))
152 }
153
154 pub fn next_f64(&mut self) -> Option<f64> {
156 let (base, latest) = self.read_i32()?;
157 let base: f64 = base as f64;
158 if latest != b'.' as i32 { return Some(base);
160 }
161 let (mut dec, mut val, mut ten) = (0.0, 48, 1.0);
162 while val >= b'0' && val <= b'9' {
163 dec += ((val - b'0') as f64) * ten;
164 ten *= 0.1;
165 val = match self.next() {
166 Some(a) => a,
167 _ => break,
168 };
169 }
170 Some(base + dec.copysign(base))
171 }
172}
173
174#[cfg(test)]
175mod tests {
176 use super::*;
177
178 #[test]
179 fn test_reader_from_str() {
180 let reader = Reader::from_str("-4.1");
181
182 assert_eq!(reader.buffer, vec![45, 52, 46, 49]);
183 assert_eq!(reader.index, 0);
184 assert_eq!(reader.len, 4);
185 }
186
187 #[test]
188 fn test_next_f64() {
189 let mut reader = Reader::from_str("-4 45 -754.3 32. 45");
190 assert_eq!(reader.next_f64().unwrap(), -4.);
191 assert_eq!(reader.next_f64().unwrap(), 45.);
192 assert_eq!(reader.next_f64().unwrap(), -754.3);
193 assert_eq!(reader.next_f64().unwrap(), 32.);
194 assert_eq!(reader.next_f64().unwrap(), 45.);
195 }
196
197 #[test]
198 fn test_next_char() {
199 let mut reader = Reader::from_str("ab cd");
200 assert_eq!(reader.next_char().unwrap(), 'a');
201 assert_eq!(reader.next_char().unwrap(), 'b');
202 assert_eq!(reader.next_char().unwrap(), ' ');
203 assert_eq!(reader.next_char().unwrap(), 'c');
204 assert_eq!(reader.next_char().unwrap(), 'd');
205 }
206
207 #[test]
208 fn test_next_pair() {
209 let mut reader = Reader::from_str("23 32\n12 -34 57 97\n-12 3");
210 assert_eq!(reader.next_pair().unwrap(), (23, 32));
211 assert_eq!(reader.next_pair().unwrap(), (12, -34));
212 assert_eq!(reader.next_pair().unwrap(), (57, 97));
213 assert_eq!(reader.next_pair().unwrap(), (-12, 3));
214 }
215
216 #[test]
217 fn test_next_usize() {
218 let mut reader = Reader::from_str("23 32\n12\n34");
219 assert_eq!(reader.next_usize().unwrap(), 23);
220 assert_eq!(reader.next_usize().unwrap(), 32);
221 assert_eq!(reader.next_usize().unwrap(), 12);
222 assert_eq!(reader.next_usize().unwrap(), 34);
223 }
224
225 #[test]
226 fn test_long_float() {
227 let mut reader = Reader::from_str("4.323580432456786");
228 assert_eq!(reader.next_f64().unwrap(), 4.323580432456786);
229 }
230}