@@ -37,8 +37,9 @@ pub struct FastPFOR {
3737 /// Frequency count for each bit width:
3838 /// freqs[0..32] = count of values needing exactly i bits
3939 pub freqs : Vec < u32 > ,
40- /// [`optimal_bits`, `exception_count`, `max_bits`]
41- pub bestbbestcexceptmaxb : [ u32 ; 3 ] ,
40+ pub optimal_bits : u32 ,
41+ pub exception_count : u32 ,
42+ pub max_bits : u32 ,
4243 /// Integers per block (128 or 256)
4344 pub block_size : u32 ,
4445}
@@ -149,7 +150,9 @@ impl FastPFOR {
149150 data_to_be_packed : vec ! [ vec![ 0 ; page_size as usize / 32 * 4 ] ; 33 ] ,
150151 data_pointers : vec ! [ 0 ; 33 ] ,
151152 freqs : vec ! [ 0 ; 33 ] ,
152- bestbbestcexceptmaxb : [ 0 ; 3 ] ,
153+ optimal_bits : 0 ,
154+ exception_count : 0 ,
155+ max_bits : 0 ,
153156 }
154157 }
155158
@@ -184,25 +187,23 @@ impl FastPFOR {
184187 let final_input_offset = tmp_input_offset + thissize - self . block_size ;
185188 while tmp_input_offset <= final_input_offset {
186189 self . best_b_from_data ( input, tmp_input_offset) ;
187- let tmp_best_b = self . bestbbestcexceptmaxb [ 0 ] ;
188- self . bytes_container . put ( self . bestbbestcexceptmaxb [ 0 ] as u8 ) ;
189- self . bytes_container . put ( self . bestbbestcexceptmaxb [ 1 ] as u8 ) ;
190- if self . bestbbestcexceptmaxb [ 1 ] > 0 {
191- self . bytes_container . put ( self . bestbbestcexceptmaxb [ 2 ] as u8 ) ;
192- let index = self . bestbbestcexceptmaxb [ 2 ] - self . bestbbestcexceptmaxb [ 0 ] ;
193- if self . data_pointers [ index as usize ] + self . bestbbestcexceptmaxb [ 1 ] as usize
190+ let tmp_best_b = self . optimal_bits ;
191+ self . bytes_container . put ( self . optimal_bits as u8 ) ;
192+ self . bytes_container . put ( self . exception_count as u8 ) ;
193+ if self . exception_count > 0 {
194+ self . bytes_container . put ( self . max_bits as u8 ) ;
195+ let index = self . max_bits - self . optimal_bits ;
196+ if self . data_pointers [ index as usize ] + self . exception_count as usize
194197 >= self . data_to_be_packed [ index as usize ] . len ( )
195198 {
196199 let mut new_size = 2
197- * ( self . data_pointers [ index as usize ]
198- + self . bestbbestcexceptmaxb [ 1 ] as usize )
200+ * ( self . data_pointers [ index as usize ] + self . exception_count as usize )
199201 as u32 ;
200202 new_size = helpers:: greatest_multiple ( new_size + 31 , 32 ) ;
201203 self . data_to_be_packed [ index as usize ] . resize ( new_size as usize , 0 ) ;
202204 }
203205 for k in 0 ..self . block_size {
204- if ( input[ ( k + tmp_input_offset) as usize ] >> self . bestbbestcexceptmaxb [ 0 ] ) != 0
205- {
206+ if ( input[ ( k + tmp_input_offset) as usize ] >> self . optimal_bits ) != 0 {
206207 self . bytes_container . put ( k as u8 ) ;
207208 self . data_to_be_packed [ index as usize ]
208209 [ self . data_pointers [ index as usize ] ] =
@@ -287,32 +288,32 @@ impl FastPFOR {
287288 self . freqs [ helpers:: bits ( input[ k as usize ] ) ] += 1 ;
288289 }
289290
290- self . bestbbestcexceptmaxb [ 0 ] = 32 ;
291- while self . freqs [ self . bestbbestcexceptmaxb [ 0 ] as usize ] == 0 {
292- self . bestbbestcexceptmaxb [ 0 ] -= 1 ;
291+ self . optimal_bits = 32 ;
292+ while self . freqs [ self . optimal_bits as usize ] == 0 {
293+ self . optimal_bits -= 1 ;
293294 }
294- self . bestbbestcexceptmaxb [ 2 ] = self . bestbbestcexceptmaxb [ 0 ] ;
295+ self . max_bits = self . optimal_bits ;
295296
296- let mut bestcost = self . bestbbestcexceptmaxb [ 0 ] * self . block_size ;
297+ let mut bestcost = self . optimal_bits * self . block_size ;
297298 let mut cexcept: u32 = 0 ;
298- self . bestbbestcexceptmaxb [ 1 ] = cexcept;
299+ self . exception_count = cexcept;
299300
300- for b in ( 0 ..self . bestbbestcexceptmaxb [ 0 ] ) . rev ( ) {
301+ for b in ( 0 ..self . optimal_bits ) . rev ( ) {
301302 cexcept += self . freqs [ b as usize + 1 ] ;
302303 if cexcept == self . block_size {
303304 break ;
304305 }
305306 let mut thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT
306- + cexcept * ( self . bestbbestcexceptmaxb [ 2 ] - b)
307+ + cexcept * ( self . max_bits - b)
307308 + b * self . block_size
308309 + 8 ;
309- if self . bestbbestcexceptmaxb [ 2 ] - b == 1 {
310+ if self . max_bits - b == 1 {
310311 thiscost -= cexcept;
311312 }
312313 if thiscost < bestcost {
313314 bestcost = thiscost;
314- self . bestbbestcexceptmaxb [ 0 ] = b;
315- self . bestbbestcexceptmaxb [ 1 ] = cexcept;
315+ self . optimal_bits = b;
316+ self . exception_count = cexcept;
316317 }
317318 }
318319 }
0 commit comments