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
use crate::{Data, Reader, Dummy}; use bytes::Buf; use std::hash::Hash; use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::RandomState; use paste::paste; use crate::readfrom::ReadFrom; macro_rules! make_into { ($type:ty) => { impl Into<$type> for Data{ #[inline] fn into(mut self) -> $type { let size=std::mem::size_of::<$type>(); if self.len()<size{ panic!("data len < {}",size) } paste! { self.[<get_ $type _le>]() } } } }; } impl Into<u8> for Data{ #[inline] fn into(mut self) -> u8 { if self.len()==0{ panic!("data len < {}",std::mem::size_of::<u8>()) } self.get_u8() } } impl Into<i8> for Data{ #[inline] fn into(mut self) -> i8 { if self.len()==0{ panic!("data len < {}",std::mem::size_of::<u8>()) } self.get_i8() } } make_into!(i16); make_into!(u16); make_into!(i32); make_into!(u32); make_into!(i64); make_into!(u64); make_into!(i128); make_into!(u128); make_into!(f32); make_into!(f64); impl<T:ReadFrom+Reader+Dummy> Into<Vec<T>> for Data{ fn into(mut self) -> Vec<T> { self.set_position(0); let len= self.get_le::<i32>().expect("into vec len error:") as usize; let mut vec=Vec::with_capacity(len); for _ in 0..len { vec.push(T::get_le(&mut self).expect("into vec len error:")); } vec } } impl Into<Vec<u8>> for Data{ fn into(self) -> Vec<u8> { self.buf } } impl Into<String> for Data{ fn into(self) -> String { String::from_utf8_lossy(&self.buf).into() } } impl <K:Reader+Eq+Hash,V:Reader> Into<HashMap<K,V>> for Data{ #[inline] fn into(mut self) -> HashMap<K, V, RandomState> { self.set_position(0); let len= self.get_le::<i32>().expect("into hashmap len error:") as usize; let mut hashmap=HashMap::with_capacity(len); for _ in 0..len{ hashmap.insert(self.get_le::<K>().expect("read hashmap key error:"), self.get_le::<V>().expect("read hashmap value error:")); } hashmap } } impl <K:Reader+Ord,V:Reader> Into<BTreeMap<K,V>> for Data{ #[inline] fn into(mut self) -> BTreeMap<K, V> { self.set_position(0); let len= self.get_le::<i32>().expect("into BTreeMap len error:") as usize; let mut btreemap=BTreeMap::new(); for _ in 0..len{ btreemap.insert(self.get_le::<K>().expect("read BTreeMap key error:"), self.get_le::<V>().expect("read BTreeMap value error:")); } btreemap } }