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
use { crate::{ Context, Readable, Reader, Writable, Writer }, hashbrown::HashMap, }; use std::hash::{Hash, BuildHasher}; use crate::private::write_length; use std::mem; impl< 'a, C, K, V, S > Readable< 'a, C > for HashMap< K, V, S > where C: Context, K: Readable< 'a, C > + Eq + Hash, V: Readable< 'a, C >, S: BuildHasher + Default { #[inline] fn read_from< R: Reader< 'a, C > >( reader: &mut R ) -> Result< Self, C::Error > { let length = crate::private::read_length( reader )?; reader.read_collection( length ) } #[inline] fn minimum_bytes_needed() -> usize { 4 } } impl< C, K, V, S > Writable< C > for HashMap< K, V, S > where C: Context, K: Writable< C >, V: Writable< C > { #[inline] fn write_to< W: ?Sized + Writer< C > >( &self, writer: &mut W ) -> Result< (), C::Error > { write_length( self.len(), writer )?; writer.write_collection( self.iter() ) } #[inline] fn bytes_needed( &self ) -> Result< usize, C::Error > { unsafe_is_length!( self.len() ); let mut count = mem::size_of::< u32 >(); for (key, value) in self { count += key.bytes_needed()? + value.bytes_needed()?; } Ok( count ) } }