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}