Skip to content

Commit 21aaacd

Browse files
committed
More efficient methods.
1 parent ab0b34f commit 21aaacd

File tree

2 files changed

+49
-18
lines changed

2 files changed

+49
-18
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
- Updated SDK constraint, lints and format.
44
- `BitArray.setWhere` and `BitArray.clearWhere` for callback-driven updates.
5+
- More efficient `BitArray` operations: `setAll`, `clearAll`.
6+
- More efficient `BitArray` operations: `and`, `andNot`, `or`, `xor` when the parameter is another `BitArray`.
57

68
## 2.2.1
79

lib/src/bit_array.dart

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,7 @@ class BitArray extends BitSet {
145145

146146
/// Sets all of the bits in the current [BitArray] to false.
147147
void clearAll() {
148-
for (var i = 0; i < _data.length; i++) {
149-
_data[i] = 0;
150-
}
148+
_data.fillRange(0, _data.length, 0);
151149
}
152150

153151
/// Sets the bit specified by the [index] to true.
@@ -184,9 +182,7 @@ class BitArray extends BitSet {
184182

185183
/// Sets all the bit values in the current [BitArray] to true.
186184
void setAll() {
187-
for (var i = 0; i < _data.length; i++) {
188-
_data[i] = -1;
189-
}
185+
_data.fillRange(0, _data.length, -1);
190186
}
191187

192188
/// Inverts the bit specified by the [index].
@@ -210,11 +206,20 @@ class BitArray extends BitSet {
210206
/// corresponding elements in the specified [set].
211207
/// Excess size of the [set] is ignored.
212208
void and(BitSet set) {
213-
final iter = set.asUint32Iterable().iterator;
214209
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+
}
217221
}
222+
218223
for (; i < _data.length; i++) {
219224
_data[i] = 0;
220225
}
@@ -224,29 +229,53 @@ class BitArray extends BitSet {
224229
/// corresponding elements in the specified [set].
225230
/// Excess size of the [set] is ignored.
226231
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+
}
230243
}
231244
}
232245

233246
/// Update the current [BitArray] using a logical OR operation with the
234247
/// corresponding elements in the specified [set].
235248
/// Excess size of the [set] is ignored.
236249
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+
}
240261
}
241262
}
242263

243264
/// Update the current [BitArray] using a logical XOR operation with the
244265
/// corresponding elements in the specified [set].
245266
/// Excess size of the [set] is ignored.
246267
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+
}
250279
}
251280
}
252281

0 commit comments

Comments
 (0)