@@ -5,6 +5,13 @@ use std::{
55 marker:: PhantomData ,
66} ;
77
8+ use bincode:: {
9+ Decode , Encode ,
10+ de:: Decoder ,
11+ enc:: Encoder ,
12+ error:: { DecodeError , EncodeError } ,
13+ impl_borrow_decode,
14+ } ;
815use hashbrown:: hash_map:: HashMap ;
916use rustc_hash:: FxHasher ;
1017use serde:: {
@@ -54,7 +61,7 @@ impl<K, V> AutoMap<K, V, BuildHasherDefault<FxHasher>, 0> {
5461 }
5562}
5663
57- impl < K , V , H : BuildHasher , const I : usize > AutoMap < K , V , H , I > {
64+ impl < K , V , H , const I : usize > AutoMap < K , V , H , I > {
5865 /// see [HashMap::with_hasher](https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#method.with_hasher)
5966 pub const fn with_hasher ( ) -> Self {
6067 AutoMap :: List ( SmallVec :: new_const ( ) )
@@ -813,6 +820,56 @@ where
813820 }
814821}
815822
823+ impl < K , V , H , const I : usize > Encode for AutoMap < K , V , H , I >
824+ where
825+ K : Encode ,
826+ V : Encode ,
827+ {
828+ fn encode < E : Encoder > ( & self , encoder : & mut E ) -> Result < ( ) , EncodeError > {
829+ // Encode the length first
830+ self . len ( ) . encode ( encoder) ?;
831+ // Then encode each key-value tuple
832+ for entry in self . iter ( ) {
833+ entry. encode ( encoder) ?;
834+ }
835+ Ok ( ( ) )
836+ }
837+ }
838+
839+ impl < Context , K , V , H , const I : usize > Decode < Context > for AutoMap < K , V , H , I >
840+ where
841+ K : Decode < Context > + Eq + Hash ,
842+ V : Decode < Context > ,
843+ H : BuildHasher + Default ,
844+ {
845+ fn decode < D : Decoder < Context = Context > > ( decoder : & mut D ) -> Result < Self , DecodeError > {
846+ let len = usize:: decode ( decoder) ?;
847+ if len <= MAX_LIST_SIZE {
848+ let mut list = SmallVec :: with_capacity ( len) ;
849+ for _ in 0 ..len {
850+ let entry = <( K , V ) >:: decode ( decoder) ?;
851+ list. push ( entry) ;
852+ }
853+ Ok ( AutoMap :: List ( list) )
854+ } else {
855+ let mut map = HashMap :: with_capacity_and_hasher ( len, H :: default ( ) ) ;
856+ for _ in 0 ..len {
857+ let ( key, value) = <( K , V ) >:: decode ( decoder) ?;
858+ map. insert ( key, value) ;
859+ }
860+ Ok ( AutoMap :: Map ( Box :: new ( map) ) )
861+ }
862+ }
863+ }
864+
865+ impl_borrow_decode ! (
866+ AutoMap <K , V , H , I >,
867+ K : Decode <__Context> + Eq + Hash ,
868+ V : Decode <__Context>,
869+ H : BuildHasher + Default ,
870+ const I : usize ,
871+ ) ;
872+
816873impl < K : Eq + Hash , V : Eq , H : BuildHasher , const I : usize > PartialEq for AutoMap < K , V , H , I > {
817874 fn eq ( & self , other : & Self ) -> bool {
818875 match ( self , other) {
0 commit comments