@@ -135,6 +135,38 @@ impl<'de, K: Ord + PagableDeserialize<'de>, V: PagableDeserialize<'de>> PagableD
135135 }
136136}
137137
138+ impl < K : PagableSerialize , V : PagableSerialize , H > PagableSerialize for indexmap:: IndexMap < K , V , H > {
139+ fn pagable_serialize ( & self , serializer : & mut dyn PagableSerializer ) -> crate :: Result < ( ) > {
140+ usize:: serialize ( & self . len ( ) , serializer. serde ( ) ) ?;
141+ for ( k, v) in self {
142+ k. pagable_serialize ( serializer) ?;
143+ v. pagable_serialize ( serializer) ?;
144+ }
145+ Ok ( ( ) )
146+ }
147+ }
148+
149+ impl <
150+ ' de ,
151+ K : std:: hash:: Hash + Eq + PagableDeserialize < ' de > ,
152+ V : PagableDeserialize < ' de > ,
153+ H : std:: default:: Default + std:: hash:: BuildHasher ,
154+ > PagableDeserialize < ' de > for indexmap:: IndexMap < K , V , H >
155+ {
156+ fn pagable_deserialize < D : PagableDeserializer < ' de > + ?Sized > (
157+ deserializer : & mut D ,
158+ ) -> crate :: Result < Self > {
159+ let items = usize:: deserialize ( deserializer. serde ( ) ) ?;
160+ let mut map: indexmap:: IndexMap < K , V , H > = indexmap:: IndexMap :: default ( ) ;
161+ for _ in 0 ..items {
162+ let k = K :: pagable_deserialize ( deserializer) ?;
163+ let v = V :: pagable_deserialize ( deserializer) ?;
164+ map. insert ( k, v) ;
165+ }
166+ Ok ( map)
167+ }
168+ }
169+
138170impl < V : PagableSerialize > PagableSerialize for std:: collections:: BTreeSet < V > {
139171 fn pagable_serialize ( & self , serializer : & mut dyn PagableSerializer ) -> crate :: Result < ( ) > {
140172 usize:: serialize ( & self . len ( ) , serializer. serde ( ) ) ?;
@@ -160,6 +192,31 @@ impl<'de, V: Ord + PagableDeserialize<'de>> PagableDeserialize<'de>
160192 }
161193}
162194
195+ impl < V : PagableSerialize > PagableSerialize for indexmap:: IndexSet < V > {
196+ fn pagable_serialize ( & self , serializer : & mut dyn PagableSerializer ) -> crate :: Result < ( ) > {
197+ usize:: serialize ( & self . len ( ) , serializer. serde ( ) ) ?;
198+ for v in self {
199+ v. pagable_serialize ( serializer) ?;
200+ }
201+ Ok ( ( ) )
202+ }
203+ }
204+ impl < ' de , V : std:: hash:: Hash + Eq + PagableDeserialize < ' de > > PagableDeserialize < ' de >
205+ for indexmap:: IndexSet < V >
206+ {
207+ fn pagable_deserialize < D : PagableDeserializer < ' de > + ?Sized > (
208+ deserializer : & mut D ,
209+ ) -> crate :: Result < Self > {
210+ let items = usize:: deserialize ( deserializer. serde ( ) ) ?;
211+ let mut set = indexmap:: IndexSet :: new ( ) ;
212+ for _ in 0 ..items {
213+ let v = V :: pagable_deserialize ( deserializer) ?;
214+ set. insert ( v) ;
215+ }
216+ Ok ( set)
217+ }
218+ }
219+
163220impl < T : PagableSerialize > PagableSerialize for Vec < T > {
164221 fn pagable_serialize ( & self , serializer : & mut dyn PagableSerializer ) -> crate :: Result < ( ) > {
165222 usize:: serialize ( & self . len ( ) , serializer. serde ( ) ) ?;
@@ -349,4 +406,44 @@ mod tests {
349406 assert_eq ! ( set, restored) ;
350407 Ok ( ( ) )
351408 }
409+
410+ #[ test]
411+ fn test_indexmap_roundtrip ( ) -> crate :: Result < ( ) > {
412+ use indexmap:: IndexMap ;
413+
414+ let mut map: IndexMap < String , i32 > = IndexMap :: new ( ) ;
415+ map. insert ( "one" . to_owned ( ) , 1 ) ;
416+ map. insert ( "two" . to_owned ( ) , 2 ) ;
417+ map. insert ( "three" . to_owned ( ) , 3 ) ;
418+
419+ let mut serializer = TestingSerializer :: new ( ) ;
420+ map. pagable_serialize ( & mut serializer) ?;
421+ let bytes = serializer. finish ( ) ;
422+
423+ let mut deserializer = TestingDeserializer :: new ( & bytes) ;
424+ let restored: IndexMap < String , i32 > = IndexMap :: pagable_deserialize ( & mut deserializer) ?;
425+
426+ assert_eq ! ( map, restored) ;
427+ Ok ( ( ) )
428+ }
429+
430+ #[ test]
431+ fn test_indexset_roundtrip ( ) -> crate :: Result < ( ) > {
432+ use indexmap:: IndexSet ;
433+
434+ let mut set: IndexSet < String > = IndexSet :: new ( ) ;
435+ set. insert ( "one" . to_owned ( ) ) ;
436+ set. insert ( "two" . to_owned ( ) ) ;
437+ set. insert ( "three" . to_owned ( ) ) ;
438+
439+ let mut serializer = TestingSerializer :: new ( ) ;
440+ set. pagable_serialize ( & mut serializer) ?;
441+ let bytes = serializer. finish ( ) ;
442+
443+ let mut deserializer = TestingDeserializer :: new ( & bytes) ;
444+ let restored: IndexSet < String > = IndexSet :: pagable_deserialize ( & mut deserializer) ?;
445+
446+ assert_eq ! ( set, restored) ;
447+ Ok ( ( ) )
448+ }
352449}
0 commit comments