@blackglory/structures 0.10.20 → 0.10.21

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.
Files changed (38) hide show
  1. package/README.md +1 -1
  2. package/dist/es2015/index.min.mjs +1 -1
  3. package/dist/es2015/index.min.mjs.map +1 -1
  4. package/dist/es2015/index.mjs +35 -23
  5. package/dist/es2015/index.mjs.map +1 -1
  6. package/dist/es2015/index.umd.js +35 -23
  7. package/dist/es2015/index.umd.js.map +1 -1
  8. package/dist/es2015/index.umd.min.js +1 -1
  9. package/dist/es2015/index.umd.min.js.map +1 -1
  10. package/dist/es2018/index.min.mjs +1 -1
  11. package/dist/es2018/index.min.mjs.map +1 -1
  12. package/dist/es2018/index.mjs +35 -23
  13. package/dist/es2018/index.mjs.map +1 -1
  14. package/dist/es2018/index.umd.js +35 -23
  15. package/dist/es2018/index.umd.js.map +1 -1
  16. package/dist/es2018/index.umd.min.js +1 -1
  17. package/dist/es2018/index.umd.min.js.map +1 -1
  18. package/lib/es2015/bit-set.js +11 -19
  19. package/lib/es2015/bit-set.js.map +1 -1
  20. package/lib/es2015/typed-bit-set.js +3 -3
  21. package/lib/es2015/typed-bit-set.js.map +1 -1
  22. package/lib/es2015/utils/bit-scan.d.ts +1 -0
  23. package/lib/es2015/utils/bit-scan.js +14 -0
  24. package/lib/es2015/utils/bit-scan.js.map +1 -0
  25. package/lib/es2015/utils/trailing-zeros.d.ts +1 -0
  26. package/lib/es2015/utils/trailing-zeros.js +14 -0
  27. package/lib/es2015/utils/trailing-zeros.js.map +1 -0
  28. package/lib/es2018/bit-set.js +11 -19
  29. package/lib/es2018/bit-set.js.map +1 -1
  30. package/lib/es2018/typed-bit-set.js +3 -3
  31. package/lib/es2018/typed-bit-set.js.map +1 -1
  32. package/lib/es2018/utils/bit-scan.d.ts +1 -0
  33. package/lib/es2018/utils/bit-scan.js +14 -0
  34. package/lib/es2018/utils/bit-scan.js.map +1 -0
  35. package/lib/es2018/utils/trailing-zeros.d.ts +1 -0
  36. package/lib/es2018/utils/trailing-zeros.js +14 -0
  37. package/lib/es2018/utils/trailing-zeros.js.map +1 -0
  38. package/package.json +1 -1
@@ -6216,16 +6216,31 @@ class SortedSet {
6216
6216
  }
6217
6217
  }
6218
6218
 
6219
+ // http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightModLookup
6220
+ const mod37BitPositions = [
6221
+ 32, 0, 1, 26, 2, 23, 27, 0, 3, 16,
6222
+ 24, 30, 28, 11, 0, 13, 4, 7, 17, 0,
6223
+ 25, 22, 31, 15, 29, 10, 12, 6, 0, 21,
6224
+ 14, 9, 5, 20, 8, 19, 18
6225
+ ];
6226
+ /**
6227
+ * 该函数在找不到结果时返回32, 与Rust内置函数的表现一致.
6228
+ * https://doc.rust-lang.org/std/primitive.u32.html#method.trailing_zeros
6229
+ */
6230
+ function trailingZeros(value) {
6231
+ return mod37BitPositions[(-value & value) % 37];
6232
+ }
6233
+
6219
6234
  class BitSet {
6220
- constructor(bitsPerElement = 32) {
6235
+ constructor(bitsPerElement = 31) {
6221
6236
  this.bitsPerElement = bitsPerElement;
6222
6237
  this.array = [];
6223
6238
  this.length = 0;
6224
6239
  this._size = 0;
6225
6240
  es2018Exports$1.assert(Number.isInteger(bitsPerElement), 'The parameter bitsPerElement must be an integer');
6226
6241
  es2018Exports$1.assert(bitsPerElement > 0, 'The parameter bitsPerElement must be greater than 0');
6227
- // `32`是该数据结构中能够处理的最大值
6228
- es2018Exports$1.assert(bitsPerElement <= 32, 'The mask of bitsPerElement must be less than or equal to 32');
6242
+ // `31`是该数据结构中能够处理的最大值
6243
+ es2018Exports$1.assert(bitsPerElement <= 31, 'The mask of bitsPerElement must be less than or equal to 31');
6229
6244
  }
6230
6245
  get [Symbol.toStringTag]() {
6231
6246
  return this.constructor.name;
@@ -6238,26 +6253,18 @@ class BitSet {
6238
6253
  }
6239
6254
  *values() {
6240
6255
  if (this.length > 0) {
6241
- const maxArrayLength = Math.ceil(this.length / this.bitsPerElement);
6242
- const remainder = this.bitsPerElement
6243
- - (maxArrayLength * this.bitsPerElement - this.length);
6244
- const lastIndex = maxArrayLength - 1;
6245
- for (let index = 0; index < lastIndex; index++) {
6256
+ // maxArrayLength = Math.ceil(this.length / this.bitsPerElement)
6257
+ const maxArrayLength = ~~(this.length / this.bitsPerElement) + 1;
6258
+ for (let index = 0; index < maxArrayLength; index++) {
6246
6259
  let element = this.array[index];
6247
- for (let bit = 0; bit < this.bitsPerElement; bit++) {
6248
- if (element & 1) {
6249
- yield index * this.bitsPerElement + bit;
6250
- }
6251
- element >>= 1;
6260
+ let offset = 0;
6261
+ let indexOfBit;
6262
+ while ((indexOfBit = trailingZeros(element)) !== 32) {
6263
+ yield index * this.bitsPerElement + offset + indexOfBit;
6264
+ offset += indexOfBit + 1;
6265
+ element >>= indexOfBit + 1;
6252
6266
  }
6253
6267
  }
6254
- let lastElement = this.array[maxArrayLength - 1];
6255
- for (let bit = 0; bit < remainder; bit++) {
6256
- if (lastElement & 1) {
6257
- yield lastIndex * this.bitsPerElement + bit;
6258
- }
6259
- lastElement >>= 1;
6260
- }
6261
6268
  }
6262
6269
  }
6263
6270
  _dumpBinaryStrings() {
@@ -6317,6 +6324,7 @@ class BitSet {
6317
6324
  }
6318
6325
  // 输入一定是一个小于bitsPerElement的值, 取值范围是[0, bitsPerElement)
6319
6326
  getMask(value) {
6327
+ // return 2 ** value
6320
6328
  return 1 << value;
6321
6329
  }
6322
6330
  }
@@ -6344,14 +6352,16 @@ class TypedBitSet {
6344
6352
  }
6345
6353
  *values() {
6346
6354
  if (this.length > 0) {
6347
- const maxArrayLength = Math.ceil(this.length / this.bitsPerElement);
6355
+ // maxArrayLength = Math.ceil(this.length / this.bitsPerElement)
6356
+ const maxArrayLength = ~~(this.length / this.bitsPerElement) + 1;
6348
6357
  const remainder = this.bitsPerElement
6349
6358
  - (maxArrayLength * this.bitsPerElement - this.length);
6350
6359
  const lastIndex = maxArrayLength - 1;
6351
6360
  for (let index = 0; index < lastIndex; index++) {
6352
6361
  let element = this.array.internalTypedArray[index];
6353
6362
  for (let bit = 0; bit < this.bitsPerElement; bit++) {
6354
- if (element & 1) {
6363
+ // if (isOdd(element)) {
6364
+ if (element % 2) {
6355
6365
  yield index * this.bitsPerElement + bit;
6356
6366
  }
6357
6367
  element >>= 1;
@@ -6359,7 +6369,8 @@ class TypedBitSet {
6359
6369
  }
6360
6370
  let lastElement = this.array.internalTypedArray[maxArrayLength - 1];
6361
6371
  for (let bit = 0; bit < remainder; bit++) {
6362
- if (lastElement & 1) {
6372
+ // if (isOdd(lastElement)) {
6373
+ if (lastElement % 2) {
6363
6374
  yield lastIndex * this.bitsPerElement + bit;
6364
6375
  }
6365
6376
  lastElement >>= 1;
@@ -6423,6 +6434,7 @@ class TypedBitSet {
6423
6434
  }
6424
6435
  // 输入一定是一个小于bitsPerElement的值, 取值范围是[0, bitsPerElement)
6425
6436
  getMask(value) {
6437
+ // return 2 ** value
6426
6438
  return 1 << value;
6427
6439
  }
6428
6440
  }