@@ -145,9 +145,7 @@ class BitArray extends BitSet {
145
145
146
146
/// Sets all of the bits in the current [BitArray] to false.
147
147
void clearAll () {
148
- for (var i = 0 ; i < _data.length; i++ ) {
149
- _data[i] = 0 ;
150
- }
148
+ _data.fillRange (0 , _data.length, 0 );
151
149
}
152
150
153
151
/// Sets the bit specified by the [index] to true.
@@ -184,9 +182,7 @@ class BitArray extends BitSet {
184
182
185
183
/// Sets all the bit values in the current [BitArray] to true.
186
184
void setAll () {
187
- for (var i = 0 ; i < _data.length; i++ ) {
188
- _data[i] = - 1 ;
189
- }
185
+ _data.fillRange (0 , _data.length, - 1 );
190
186
}
191
187
192
188
/// Inverts the bit specified by the [index] .
@@ -210,11 +206,20 @@ class BitArray extends BitSet {
210
206
/// corresponding elements in the specified [set] .
211
207
/// Excess size of the [set] is ignored.
212
208
void and (BitSet set ) {
213
- final iter = set .asUint32Iterable ().iterator;
214
209
var i = 0 ;
215
- for (; i < _data.length && iter.moveNext (); i++ ) {
216
- _data[i] & = iter.current;
210
+ // Special-case for efficient merging of two arrays.
211
+ if (set is BitArray ) {
212
+ final minLength = math.min (_data.length, set ._data.length);
213
+ for (; i < minLength; i++ ) {
214
+ _data[i] & = set ._data[i];
215
+ }
216
+ } else {
217
+ final iter = set .asUint32Iterable ().iterator;
218
+ for (; i < _data.length && iter.moveNext (); i++ ) {
219
+ _data[i] & = iter.current;
220
+ }
217
221
}
222
+
218
223
for (; i < _data.length; i++ ) {
219
224
_data[i] = 0 ;
220
225
}
@@ -224,29 +229,53 @@ class BitArray extends BitSet {
224
229
/// corresponding elements in the specified [set] .
225
230
/// Excess size of the [set] is ignored.
226
231
void andNot (BitSet set ) {
227
- final iter = set .asUint32Iterable ().iterator;
228
- for (var i = 0 ; i < _data.length && iter.moveNext (); i++ ) {
229
- _data[i] & = ~ iter.current;
232
+ // Special-case for efficient merging of two arrays.
233
+ if (set is BitArray ) {
234
+ final minLength = math.min (_data.length, set ._data.length);
235
+ for (var i = 0 ; i < minLength; i++ ) {
236
+ _data[i] & = ~ set ._data[i];
237
+ }
238
+ } else {
239
+ final iter = set .asUint32Iterable ().iterator;
240
+ for (var i = 0 ; i < _data.length && iter.moveNext (); i++ ) {
241
+ _data[i] & = ~ iter.current;
242
+ }
230
243
}
231
244
}
232
245
233
246
/// Update the current [BitArray] using a logical OR operation with the
234
247
/// corresponding elements in the specified [set] .
235
248
/// Excess size of the [set] is ignored.
236
249
void or (BitSet set ) {
237
- final iter = set .asUint32Iterable ().iterator;
238
- for (var i = 0 ; i < _data.length && iter.moveNext (); i++ ) {
239
- _data[i] | = iter.current;
250
+ // Special-case for efficient merging of two arrays.
251
+ if (set is BitArray ) {
252
+ final minLength = math.min (_data.length, set ._data.length);
253
+ for (var i = 0 ; i < minLength; i++ ) {
254
+ _data[i] | = set ._data[i];
255
+ }
256
+ } else {
257
+ final iter = set .asUint32Iterable ().iterator;
258
+ for (var i = 0 ; i < _data.length && iter.moveNext (); i++ ) {
259
+ _data[i] | = iter.current;
260
+ }
240
261
}
241
262
}
242
263
243
264
/// Update the current [BitArray] using a logical XOR operation with the
244
265
/// corresponding elements in the specified [set] .
245
266
/// Excess size of the [set] is ignored.
246
267
void xor (BitSet set ) {
247
- final iter = set .asUint32Iterable ().iterator;
248
- for (var i = 0 ; i < _data.length && iter.moveNext (); i++ ) {
249
- _data[i] = _data[i] ^ iter.current;
268
+ // Special-case for efficient merging of two arrays.
269
+ if (set is BitArray ) {
270
+ final minLength = math.min (_data.length, set ._data.length);
271
+ for (var i = 0 ; i < minLength; i++ ) {
272
+ _data[i] = _data[i] ^ set ._data[i];
273
+ }
274
+ } else {
275
+ final iter = set .asUint32Iterable ().iterator;
276
+ for (var i = 0 ; i < _data.length && iter.moveNext (); i++ ) {
277
+ _data[i] = _data[i] ^ iter.current;
278
+ }
250
279
}
251
280
}
252
281
0 commit comments