1- use std:: { collections :: HashMap , marker:: PhantomData } ;
1+ use std:: marker:: PhantomData ;
22
33use crate :: flatbuffers:: containers;
44use containers:: flat_serialize:: { FlatBuilder , FlatMapBuilderOutput , FlatSerialize } ;
@@ -85,17 +85,19 @@ where
8585
8686#[ derive( Default ) ]
8787pub ( crate ) struct FlatMultiMapBuilder < I , V > {
88- map : HashMap < I , Vec < V > > ,
88+ entries : Vec < ( I , V ) > ,
8989}
9090
9191impl < I : Ord + std:: hash:: Hash , V > FlatMultiMapBuilder < I , V > {
92- pub fn from_filter_map ( map : HashMap < I , Vec < V > > ) -> Self {
93- Self { map }
92+ pub fn with_capacity ( capacity : usize ) -> Self {
93+ Self {
94+ entries : Vec :: with_capacity ( capacity) ,
95+ }
9496 }
9597
9698 #[ allow( dead_code) ] // Unused code is allowed during cosmetic filter migration
9799 pub fn insert ( & mut self , key : I , value : V ) {
98- self . map . entry ( key ) . or_default ( ) . push ( value) ;
100+ self . entries . push ( ( key , value) ) ;
99101 }
100102
101103 pub fn finish < ' a , B : FlatBuilder < ' a > > (
@@ -106,17 +108,15 @@ impl<I: Ord + std::hash::Hash, V> FlatMultiMapBuilder<I, V> {
106108 I : FlatSerialize < ' a , B > ,
107109 V : FlatSerialize < ' a , B > ,
108110 {
109- let mut entries: Vec < _ > = value. map . into_iter ( ) . collect ( ) ;
110- entries. sort_unstable_by ( |( a, _) , ( b, _) | a. cmp ( b) ) ;
111+ let mut entries = value. entries ;
112+ entries. sort_by ( |( a, _) , ( b, _) | a. cmp ( b) ) ;
111113 let mut indexes = Vec :: with_capacity ( entries. len ( ) ) ;
112114 let mut values = Vec :: with_capacity ( entries. len ( ) ) ;
113115
114- for ( key, mv ) in entries. into_iter ( ) {
116+ for ( key, value ) in entries {
115117 let index = FlatSerialize :: serialize ( key, builder) ;
116- for value in mv. into_iter ( ) {
117- indexes. push ( index. clone ( ) ) ;
118- values. push ( FlatSerialize :: serialize ( value, builder) ) ;
119- }
118+ indexes. push ( index) ;
119+ values. push ( FlatSerialize :: serialize ( value, builder) ) ;
120120 }
121121
122122 let indexes_vec = builder. raw_builder ( ) . create_vector ( & indexes) ;
0 commit comments