@@ -98,19 +98,9 @@ impl<A: Allocator> Bitmap<A> {
98
98
/// ```
99
99
pub fn find_first_unset ( & self ) -> Option < usize > {
100
100
for ( i, block) in self . bitmap . iter ( ) . enumerate ( ) {
101
- let mut block_value = * block;
102
-
103
- if block_value != usize:: MAX {
104
- let mut bit = 0 ;
105
-
106
- // Loop through the bits in the block and find
107
- // the first unset bit.
108
- while block_value. get_bit ( 0 ) {
109
- block_value >>= 1 ;
110
- bit += 1 ;
111
- }
112
-
113
- return Some ( ( i * BLOCK_BITS ) + bit) ;
101
+ let trailing_ones = block. trailing_ones ( ) ;
102
+ if trailing_ones < BLOCK_BITS as u32 {
103
+ return Some ( i * BLOCK_BITS + trailing_ones as usize ) ;
114
104
}
115
105
}
116
106
@@ -130,19 +120,9 @@ impl<A: Allocator> Bitmap<A> {
130
120
/// ```
131
121
pub fn find_first_set ( & self ) -> Option < usize > {
132
122
for ( i, block) in self . bitmap . iter ( ) . enumerate ( ) {
133
- let mut block_value = * block;
134
-
135
- if block_value != 0 {
136
- let mut bit = 0 ;
137
-
138
- // Loop through the bits in the block and find
139
- // the first set bit.
140
- while !block_value. get_bit ( 0 ) {
141
- block_value >>= 1 ;
142
- bit += 1 ;
143
- }
144
-
145
- return Some ( ( i * BLOCK_BITS ) + bit) ;
123
+ let trailing_zeros = block. trailing_zeros ( ) ;
124
+ if trailing_zeros < BLOCK_BITS as u32 {
125
+ return Some ( i * BLOCK_BITS + trailing_zeros as usize ) ;
146
126
}
147
127
}
148
128
@@ -155,33 +135,80 @@ mod test {
155
135
use super :: * ;
156
136
use alloc:: alloc:: Global ;
157
137
138
+ const TEST_BITMAP_SIZE : usize = 4096 ;
139
+
158
140
#[ test]
159
- fn bitmap_first_unset_idx ( ) {
160
- let mut bitmap = Bitmap :: new_in ( Global , 4096 ) ;
141
+ fn find_first_unset ( ) {
142
+ let mut map = Bitmap :: new_in ( Global , TEST_BITMAP_SIZE ) ;
161
143
162
- bitmap. set ( 69 , true ) ;
163
- assert_eq ! ( bitmap. find_first_unset( ) , Some ( 0 ) ) ;
144
+ // Set all of the bits to true.
145
+ for i in 0 ..TEST_BITMAP_SIZE {
146
+ assert_eq ! ( map. find_first_unset( ) , Some ( i) ) ;
147
+ map. set ( i, true ) ;
148
+ }
164
149
165
- bitmap. set ( 0 , true ) ;
166
- assert_eq ! ( bitmap. find_first_unset( ) , Some ( 1 ) ) ;
167
- }
150
+ assert_eq ! ( map. find_first_unset( ) , None ) ;
168
151
169
- #[ test]
170
- fn bitmap_first_set_idx ( ) {
171
- let mut bitmap = Bitmap :: new_in ( Global , 4096 ) ;
152
+ map. set ( 0 , false ) ;
153
+ assert_eq ! ( map. find_first_unset( ) , Some ( 0 ) ) ;
154
+
155
+ map. set ( 0 , true ) ;
156
+ map. set ( 1 , false ) ;
157
+ assert_eq ! ( map. find_first_unset( ) , Some ( 1 ) ) ;
158
+
159
+ map. set ( 56 , false ) ;
160
+ assert_eq ! ( map. find_first_unset( ) , Some ( 1 ) ) ;
172
161
173
- bitmap. set ( 69 , true ) ;
174
- assert_eq ! ( bitmap. find_first_set( ) , Some ( 69 ) ) ;
162
+ map. set ( 1 , true ) ;
163
+ assert_eq ! ( map. find_first_unset( ) , Some ( 56 ) ) ;
164
+
165
+ map. set ( 80 , false ) ;
166
+ assert_eq ! ( map. find_first_unset( ) , Some ( 56 ) ) ;
167
+
168
+ map. set ( 56 , true ) ;
169
+ assert_eq ! ( map. find_first_unset( ) , Some ( 80 ) ) ;
170
+
171
+ map. set ( 82 , false ) ;
172
+ assert_eq ! ( map. find_first_unset( ) , Some ( 80 ) ) ;
173
+
174
+ map. set ( 80 , true ) ;
175
+ assert_eq ! ( map. find_first_unset( ) , Some ( 82 ) ) ;
176
+
177
+ map. set ( 5 , false ) ;
178
+ assert_eq ! ( map. find_first_unset( ) , Some ( 5 ) ) ;
175
179
}
176
180
177
181
#[ test]
178
- fn bitmap_set_and_test ( ) {
179
- let mut bitmap = Bitmap :: new_in ( Global , 4096 ) ;
182
+ fn find_first_set ( ) {
183
+ let mut map = Bitmap :: new_in ( Global , TEST_BITMAP_SIZE ) ;
184
+ assert_eq ! ( map. find_first_set( ) , None ) ;
185
+
186
+ map. set ( 0 , true ) ;
187
+ assert_eq ! ( map. find_first_set( ) , Some ( 0 ) ) ;
188
+
189
+ map. set ( 0 , false ) ;
190
+ map. set ( 1 , true ) ;
191
+ assert_eq ! ( map. find_first_set( ) , Some ( 1 ) ) ;
192
+
193
+ map. set ( 56 , true ) ;
194
+ assert_eq ! ( map. find_first_set( ) , Some ( 1 ) ) ;
195
+
196
+ map. set ( 1 , false ) ;
197
+ assert_eq ! ( map. find_first_set( ) , Some ( 56 ) ) ;
198
+
199
+ map. set ( 80 , true ) ;
200
+ assert_eq ! ( map. find_first_set( ) , Some ( 56 ) ) ;
201
+
202
+ map. set ( 56 , false ) ;
203
+ assert_eq ! ( map. find_first_set( ) , Some ( 80 ) ) ;
204
+
205
+ map. set ( 82 , true ) ;
206
+ assert_eq ! ( map. find_first_set( ) , Some ( 80 ) ) ;
180
207
181
- bitmap . set ( 69 , true ) ;
182
- assert ! ( bitmap . is_set ( 69 ) ) ;
208
+ map . set ( 80 , false ) ;
209
+ assert_eq ! ( map . find_first_set ( ) , Some ( 82 ) ) ;
183
210
184
- bitmap . set ( 69 , false ) ;
185
- assert ! ( !bitmap . is_set ( 69 ) ) ;
211
+ map . set ( 5 , true ) ;
212
+ assert_eq ! ( map . find_first_set ( ) , Some ( 5 ) ) ;
186
213
}
187
214
}
0 commit comments