@@ -440,14 +440,13 @@ impl BitBuffer {
440440 for bit_idx in 0 ..bits_in_first_byte {
441441 let is_set = ( byte & ( 1 << ( start_bit_in_byte + bit_idx) ) ) != 0 ;
442442 f ( bit_pos, is_set) ;
443- bit_pos += 1 ;
444443 }
445444
445+ bit_pos += bits_in_first_byte;
446446 current_byte += 1 ;
447447 }
448448
449- let bits_remaining = total_bits - bit_pos;
450- let complete_bytes = bits_remaining / 8 ;
449+ let complete_bytes = ( total_bits - bit_pos) / 8 ;
451450
452451 // Process complete bytes.
453452 for byte_idx in 0 ..complete_bytes {
@@ -458,87 +457,17 @@ impl BitBuffer {
458457 f ( bit_pos + byte_idx * 8 + bit_idx, is_set) ;
459458 }
460459 }
460+ bit_pos += complete_bytes * 8 ;
461461 current_byte += complete_bytes;
462462
463463 // Handle remaining bits at the end.
464- let remaining_bits = bits_remaining % 8 ;
464+ let remaining_bits = ( total_bits - bit_pos ) % 8 ;
465465 if remaining_bits > 0 {
466- let bit_idx_start = bit_pos + complete_bytes * 8 ;
467466 let byte = unsafe { * buffer_ptr. add ( current_byte) } ;
468467
469468 for bit_idx in 0 ..remaining_bits {
470469 let is_set = ( byte & ( 1 << bit_idx) ) != 0 ;
471- f ( bit_idx_start + bit_idx, is_set) ;
472- }
473- }
474- }
475-
476- /// Iterate through bits in a buffer in reverse.
477- ///
478- /// # Arguments
479- ///
480- /// * `f` - Callback function taking (bit_index, is_set)
481- ///
482- /// # Panics
483- ///
484- /// Panics if the range is outside valid bounds of the buffer.
485- #[ inline]
486- pub fn iter_bits_reverse < F > ( & self , mut f : F )
487- where
488- F : FnMut ( usize , bool ) ,
489- {
490- let total_bits = self . len ;
491- if total_bits == 0 {
492- return ;
493- }
494-
495- let buffer_ptr = self . buffer . as_ptr ( ) ;
496- let offset = self . offset ;
497- let start_byte = offset / 8 ;
498- let start_bit_in_byte = offset % 8 ;
499- let mut bit_pos = total_bits;
500-
501- let bits_in_first_byte = if start_bit_in_byte > 0 {
502- ( 8 - start_bit_in_byte) . min ( total_bits)
503- } else {
504- 0
505- } ;
506-
507- let bits_after_first = total_bits - bits_in_first_byte;
508- let first_byte_offset = if start_bit_in_byte > 0 { 1 } else { 0 } ;
509- let complete_bytes = ( bits_after_first - bits_after_first % 8 ) / 8 ;
510- let trailing_bits = bits_after_first % 8 ;
511-
512- // Handle remaining bit at the end.
513- if trailing_bits > 0 {
514- let byte = unsafe { * buffer_ptr. add ( start_byte + first_byte_offset + complete_bytes) } ;
515-
516- for bit_idx in ( 0 ..trailing_bits) . rev ( ) {
517- bit_pos -= 1 ;
518- let is_set = ( byte & ( 1 << bit_idx) ) != 0 ;
519- f ( bit_pos, is_set) ;
520- }
521- }
522-
523- // Process complete bytes.
524- for byte_idx in ( 0 ..complete_bytes) . rev ( ) {
525- let byte = unsafe { * buffer_ptr. add ( start_byte + first_byte_offset + byte_idx) } ;
526-
527- for bit_idx in ( 0 ..8 ) . rev ( ) {
528- bit_pos -= 1 ;
529- let is_set = ( byte & ( 1 << bit_idx) ) != 0 ;
530- f ( bit_pos, is_set) ;
531- }
532- }
533-
534- // Handle incomplete first byte.
535- if bits_in_first_byte > 0 {
536- let byte = unsafe { * buffer_ptr. add ( start_byte) } ;
537-
538- for bit_idx in ( 0 ..bits_in_first_byte) . rev ( ) {
539- bit_pos -= 1 ;
540- let is_set = ( byte & ( 1 << ( start_bit_in_byte + bit_idx) ) ) != 0 ;
541- f ( bit_pos, is_set) ;
470+ f ( bit_pos + bit_idx, is_set) ;
542471 }
543472 }
544473 }
@@ -657,31 +586,6 @@ mod tests {
657586 }
658587 }
659588
660- #[ rstest]
661- #[ case( 5 ) ]
662- #[ case( 8 ) ]
663- #[ case( 10 ) ]
664- #[ case( 13 ) ]
665- #[ case( 16 ) ]
666- #[ case( 23 ) ]
667- #[ case( 100 ) ]
668- fn test_iter_bits_reverse ( #[ case] len : usize ) {
669- let buf = BitBuffer :: collect_bool ( len, |i| i % 2 == 0 ) ;
670-
671- let mut collected = Vec :: new ( ) ;
672- buf. iter_bits_reverse ( |idx, is_set| {
673- collected. push ( ( idx, is_set) ) ;
674- } ) ;
675-
676- assert_eq ! ( collected. len( ) , len) ;
677-
678- for ( i, ( idx, is_set) ) in collected. iter ( ) . enumerate ( ) {
679- let expected_idx = len - 1 - i;
680- assert_eq ! ( * idx, expected_idx) ;
681- assert_eq ! ( * is_set, expected_idx % 2 == 0 ) ;
682- }
683- }
684-
685589 #[ rstest]
686590 #[ case( 3 , 5 ) ]
687591 #[ case( 3 , 8 ) ]
@@ -704,29 +608,4 @@ mod tests {
704608 assert_eq ! ( is_set, ( offset + idx) % 2 == 0 ) ;
705609 }
706610 }
707-
708- #[ rstest]
709- #[ case( 3 , 5 ) ]
710- #[ case( 3 , 8 ) ]
711- #[ case( 5 , 10 ) ]
712- #[ case( 2 , 16 ) ]
713- fn test_iter_bits_reverse_with_offset ( #[ case] offset : usize , #[ case] len : usize ) {
714- let total_bits = offset + len;
715- let buf = BitBuffer :: collect_bool ( total_bits, |i| i % 2 == 0 ) ;
716- let buf_with_offset = BitBuffer :: new_with_offset ( buf. inner ( ) . clone ( ) , len, offset) ;
717-
718- let mut collected = Vec :: new ( ) ;
719- buf_with_offset. iter_bits_reverse ( |idx, is_set| {
720- collected. push ( ( idx, is_set) ) ;
721- } ) ;
722-
723- assert_eq ! ( collected. len( ) , len) ;
724-
725- for ( i, ( idx, is_set) ) in collected. iter ( ) . enumerate ( ) {
726- let expected_idx = len - 1 - i;
727- assert_eq ! ( * idx, expected_idx) ;
728- // The bits should match the original buffer at positions offset + expected_idx
729- assert_eq ! ( * is_set, ( offset + expected_idx) % 2 == 0 ) ;
730- }
731- }
732611}
0 commit comments