bufread_assert_stream_position/
bufread_assert_stream_position.rs

1use io_wrapper_statistics::{IOStatWrapper, IopInfoPair};
2
3use std::fs::File;
4use std::io::{Read, Seek, BufReader};
5
6fn main() {
7    let file_obj = File::open("Cargo.toml").unwrap();
8    let mut instrumented_raw_file = IOStatWrapper::<_, Vec<IopInfoPair>>::new(file_obj, 0);
9    let buffered_io = BufReader::new(&mut instrumented_raw_file);
10    let mut instrumented_buf_file = IOStatWrapper::<_, Vec<IopInfoPair>>::new(buffered_io, 0);
11
12    // Do something so that the loop doesn't get optimized out
13    let mut xor_result: u8 = 0x00;
14    let mut read_buf: [u8; 1] = [0x00; 1];
15    loop {
16        let bytes_read = instrumented_buf_file.read(&mut read_buf).unwrap();
17        if bytes_read == 0 {
18            break;
19        }
20        xor_result ^= read_buf[0];
21        assert_eq!(instrumented_buf_file.seek_pos(),
22            instrumented_buf_file.stream_position().unwrap());
23    }
24    println!("XOR of all bytes in Cargo.toml is {:#x}", xor_result);
25
26    // Demonstrate how BufReader reduces the number of read calls
27    println!("Buffered read was called successfully {} times",
28        instrumented_buf_file.read_call_counter().success_ctr());
29    println!("Buffered seek was called successfully {} times",
30        instrumented_buf_file.seek_call_counter().success_ctr());
31    println!("Inner read was called successfully {} times",
32        instrumented_raw_file.read_call_counter().success_ctr());
33    println!("Inner seek was called successfully {} times",
34        instrumented_raw_file.seek_call_counter().success_ctr());
35}