@@ -303,40 +303,48 @@ type __compar_d_fn_t = unsafe extern "C" fn(
303303 * const core:: ffi:: c_void ,
304304) -> core:: ffi:: c_int ;
305305
306- unsafe extern "C" fn stableSort ( ctx : & mut COVER_ctx_t ) {
306+ fn stableSort ( ctx : & mut COVER_ctx_t ) {
307307 let compare_fn = if ctx. d <= 8 {
308308 COVER_strict_cmp8 as __compar_d_fn_t
309309 } else {
310310 COVER_strict_cmp as __compar_d_fn_t
311311 } ;
312312
313+ debug_assert_eq ! ( ctx. suffixSize, ctx. suffix. len( ) ) ;
314+
313315 crate :: cfg_select! {
314316 all( not( miri) , target_vendor = "apple" ) => {
315- qsort_r(
316- ctx. suffix. as_mut_ptr( ) as * mut core:: ffi:: c_void,
317- ctx. suffixSize,
318- :: core:: mem:: size_of:: <u32 >( ) ,
319- & raw mut * ctx as * mut core:: ffi:: c_void,
320- compare_fn,
321- ) ;
317+ unsafe {
318+ qsort_r(
319+ ctx. suffix. as_mut_ptr( ) as * mut core:: ffi:: c_void,
320+ ctx. suffix. len( ) ,
321+ :: core:: mem:: size_of:: <u32 >( ) ,
322+ & raw mut * ctx as * mut core:: ffi:: c_void,
323+ compare_fn,
324+ ) ;
325+ }
322326 }
323327 all( not( miri) , windows) => {
324- qsort_s(
325- ctx. suffix. as_mut_ptr( ) as * mut core:: ffi:: c_void,
326- ctx. suffixSize,
327- :: core:: mem:: size_of:: <u32 >( ) ,
328- compare_fn,
329- & raw mut * ctx as * mut core:: ffi:: c_void,
330- ) ;
328+ unsafe {
329+ qsort_s(
330+ ctx. suffix. as_mut_ptr( ) as * mut core:: ffi:: c_void,
331+ ctx. suffix. len( ) ,
332+ :: core:: mem:: size_of:: <u32 >( ) ,
333+ compare_fn,
334+ & raw mut * ctx as * mut core:: ffi:: c_void,
335+ ) ;
336+ }
331337 }
332338 all( not( miri) , unix) => {
333- qsort_r(
334- ctx. suffix. as_mut_ptr( ) as * mut core:: ffi:: c_void,
335- ctx. suffixSize,
336- :: core:: mem:: size_of:: <u32 >( ) ,
337- compare_fn,
338- & raw mut * ctx as * mut core:: ffi:: c_void,
339- ) ;
339+ unsafe {
340+ qsort_r(
341+ ctx. suffix. as_mut_ptr( ) as * mut core:: ffi:: c_void,
342+ ctx. suffix. len( ) ,
343+ :: core:: mem:: size_of:: <u32 >( ) ,
344+ compare_fn,
345+ & raw mut * ctx as * mut core:: ffi:: c_void,
346+ ) ;
347+ }
340348 }
341349 _ => {
342350 ctx. suffix. sort_by( |lp, rp| {
@@ -505,26 +513,16 @@ unsafe fn COVER_ctx_destroy(ctx: &mut COVER_ctx_t) {
505513 drop ( core:: mem:: take ( & mut ctx. offsets ) ) ;
506514}
507515
508- unsafe fn COVER_ctx_init (
509- ctx : & mut COVER_ctx_t ,
510- samplesBuffer : * const core :: ffi :: c_void ,
511- samplesSizes : * const size_t ,
516+ fn COVER_ctx_init < ' a > (
517+ ctx : & ' _ mut COVER_ctx_t < ' a > ,
518+ samples : & ' a [ u8 ] ,
519+ samplesSizes : & ' a [ size_t ] ,
512520 nbSamples : core:: ffi:: c_uint ,
513521 d : core:: ffi:: c_uint ,
514522 splitPoint : core:: ffi:: c_double ,
515523 displayLevel : core:: ffi:: c_int ,
516524) -> size_t {
517- let samplesSizes = if samplesSizes. is_null ( ) || nbSamples == 0 {
518- & [ ]
519- } else {
520- core:: slice:: from_raw_parts ( samplesSizes, nbSamples as usize )
521- } ;
522- let totalSamplesSize = samplesSizes. iter ( ) . sum :: < usize > ( ) ;
523- let samples = if samplesBuffer. is_null ( ) || totalSamplesSize == 0 {
524- & [ ]
525- } else {
526- core:: slice:: from_raw_parts ( samplesBuffer. cast :: < u8 > ( ) , totalSamplesSize)
527- } ;
525+ let totalSamplesSize = samples. len ( ) ;
528526 let nbTrainSamples = if splitPoint < 1.0f64 {
529527 ( nbSamples as core:: ffi:: c_double * splitPoint) as core:: ffi:: c_uint
530528 } else {
@@ -829,9 +827,22 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_cover(
829827 }
830828 return Error :: dstSize_tooSmall. to_error_code ( ) ;
831829 }
830+
831+ let samplesSizes = if samplesSizes. is_null ( ) || nbSamples == 0 {
832+ & [ ]
833+ } else {
834+ core:: slice:: from_raw_parts ( samplesSizes, nbSamples as usize )
835+ } ;
836+ let totalSamplesSize = samplesSizes. iter ( ) . sum :: < usize > ( ) ;
837+ let samples = if samplesBuffer. is_null ( ) || totalSamplesSize == 0 {
838+ & [ ]
839+ } else {
840+ core:: slice:: from_raw_parts ( samplesBuffer. cast :: < u8 > ( ) , totalSamplesSize)
841+ } ;
842+
832843 let initVal = COVER_ctx_init (
833844 & mut ctx,
834- samplesBuffer ,
845+ samples ,
835846 samplesSizes,
836847 nbSamples,
837848 parameters. d ,
@@ -870,7 +881,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_cover(
870881 dict. add ( tail) as * const core:: ffi:: c_void ,
871882 dictBufferCapacity. wrapping_sub ( tail) ,
872883 samplesBuffer,
873- samplesSizes,
884+ samplesSizes. as_ptr ( ) ,
874885 nbSamples,
875886 parameters. zParams ,
876887 ) ;
@@ -1342,9 +1353,22 @@ pub unsafe extern "C" fn ZDICT_optimizeTrainFromBuffer_cover(
13421353 } else {
13431354 displayLevel - 1
13441355 } ;
1356+
1357+ let samplesSizes = if samplesSizes. is_null ( ) || nbSamples == 0 {
1358+ & [ ]
1359+ } else {
1360+ core:: slice:: from_raw_parts ( samplesSizes, nbSamples as usize )
1361+ } ;
1362+ let totalSamplesSize = samplesSizes. iter ( ) . sum :: < usize > ( ) ;
1363+ let samples = if samplesBuffer. is_null ( ) || totalSamplesSize == 0 {
1364+ & [ ]
1365+ } else {
1366+ core:: slice:: from_raw_parts ( samplesBuffer. cast :: < u8 > ( ) , totalSamplesSize)
1367+ } ;
1368+
13451369 let initVal = COVER_ctx_init (
13461370 & mut ctx,
1347- samplesBuffer ,
1371+ samples ,
13481372 samplesSizes,
13491373 nbSamples,
13501374 d,
0 commit comments