@@ -590,6 +590,39 @@ fn test_offset_calculation() {
590590}
591591
592592impl < K , V > RawTable < K , V > {
593+ pub fn stats ( & self , stats : & mut Vec < ( u64 , u64 ) > ) {
594+ if stats. is_empty ( ) {
595+ * stats = vec ! [ ( 0 , 0 ) ; 2000 ] ;
596+ }
597+ // stats.clear();
598+ // stats.extend(iter::repeat((0, 0)).take(1000));
599+ let mut iter = self . raw_buckets ( ) ;
600+ let first_hash = iter. raw . hash ;
601+ let mut latest_hash = iter. raw . hash ;
602+ let mut chunk_info = vec ! [ ] ;
603+ while let Some ( raw) = iter. next ( ) {
604+ let num_empty = ( raw. hash as usize - latest_hash as usize ) / size_of :: < u64 > ( ) ;
605+ let idx = ( raw. hash as usize - first_hash as usize ) / size_of :: < u64 > ( ) ;
606+ stats[ 0 ] . 0 += num_empty as u64 ;
607+ stats[ 0 ] . 1 += num_empty as u64 ;
608+ if num_empty > 0 {
609+ for n in chunk_info. drain ( ..) {
610+ stats[ n as usize ] . 1 += 1 ;
611+ }
612+ } else {
613+ for n in chunk_info. iter_mut ( ) {
614+ * n += 1 ;
615+ }
616+ }
617+ chunk_info. push ( 0 ) ;
618+ let ib = unsafe {
619+ ( * raw. hash ) as usize & ( self . capacity - 1 )
620+ } ;
621+ let displacement = ( idx as isize - ib as isize ) as usize & ( self . capacity - 1 ) ;
622+ stats[ displacement] . 0 += 1 ;
623+ latest_hash = iter. raw . hash ;
624+ }
625+ }
593626 /// Does not initialize the buckets. The caller should ensure they,
594627 /// at the very least, set every hash to EMPTY_BUCKET.
595628 unsafe fn new_uninitialized ( capacity : usize ) -> RawTable < K , V > {
0 commit comments