@blackglory/structures 0.10.20 → 0.10.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6222,16 +6222,31 @@
6222
6222
  }
6223
6223
  }
6224
6224
 
6225
+ // http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightModLookup
6226
+ const mod37BitPositions = [
6227
+ 32, 0, 1, 26, 2, 23, 27, 0, 3, 16,
6228
+ 24, 30, 28, 11, 0, 13, 4, 7, 17, 0,
6229
+ 25, 22, 31, 15, 29, 10, 12, 6, 0, 21,
6230
+ 14, 9, 5, 20, 8, 19, 18
6231
+ ];
6232
+ /**
6233
+ * 该函数在找不到结果时返回32, 与Rust内置函数的表现一致.
6234
+ * https://doc.rust-lang.org/std/primitive.u32.html#method.trailing_zeros
6235
+ */
6236
+ function trailingZeros(value) {
6237
+ return mod37BitPositions[(-value & value) % 37];
6238
+ }
6239
+
6225
6240
  class BitSet {
6226
- constructor(bitsPerElement = 32) {
6241
+ constructor(bitsPerElement = 8) {
6227
6242
  this.bitsPerElement = bitsPerElement;
6228
6243
  this.array = [];
6229
6244
  this.length = 0;
6230
6245
  this._size = 0;
6231
6246
  es2018Exports$1.assert(Number.isInteger(bitsPerElement), 'The parameter bitsPerElement must be an integer');
6232
6247
  es2018Exports$1.assert(bitsPerElement > 0, 'The parameter bitsPerElement must be greater than 0');
6233
- // `32`是该数据结构中能够处理的最大值
6234
- es2018Exports$1.assert(bitsPerElement <= 32, 'The mask of bitsPerElement must be less than or equal to 32');
6248
+ // `31`是该数据结构中能够处理的最大值
6249
+ es2018Exports$1.assert(bitsPerElement <= 31, 'The mask of bitsPerElement must be less than or equal to 31');
6235
6250
  }
6236
6251
  get [Symbol.toStringTag]() {
6237
6252
  return this.constructor.name;
@@ -6244,26 +6259,18 @@
6244
6259
  }
6245
6260
  *values() {
6246
6261
  if (this.length > 0) {
6247
- const maxArrayLength = Math.ceil(this.length / this.bitsPerElement);
6248
- const remainder = this.bitsPerElement
6249
- - (maxArrayLength * this.bitsPerElement - this.length);
6250
- const lastIndex = maxArrayLength - 1;
6251
- for (let index = 0; index < lastIndex; index++) {
6262
+ // maxArrayLength = Math.ceil(this.length / this.bitsPerElement)
6263
+ const maxArrayLength = ~~(this.length / this.bitsPerElement) + 1;
6264
+ for (let index = 0; index < maxArrayLength; index++) {
6252
6265
  let element = this.array[index];
6253
- for (let bit = 0; bit < this.bitsPerElement; bit++) {
6254
- if (element & 1) {
6255
- yield index * this.bitsPerElement + bit;
6256
- }
6257
- element >>= 1;
6266
+ let offset = 0;
6267
+ let indexOfBit;
6268
+ while ((indexOfBit = trailingZeros(element)) !== 32) {
6269
+ yield index * this.bitsPerElement + offset + indexOfBit;
6270
+ offset += indexOfBit + 1;
6271
+ element >>= indexOfBit + 1;
6258
6272
  }
6259
6273
  }
6260
- let lastElement = this.array[maxArrayLength - 1];
6261
- for (let bit = 0; bit < remainder; bit++) {
6262
- if (lastElement & 1) {
6263
- yield lastIndex * this.bitsPerElement + bit;
6264
- }
6265
- lastElement >>= 1;
6266
- }
6267
6274
  }
6268
6275
  }
6269
6276
  _dumpBinaryStrings() {
@@ -6323,6 +6330,7 @@
6323
6330
  }
6324
6331
  // 输入一定是一个小于bitsPerElement的值, 取值范围是[0, bitsPerElement)
6325
6332
  getMask(value) {
6333
+ // return 2 ** value
6326
6334
  return 1 << value;
6327
6335
  }
6328
6336
  }
@@ -6335,8 +6343,8 @@
6335
6343
  const bitsPerElement = array.BYTES_PER_ELEMENT * 8;
6336
6344
  es2018Exports$1.assert(Number.isInteger(bitsPerElement), 'The parameter bitsPerElement must be an integer');
6337
6345
  es2018Exports$1.assert(bitsPerElement > 0, 'The parameter bitsPerElement must be greater than 0');
6338
- // `32`是该数据结构中能够处理的最大值
6339
- es2018Exports$1.assert(bitsPerElement <= 32, 'The mask of bitsPerElement must be less than or equal to 32');
6346
+ // `31`是该数据结构中能够处理的最大值
6347
+ es2018Exports$1.assert(bitsPerElement <= 31, 'The mask of bitsPerElement must be less than or equal to 31');
6340
6348
  this.bitsPerElement = bitsPerElement;
6341
6349
  }
6342
6350
  get [Symbol.toStringTag]() {
@@ -6350,25 +6358,17 @@
6350
6358
  }
6351
6359
  *values() {
6352
6360
  if (this.length > 0) {
6353
- const maxArrayLength = Math.ceil(this.length / this.bitsPerElement);
6354
- const remainder = this.bitsPerElement
6355
- - (maxArrayLength * this.bitsPerElement - this.length);
6356
- const lastIndex = maxArrayLength - 1;
6357
- for (let index = 0; index < lastIndex; index++) {
6361
+ // maxArrayLength = Math.ceil(this.length / this.bitsPerElement)
6362
+ const maxArrayLength = ~~(this.length / this.bitsPerElement) + 1;
6363
+ for (let index = 0; index < maxArrayLength; index++) {
6358
6364
  let element = this.array.internalTypedArray[index];
6359
- for (let bit = 0; bit < this.bitsPerElement; bit++) {
6360
- if (element & 1) {
6361
- yield index * this.bitsPerElement + bit;
6362
- }
6363
- element >>= 1;
6364
- }
6365
- }
6366
- let lastElement = this.array.internalTypedArray[maxArrayLength - 1];
6367
- for (let bit = 0; bit < remainder; bit++) {
6368
- if (lastElement & 1) {
6369
- yield lastIndex * this.bitsPerElement + bit;
6365
+ let offset = 0;
6366
+ let indexOfBit;
6367
+ while ((indexOfBit = trailingZeros(element)) !== 32) {
6368
+ yield index * this.bitsPerElement + offset + indexOfBit;
6369
+ offset += indexOfBit + 1;
6370
+ element >>= indexOfBit + 1;
6370
6371
  }
6371
- lastElement >>= 1;
6372
6372
  }
6373
6373
  }
6374
6374
  }
@@ -6429,6 +6429,7 @@
6429
6429
  }
6430
6430
  // 输入一定是一个小于bitsPerElement的值, 取值范围是[0, bitsPerElement)
6431
6431
  getMask(value) {
6432
+ // return 2 ** value
6432
6433
  return 1 << value;
6433
6434
  }
6434
6435
  }