@@ -4,23 +4,23 @@ use super::Bitfield;
44
55/// Iterate over a bitfield.
66#[ derive( Debug ) ]
7- pub struct < b > Iterator {
7+ pub struct Iterator < ' a > {
88 start : usize ,
99 end : usize ,
1010 index_end : usize ,
11- pos : usize,
12- byte : usize ,
13- bitfield : Bitfield ,
11+ pos : Option < usize > ,
12+ byte : u8 ,
13+ bitfield : & ' a mut Bitfield ,
1414}
1515
16- impl Iterator {
16+ impl < ' a > Iterator < ' a > {
1717 /// Create a new instance.
18- pub fn new ( bitfield : & mut Bitfield ) -> Self {
18+ pub fn new ( bitfield : & ' a mut Bitfield ) -> Self {
1919 Self {
2020 start : 0 ,
2121 end : 0 ,
2222 index_end : 0 ,
23- pos : 0 ,
23+ pos : Some ( 0 ) ,
2424 byte : 0 ,
2525 bitfield,
2626 }
@@ -30,33 +30,129 @@ impl Iterator {
3030 pub fn range ( & mut self , start : usize , end : usize ) {
3131 self . start = start;
3232 self . end = end;
33- self . index_end = 2 * ( end as f32 / 32 ) . ceil ( ) ;
33+ self . index_end = 2 * ( ( end + 31 ) / 32 ) ;
3434
35- if self . end > self . bitfield . len ( ) {
35+ if self . end > self . bitfield . length {
3636 self . bitfield . expand ( self . end ) ;
3737 }
3838 }
3939
40- pub fn seek ( & mut self , offset : usize ) {
41- offset += self . start ;
42- if offset < self . start {
43- offset = self . start
40+ /// Seek to `offset`
41+ pub fn seek ( & mut self , mut offset : usize ) -> & mut Self {
42+ offset += self . start ;
43+ // FIXME This is fishy. Offset and start is unsigned, so `offset < self.start` can only
44+ // be true when the previous addition overflows. The overflow would cause a panic, so,
45+ // either the addition should be a wrapping_add, or rather, the original offset should
46+ // be checked to ensure it is less than `self.end - self.start`.
47+ if offset < self . start {
48+ offset = self . start ;
4449 }
4550
46- if offset >= self . end {
47- self . pos = -1
48- return ;
51+ if offset >= self . end {
52+ self . pos = None ;
53+ return self ;
54+ }
55+
56+ let o = offset % 8 ;
57+
58+ let pos = offset / 8 ;
59+ self . pos = Some ( pos) ;
60+
61+ self . byte =
62+ self . bitfield . data . get_byte ( pos) | self . bitfield . masks . data_iterate [ o] ;
63+
64+ self
65+ }
66+
67+ pub fn next ( & mut self ) -> Option < usize > {
68+ let mut pos = self . pos ?;
69+
70+ let mut free = self . bitfield . masks . next_data_0_bit [ self . byte as usize ] ;
71+
72+ while free == -1 {
73+ pos += 1 ;
74+ self . byte = self . bitfield . data . get_byte ( pos) ;
75+ free = self . bitfield . masks . next_data_0_bit [ self . byte as usize ] ;
76+
77+ if free == -1 {
78+ pos = self . skip_ahead ( pos) ?;
79+
80+ self . byte = self . bitfield . data . get_byte ( pos) ;
81+ free = self . bitfield . masks . next_data_0_bit [ self . byte as usize ] ;
82+ }
83+ }
84+ self . pos = Some ( pos) ;
85+
86+ self . byte |= self . bitfield . masks . data_iterate [ free as usize + 1 ] ;
87+
88+ let n = 8 * pos + free as usize ;
89+ if n < self . end {
90+ Some ( n)
91+ } else {
92+ None
93+ }
4994 }
5095
51- let o = offset & 7 ;
96+ pub fn skip_ahead ( & mut self , start : usize ) -> Option < usize > {
97+ let bitfield_index = & self . bitfield . index ;
98+ let tree_end = self . index_end ;
99+ let iter = & mut self . bitfield . iterator ;
100+ let o = start & 3 ;
101+
102+ iter. seek ( 2 * ( start / 4 ) ) ;
52103
53- self . pos = ( offset - o) / 8 ;
54- let left = self . bitfield . data . get_byte ( self . pos ) ;
55- let right = if o == 0 {
56- 0
57- } else {
58- self . bitfield . masks . data_iterate_mask [ o - 1 ]
59- } ;
104+ let mut tree_byte = bitfield_index. get_byte ( iter. index ( ) )
105+ | self . bitfield . masks . index_iterate [ o] ;
106+
107+ while self . bitfield . masks . next_index_0_bit [ tree_byte as usize ] == -1 {
108+ if iter. is_left ( ) {
109+ iter. next ( ) ;
110+ } else {
111+ iter. next ( ) ;
112+ iter. parent ( ) ;
113+ }
114+
115+ if right_span ( iter) >= tree_end {
116+ while right_span ( iter) >= tree_end && is_parent ( iter) {
117+ iter. left_child ( ) ;
118+ }
119+ if right_span ( iter) >= tree_end {
120+ return None ;
121+ }
122+ }
123+
124+ tree_byte = bitfield_index. get_byte ( iter. index ( ) ) ;
125+ }
126+
127+ while iter. factor ( ) > 2 {
128+ if self . bitfield . masks . next_index_0_bit [ tree_byte as usize ] < 2 {
129+ iter. left_child ( ) ;
130+ } else {
131+ iter. right_child ( ) ;
132+ }
133+
134+ tree_byte = bitfield_index. get_byte ( iter. index ( ) ) ;
135+ }
136+
137+ let mut free = self . bitfield . masks . next_index_0_bit [ tree_byte as usize ] ;
138+ if free == -1 {
139+ free = 4 ;
140+ }
141+
142+ let next = iter. index ( ) * 2 + free as usize ;
143+
144+ if next <= start {
145+ Some ( start + 1 )
146+ } else {
147+ Some ( next)
148+ }
149+ }
150+ }
151+
152+ fn right_span ( iter : & flat_tree:: Iterator ) -> usize {
153+ iter. index ( ) + iter. factor ( ) / 2 - 1
154+ }
60155
61- self . byte = left | right;
156+ fn is_parent ( iter : & flat_tree:: Iterator ) -> bool {
157+ iter. index ( ) & 1 == 1
62158}
0 commit comments