@@ -479,6 +479,11 @@ impl<T: Idx> ChunkedBitSet<T> {
479479 }
480480 }
481481
482+ #[ inline]
483+ pub fn iter ( & self ) -> ChunkedBitIter < ' _ , T > {
484+ ChunkedBitIter :: new ( self )
485+ }
486+
482487 /// Insert `elem`. Returns whether the set has changed.
483488 pub fn insert ( & mut self , elem : T ) -> bool {
484489 assert ! ( elem. index( ) < self . domain_size) ;
@@ -697,6 +702,49 @@ impl<T> Clone for ChunkedBitSet<T> {
697702 }
698703}
699704
705+ pub struct ChunkedBitIter < ' a , T : Idx > {
706+ index : usize ,
707+ bitset : & ' a ChunkedBitSet < T > ,
708+ }
709+
710+ impl < ' a , T : Idx > ChunkedBitIter < ' a , T > {
711+ #[ inline]
712+ fn new ( bitset : & ' a ChunkedBitSet < T > ) -> ChunkedBitIter < ' a , T > {
713+ ChunkedBitIter { index : 0 , bitset }
714+ }
715+ }
716+
717+ impl < ' a , T : Idx > Iterator for ChunkedBitIter < ' a , T > {
718+ type Item = T ;
719+ fn next ( & mut self ) -> Option < T > {
720+ while self . index < self . bitset . domain_size ( ) {
721+ let elem = T :: new ( self . index ) ;
722+ let chunk = & self . bitset . chunks [ chunk_index ( elem) ] ;
723+ match & chunk {
724+ Zeros ( chunk_domain_size) => {
725+ self . index += * chunk_domain_size as usize ;
726+ }
727+ Ones ( _chunk_domain_size) => {
728+ self . index += 1 ;
729+ return Some ( elem) ;
730+ }
731+ Mixed ( _chunk_domain_size, _, words) => loop {
732+ let elem = T :: new ( self . index ) ;
733+ self . index += 1 ;
734+ let ( word_index, mask) = chunk_word_index_and_mask ( elem) ;
735+ if ( words[ word_index] & mask) != 0 {
736+ return Some ( elem) ;
737+ }
738+ if self . index % CHUNK_BITS == 0 {
739+ break ;
740+ }
741+ } ,
742+ }
743+ }
744+ None
745+ }
746+ }
747+
700748impl Chunk {
701749 #[ cfg( test) ]
702750 fn assert_valid ( & self ) {
0 commit comments