ot/
mem_read.rs

1use std::io::{Error, Read};
2use std::mem::*;
3use std::slice::*;
4
5pub trait MemType {}
6
7impl MemType for u8 {}
8impl MemType for u16 {}
9impl MemType for u32 {}
10impl MemType for u64 {}
11
12impl MemType for i8 {}
13impl MemType for i16 {}
14impl MemType for i32 {}
15impl MemType for i64 {}
16
17pub trait MemRead {
18    fn get<U>(&mut self) -> Result<U, Error>;
19    fn get_str(&mut self) -> Result<String, Error>;
20    fn get_str_sized(&mut self, size: usize) -> Result<String, Error>;
21    fn skip(&mut self, count: u64);
22}
23
24impl<T: Read> MemRead for T {
25    fn get<U>(&mut self) -> Result<U, Error> {
26        unsafe {
27            let mut x: U = uninitialized();
28            let slice = from_raw_parts_mut(&mut x as *mut U as *mut u8, size_of::<U>());
29            self.read_exact(slice).map(|_| x)
30        }
31    }
32
33    fn get_str(&mut self) -> Result<String, Error> {
34        let size = self.get::<u16>()?;
35        self::MemRead::get_str_sized(self, size as _)
36    }
37
38    fn get_str_sized(&mut self, size: usize) -> Result<String, Error> {
39        let mut buffer: Vec<u8> = Vec::with_capacity(size);
40        self.take(size as u64)
41            .read_to_end(&mut buffer)
42            .map(|_| String::from_utf8_lossy(&buffer).into())
43    }
44
45    fn skip(&mut self, count: u64) {
46        std::io::copy(&mut self.take(count), &mut std::io::sink()).expect("could not skip bytes");
47    }
48}