@@ -2,7 +2,8 @@ use std::io::Cursor;
22
33use crate :: rust:: cursor:: IncrementCursor ;
44use crate :: rust:: integer_compression:: { bitpacking, helpers} ;
5- use crate :: rust:: { bytebuffer, FastPForResult , Integer , Skippable } ;
5+ use crate :: rust:: { FastPForResult , Integer , Skippable } ;
6+ use bytes:: { Buf as _, BufMut as _, BytesMut } ;
67
78/// Block size constant for 256 integers per block
89pub const BLOCK_SIZE_256 : u32 = 256 ;
@@ -29,7 +30,7 @@ pub struct FastPFOR {
2930 /// Exception values indexed by bit width difference
3031 pub data_to_be_packed : Vec < Vec < u32 > > ,
3132 /// Metadata buffer for encoding/decoding
32- pub bytes_container : bytebuffer :: ByteBuffer ,
33+ pub bytes_container : BytesMut ,
3334 /// Maximum integers per page
3435 pub page_size : u32 ,
3536 /// Position trackers for exception arrays
@@ -146,7 +147,9 @@ impl FastPFOR {
146147 FastPFOR {
147148 page_size,
148149 block_size,
149- bytes_container : bytebuffer:: ByteBuffer :: new ( 3 * page_size / block_size + page_size) ,
150+ bytes_container : BytesMut :: with_capacity (
151+ ( 3 * page_size / block_size + page_size) as usize ,
152+ ) ,
150153 data_to_be_packed : vec ! [ vec![ 0 ; page_size as usize / 32 * 4 ] ; 33 ] ,
151154 data_pointers : vec ! [ 0 ; 33 ] ,
152155 freqs : vec ! [ 0 ; 33 ] ,
@@ -188,10 +191,10 @@ impl FastPFOR {
188191 while tmp_input_offset <= final_input_offset {
189192 self . best_b_from_data ( input, tmp_input_offset) ;
190193 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 ) ;
194+ self . bytes_container . put_u8 ( self . optimal_bits as u8 ) ;
195+ self . bytes_container . put_u8 ( self . exception_count as u8 ) ;
193196 if self . exception_count > 0 {
194- self . bytes_container . put ( self . max_bits as u8 ) ;
197+ self . bytes_container . put_u8 ( self . max_bits as u8 ) ;
195198 let index = self . max_bits - self . optimal_bits ;
196199 if self . data_pointers [ index as usize ] + self . exception_count as usize
197200 >= self . data_to_be_packed [ index as usize ] . len ( )
@@ -204,7 +207,7 @@ impl FastPFOR {
204207 }
205208 for k in 0 ..self . block_size {
206209 if ( input[ ( k + tmp_input_offset) as usize ] >> self . optimal_bits ) != 0 {
207- self . bytes_container . put ( k as u8 ) ;
210+ self . bytes_container . put_u8 ( k as u8 ) ;
208211 self . data_to_be_packed [ index as usize ]
209212 [ self . data_pointers [ index as usize ] ] =
210213 input[ ( k + tmp_input_offset) as usize ] >> tmp_best_b;
@@ -226,22 +229,23 @@ impl FastPFOR {
226229 }
227230 input_offset. set_position ( u64:: from ( tmp_input_offset) ) ;
228231 output[ header_pos] = tmp_output_offset - header_pos as u32 ;
229- let byte_size = self . bytes_container . position ( ) ;
230- while ( self . bytes_container . position ( ) & 3 ) != 0 {
231- self . bytes_container . put ( 0 ) ;
232+ let byte_size = self . bytes_container . len ( ) ;
233+ while ( self . bytes_container . len ( ) & 3 ) != 0 {
234+ self . bytes_container . put_u8 ( 0 ) ;
232235 }
233236 // Output should have 3 position as 4
234- output[ tmp_output_offset as usize ] = byte_size;
237+ output[ tmp_output_offset as usize ] = byte_size as u32 ;
235238 tmp_output_offset += 1 ;
236- let how_many_ints = self . bytes_container . position ( ) / 4 ;
237- self . bytes_container . flip ( ) ;
238-
239- self . bytes_container . as_int_buffer ( ) . get (
240- output,
241- tmp_output_offset as usize ,
242- how_many_ints as usize ,
243- ) ;
244- tmp_output_offset += how_many_ints;
239+ let how_many_ints = self . bytes_container . len ( ) / 4 ;
240+
241+ for it in output
242+ . iter_mut ( )
243+ . skip ( tmp_output_offset as usize )
244+ . take ( how_many_ints)
245+ {
246+ * it = self . bytes_container . get_u32_le ( ) ;
247+ }
248+ tmp_output_offset += how_many_ints as u32 ;
245249 let mut bitmap = 0 ;
246250 for k in 2 ..=32 {
247251 if self . data_pointers [ k] != 0 {
@@ -343,10 +347,9 @@ impl FastPFOR {
343347 inexcept += 1 ;
344348 self . bytes_container . clear ( ) ;
345349 let length = bytesize. div_ceil ( 4 ) ;
346- self . bytes_container . buffer =
347- self . bytes_container
348- . as_int_buffer ( )
349- . put ( input, inexcept as usize , length) ;
350+ for i in inexcept..inexcept + length {
351+ self . bytes_container . put_u32_le ( input[ i as usize ] ) ;
352+ }
350353 inexcept += length;
351354
352355 let bitmap = input[ inexcept as usize ] ;
@@ -405,8 +408,8 @@ impl FastPFOR {
405408
406409 let run_end = thissize / self . block_size ;
407410 for _ in 0 ..run_end {
408- let b = u32:: from ( self . bytes_container . get ( ) ) ;
409- let cexcept = self . bytes_container . get ( ) ;
411+ let b = u32:: from ( self . bytes_container . get_u8 ( ) ) ;
412+ let cexcept = self . bytes_container . get_u8 ( ) ;
410413 for k in ( 0 ..self . block_size ) . step_by ( 32 ) {
411414 bitpacking:: fast_unpack (
412415 input,
@@ -418,16 +421,16 @@ impl FastPFOR {
418421 tmp_input_offset += b;
419422 }
420423 if cexcept > 0 {
421- let maxbits = u32:: from ( self . bytes_container . get ( ) ) ;
424+ let maxbits = u32:: from ( self . bytes_container . get_u8 ( ) ) ;
422425 let index = maxbits - b;
423426 if index == 1 {
424427 for _ in 0 ..cexcept {
425- let pos = self . bytes_container . get ( ) ;
428+ let pos = self . bytes_container . get_u8 ( ) ;
426429 output[ pos as usize + tmp_output_offset as usize ] |= 1 << b;
427430 }
428431 } else {
429432 for _ in 0 ..cexcept {
430- let pos = self . bytes_container . get ( ) ;
433+ let pos = self . bytes_container . get_u8 ( ) ;
431434 let except_value = self . data_to_be_packed [ index as usize ]
432435 [ self . data_pointers [ index as usize ] ] ;
433436 output[ pos as usize + tmp_output_offset as usize ] |= except_value << b;
0 commit comments