11use core:: ptr;
22use std:: sync:: { Condvar , Mutex } ;
33
4- use libc:: { calloc , free, malloc, memcpy, size_t} ;
4+ use libc:: { free, malloc, memcpy, size_t} ;
55
66use crate :: lib:: common:: error_private:: { ERR_isError , Error } ;
77use crate :: lib:: common:: pool:: { POOL_add , POOL_create , POOL_free } ;
@@ -107,10 +107,11 @@ unsafe fn FASTCOVER_selectSegment(
107107 begin : u32 ,
108108 end : u32 ,
109109 parameters : ZDICT_cover_params_t ,
110- segmentFreqs : * mut u16 ,
110+ segmentFreqs : & mut [ u16 ] ,
111111) -> COVER_segment_t {
112112 let k = parameters. k ;
113113 let d = parameters. d ;
114+ let samples = ( * ctx) . samples ;
114115 let f = ( * ctx) . f ;
115116 let dmersInK = k. wrapping_sub ( d) . wrapping_add ( 1 ) ;
116117 let mut bestSegment = {
@@ -134,22 +135,21 @@ unsafe fn FASTCOVER_selectSegment(
134135 f,
135136 d,
136137 ) ;
137- if * segmentFreqs. add ( idx) as core :: ffi :: c_int == 0 {
138+ if segmentFreqs[ idx] == 0 {
138139 activeSegment. score = ( activeSegment. score ) . wrapping_add ( freqs[ idx] ) ;
139140 }
140141 activeSegment. end = ( activeSegment. end ) . wrapping_add ( 1 ) ;
141- let fresh0 = & mut ( * segmentFreqs. add ( idx) ) ;
142- * fresh0 = ( * fresh0 as core:: ffi:: c_int + 1 ) as u16 ;
142+ segmentFreqs[ idx] += 1 ;
143143 if ( activeSegment. end ) . wrapping_sub ( activeSegment. begin ) == dmersInK. wrapping_add ( 1 ) {
144- let delIndex = FASTCOVER_hashPtrToIndex (
145- ( * ctx) . samples . as_ptr ( ) . offset ( activeSegment. begin as isize )
146- as * const core:: ffi:: c_void ,
144+ let delIndex = FASTCOVER_hashPtrToIndex_array (
145+ samples[ activeSegment. begin as usize ..] [ ..8 ]
146+ . try_into ( )
147+ . unwrap ( ) ,
147148 f,
148149 d,
149150 ) ;
150- let fresh1 = & mut ( * segmentFreqs. add ( delIndex) ) ;
151- * fresh1 = ( * fresh1 as core:: ffi:: c_int - 1 ) as u16 ;
152- if * segmentFreqs. add ( delIndex) as core:: ffi:: c_int == 0 {
151+ segmentFreqs[ delIndex] -= 1 ;
152+ if segmentFreqs[ delIndex] == 0 {
153153 activeSegment. score = ( activeSegment. score ) . wrapping_sub ( freqs[ delIndex] ) ;
154154 }
155155 activeSegment. begin = ( activeSegment. begin ) . wrapping_add ( 1 ) ;
@@ -159,24 +159,21 @@ unsafe fn FASTCOVER_selectSegment(
159159 }
160160 }
161161 while activeSegment. begin < end {
162- let delIndex_0 = FASTCOVER_hashPtrToIndex (
163- ( * ctx) . samples . as_ptr ( ) . offset ( activeSegment. begin as isize )
164- as * const core:: ffi:: c_void ,
162+ let delIndex_0 = FASTCOVER_hashPtrToIndex_array (
163+ samples[ activeSegment. begin as usize ..] [ ..8 ]
164+ . try_into ( )
165+ . unwrap ( ) ,
165166 f,
166167 d,
167168 ) ;
168- let fresh2 = & mut ( * segmentFreqs. add ( delIndex_0) ) ;
169- * fresh2 = ( * fresh2 as core:: ffi:: c_int - 1 ) as u16 ;
170- activeSegment. begin = ( activeSegment. begin ) . wrapping_add ( 1 ) ;
169+ segmentFreqs[ delIndex_0] -= 1 ;
170+ activeSegment. begin += 1 ;
171171 }
172172 let mut pos: u32 = 0 ;
173173 pos = bestSegment. begin ;
174174 while pos != bestSegment. end {
175- let i = FASTCOVER_hashPtrToIndex (
176- ( * ctx) . samples . as_ptr ( ) . offset ( pos as isize ) as * const core:: ffi:: c_void ,
177- f,
178- d,
179- ) ;
175+ let i =
176+ FASTCOVER_hashPtrToIndex_array ( samples[ pos as usize ..] [ ..8 ] . try_into ( ) . unwrap ( ) , f, d) ;
180177 freqs[ i] = 0 ;
181178 pos = pos. wrapping_add ( 1 ) ;
182179 }
@@ -356,7 +353,7 @@ unsafe fn FASTCOVER_buildDictionary(
356353 dictBuffer : * mut core:: ffi:: c_void ,
357354 dictBufferCapacity : size_t ,
358355 parameters : ZDICT_cover_params_t ,
359- segmentFreqs : * mut u16 ,
356+ segmentFreqs : & mut [ u16 ] ,
360357) -> size_t {
361358 let dict = dictBuffer as * mut u8 ;
362359 let mut tail = dictBufferCapacity;
@@ -438,12 +435,12 @@ unsafe fn FASTCOVER_tryParameters(opaque: *mut core::ffi::c_void) {
438435 let parameters = ( * data) . parameters ;
439436 let dictBufferCapacity = ( * data) . dictBufferCapacity ;
440437 let totalCompressedSize = Error :: GENERIC . to_error_code ( ) ;
441- let segmentFreqs = calloc ( ( 1 ) << ( * ctx) . f , :: core :: mem :: size_of :: < u16 > ( ) ) as * mut u16 ;
438+ let mut segmentFreqs: Box < [ u16 ] > = Box :: from ( vec ! [ 0u16 ; 1 << ctx. f ] ) ;
442439 let dict = malloc ( dictBufferCapacity) as * mut u8 ;
443440 let mut selection = COVER_dictSelectionError ( Error :: GENERIC . to_error_code ( ) ) ;
444- let displayLevel = ( * ctx) . displayLevel ;
445- let mut freqs = ( * ctx) . freqs . clone ( ) ;
446- if segmentFreqs . is_null ( ) || dict. is_null ( ) {
441+ let displayLevel = ctx. displayLevel ;
442+ let mut freqs = ctx. freqs . clone ( ) ;
443+ if dict. is_null ( ) {
447444 if displayLevel >= 1 {
448445 eprintln ! ( "Failed to allocate buffers: out of memory" ) ;
449446 }
@@ -454,7 +451,7 @@ unsafe fn FASTCOVER_tryParameters(opaque: *mut core::ffi::c_void) {
454451 dict as * mut core:: ffi:: c_void ,
455452 dictBufferCapacity,
456453 parameters,
457- segmentFreqs,
454+ & mut segmentFreqs,
458455 ) ;
459456 let nbFinalizeSamples =
460457 ( ctx. nbTrainSamples * ctx. accelParams . finalize as size_t / 100 ) as core:: ffi:: c_uint ;
@@ -478,7 +475,7 @@ unsafe fn FASTCOVER_tryParameters(opaque: *mut core::ffi::c_void) {
478475 free ( dict as * mut core:: ffi:: c_void ) ;
479476 COVER_best_finish ( ( * data) . best , parameters, selection) ;
480477 free ( data as * mut core:: ffi:: c_void ) ;
481- free ( segmentFreqs as * mut core :: ffi :: c_void ) ;
478+ drop ( segmentFreqs) ;
482479 COVER_dictSelectionFree ( selection) ;
483480 drop ( freqs) ;
484481}
@@ -603,7 +600,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_fastCover(
603600 if displayLevel >= 2 {
604601 eprintln ! ( "Building dictionary" ) ;
605602 }
606- let segmentFreqs = calloc ( 1 << parameters. f , :: core :: mem :: size_of :: < u16 > ( ) ) as * mut u16 ;
603+ let mut segmentFreqs: Box < [ u16 ] > = Box :: from ( vec ! [ 0u16 ; 1 << parameters. f] ) ;
607604
608605 let mut freqs = core:: mem:: take ( & mut ctx. freqs ) ;
609606 let tail = FASTCOVER_buildDictionary (
@@ -612,7 +609,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_fastCover(
612609 dictBuffer,
613610 dictBufferCapacity,
614611 coverParams,
615- segmentFreqs,
612+ & mut segmentFreqs,
616613 ) ;
617614 ctx. freqs = freqs;
618615
@@ -632,7 +629,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_fastCover(
632629 eprintln ! ( "Constructed dictionary of size {}" , dictionarySize) ;
633630 }
634631 FASTCOVER_ctx_destroy ( & mut ctx) ;
635- free ( segmentFreqs as * mut core :: ffi :: c_void ) ;
632+ drop ( segmentFreqs) ;
636633 dictionarySize
637634}
638635#[ cfg_attr( feature = "export-symbols" , export_name = crate :: prefix!( ZDICT_optimizeTrainFromBuffer_fastCover ) ) ]
0 commit comments