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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
use crate::{Data, Reader, Dummy}; use std::io; use std::hash::Hash; use std::collections::{HashMap, BTreeMap}; pub trait ReadFrom{ fn readfrom(data:&mut Data)->io::Result<Self> where Self: Sized; } macro_rules! make_read_from { ($type:ty) => { impl ReadFrom for $type{ #[inline] fn readfrom(data: &mut Data) -> io::Result<Self> { data.set_position(0); <$type>::get_le(data) } } }; } make_read_from!(i8); make_read_from!(u8); make_read_from!(i16); make_read_from!(u16); make_read_from!(i32); make_read_from!(u32); make_read_from!(i64); make_read_from!(u64); make_read_from!(i128); make_read_from!(u128); make_read_from!(f32); make_read_from!(f64); impl ReadFrom for String{ #[inline] fn readfrom(data: &mut Data) -> io::Result<Self> where Self: Sized { data.set_position(0); Ok(String::from_utf8_lossy(&data.buf).to_string()) } } impl <K:Reader+Eq+Hash,V:Reader> ReadFrom for HashMap<K,V>{ #[inline] fn readfrom(data: &mut Data) -> io::Result<Self> where Self: Sized { data.set_position(0); let len= data.get_le::<i32>()? as usize; let mut hashmap=HashMap::with_capacity(len); for _ in 0..len { hashmap.insert(data.get_le::<K>()?,data.get_le::<V>()?); } Ok(hashmap) } } impl <K:Reader+Ord,V:Reader> ReadFrom for BTreeMap<K,V>{ #[inline] fn readfrom(data: &mut Data) -> io::Result<Self> where Self: Sized { data.set_position(0); let len= data.get_le::<i32>()? as usize; let mut btreemap=BTreeMap::new(); for _ in 0..len{ btreemap.insert(data.get_le::<K>()?, data.get_le::<V>()?); } Ok(btreemap) } } impl<T:Reader+Dummy> ReadFrom for Vec<T>{ fn readfrom(data: &mut Data) -> io::Result<Self> where Self: Sized { data.set_position(0); let len= data.get_le::<i32>()? as usize; let mut vec=Vec::with_capacity(len); for _ in 0..len { vec.push(T::get_le(data)?); } Ok(vec) } } impl ReadFrom for Vec<u8>{ fn readfrom(data: &mut Data) -> io::Result<Self> where Self: Sized { Ok(data.buf.clone()) } } impl ReadFrom for Data{ fn readfrom(data: &mut Data) -> io::Result<Self> where Self: Sized { data.set_position(0); Ok(data.clone()) } } pub trait ReadAs<T>{ fn read_as(&mut self)->io::Result<T>; } impl <T:ReadFrom> ReadAs<T> for Data{ #[inline] fn read_as(&mut self) -> io::Result<T> { T::readfrom(self) } }