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
use std::io::{self, Read, Write};

/* Manually buffered standard input.  Buffer size such that write from
Saleae driver doesn't need to be chunked. */
pub struct Buf8 {
    buf: [u8; 262144],
    offset: usize
}
impl Iterator for Buf8 {
    type Item = u8;
    #[inline(always)]
    fn next(&mut self) -> Option<u8> {
        loop {
            if self.offset < self.buf.len() {
                let rv = self.buf[self.offset];
                self.offset += 1;
                return Some(rv);
            }
            match io::stdin().read_exact(&mut self.buf) {
                Err(err) => panic!("{}",err),
                Ok(()) => ()
            }
            self.offset = 0;
        }
    }
}
pub fn stdin8() -> Buf8 {
    Buf8 {
        buf: [0; 262144], 
        offset: 262144
    }
}

#[inline]
pub fn write_byte(b: u8) {
    let bs = [b];
    match io::stdout().write(&bs) {
        Err(err) => panic!("{}",err),
        Ok(_) => (),
    }
    match io::stdout().flush() {
        Err(err) => panic!("{}",err),
        Ok(_) => ()
    }
}