11use std:: io:: Cursor ;
2+ use std:: num:: NonZeroU32 ;
23
34use crate :: rust:: cursor:: IncrementCursor ;
45use crate :: rust:: integer_compression:: { bitpacking, helpers} ;
56use crate :: rust:: { FastPForResult , Integer , Skippable } ;
67use bytes:: { Buf as _, BufMut as _, BytesMut } ;
78
89/// Block size constant for 256 integers per block
9- pub const BLOCK_SIZE_256 : u32 = 256 ;
10+ pub const BLOCK_SIZE_256 : NonZeroU32 = NonZeroU32 :: new ( 256 ) . unwrap ( ) ;
1011
1112/// Block size constant for 128 integers per block
12- pub const BLOCK_SIZE_128 : u32 = 128 ;
13+ pub const BLOCK_SIZE_128 : NonZeroU32 = NonZeroU32 :: new ( 128 ) . unwrap ( ) ;
1314
1415/// Overhead cost (in bits) for storing each exception's position in the block
1516const OVERHEAD_OF_EACH_EXCEPT : u32 = 8 ;
1617
1718/// Default page size in number of integers
18- pub const DEFAULT_PAGE_SIZE : u32 = 65536 ;
19+ pub const DEFAULT_PAGE_SIZE : NonZeroU32 = NonZeroU32 :: new ( 65536 ) . unwrap ( ) ;
1920
2021/// Fast Patched Frame-of-Reference ([`FastPFOR`](https://github.com/lemire/FastPFor)) integer compression codec.
2122///
@@ -74,7 +75,7 @@ impl Skippable for FastPFOR {
7475 output_offset : & mut Cursor < u32 > ,
7576 num : u32 ,
7677 ) -> FastPForResult < ( ) > {
77- if inlength == 0 && self . block_size == BLOCK_SIZE_128 {
78+ if inlength == 0 && self . block_size == BLOCK_SIZE_128 . get ( ) {
7879 // Return early if there is no data to uncompress and block size is 128
7980 return Ok ( ( ) ) ;
8081 }
@@ -143,7 +144,9 @@ impl FastPFOR {
143144 /// Creates codec with specified page and block sizes.
144145 ///
145146 /// Pre-allocates buffers for metadata and exception storage.
146- pub fn new ( page_size : u32 , block_size : u32 ) -> FastPFOR {
147+ pub fn new ( page_size : NonZeroU32 , block_size : NonZeroU32 ) -> FastPFOR {
148+ let page_size = page_size. get ( ) ;
149+ let block_size = block_size. get ( ) ;
147150 FastPFOR {
148151 page_size,
149152 block_size,
@@ -453,7 +456,7 @@ mod tests {
453456 fn fastpfor_test ( ) {
454457 let mut codec1 = FastPFOR :: default ( ) ;
455458 let mut codec2 = FastPFOR :: default ( ) ;
456- let mut data = vec ! [ 0u32 ; BLOCK_SIZE_256 as usize ] ;
459+ let mut data = vec ! [ 0u32 ; BLOCK_SIZE_256 . get ( ) as usize ] ;
457460 data[ 126 ] = -1i32 as u32 ;
458461 let mut out_buf = vec ! [ 0 ; data. len( ) * 4 ] ;
459462 let mut input_offset = Cursor :: new ( 0 ) ;
@@ -483,7 +486,9 @@ mod tests {
483486 . unwrap ( ) ;
484487 let answer = out_buf_uncomp[ ..output_offset. position ( ) as usize ] . to_vec ( ) ;
485488
486- for k in 0 ..BLOCK_SIZE_256 {
489+ assert_eq ! ( answer. len( ) , BLOCK_SIZE_256 . get( ) as usize ) ;
490+ assert_eq ! ( data. len( ) , BLOCK_SIZE_256 . get( ) as usize ) ;
491+ for k in 0 ..BLOCK_SIZE_256 . get ( ) {
487492 assert_eq ! ( answer[ k as usize ] , data[ k as usize ] , "bug in {k}" ) ;
488493 }
489494 }
@@ -492,10 +497,7 @@ mod tests {
492497 fn fastpfor_test_128 ( ) {
493498 let mut codec1 = FastPFOR :: new ( DEFAULT_PAGE_SIZE , BLOCK_SIZE_128 ) ;
494499 let mut codec2 = FastPFOR :: new ( DEFAULT_PAGE_SIZE , BLOCK_SIZE_128 ) ;
495- let mut data = vec ! [ 0 ; BLOCK_SIZE_128 as usize ] ;
496- for i in 0 ..BLOCK_SIZE_128 {
497- data[ i as usize ] = 0 ;
498- }
500+ let mut data = vec ! [ 0 ; BLOCK_SIZE_128 . get( ) as usize ] ;
499501 data[ 126 ] = -1i32 as u32 ;
500502 let mut out_buf = vec ! [ 0 ; data. len( ) * 4 ] ;
501503 let mut input_offset = Cursor :: new ( 0 ) ;
@@ -525,7 +527,9 @@ mod tests {
525527 . unwrap ( ) ;
526528 let answer = out_buf_uncomp[ ..output_offset. position ( ) as usize ] . to_vec ( ) ;
527529
528- for k in 0 ..BLOCK_SIZE_128 {
530+ assert_eq ! ( answer. len( ) , BLOCK_SIZE_128 . get( ) as usize ) ;
531+ assert_eq ! ( data. len( ) , BLOCK_SIZE_128 . get( ) as usize ) ;
532+ for k in 0 ..BLOCK_SIZE_128 . get ( ) {
529533 assert_eq ! ( answer[ k as usize ] , data[ k as usize ] , "bug in {k}" ) ;
530534 }
531535 }
0 commit comments