@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
@@ -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 = 31) {
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
  }
@@ -6350,14 +6358,16 @@
6350
6358
  }
6351
6359
  *values() {
6352
6360
  if (this.length > 0) {
6353
- const maxArrayLength = Math.ceil(this.length / this.bitsPerElement);
6361
+ // maxArrayLength = Math.ceil(this.length / this.bitsPerElement)
6362
+ const maxArrayLength = ~~(this.length / this.bitsPerElement) + 1;
6354
6363
  const remainder = this.bitsPerElement
6355
6364
  - (maxArrayLength * this.bitsPerElement - this.length);
6356
6365
  const lastIndex = maxArrayLength - 1;
6357
6366
  for (let index = 0; index < lastIndex; index++) {
6358
6367
  let element = this.array.internalTypedArray[index];
6359
6368
  for (let bit = 0; bit < this.bitsPerElement; bit++) {
6360
- if (element & 1) {
6369
+ // if (isOdd(element)) {
6370
+ if (element % 2) {
6361
6371
  yield index * this.bitsPerElement + bit;
6362
6372
  }
6363
6373
  element >>= 1;
@@ -6365,7 +6375,8 @@
6365
6375
  }
6366
6376
  let lastElement = this.array.internalTypedArray[maxArrayLength - 1];
6367
6377
  for (let bit = 0; bit < remainder; bit++) {
6368
- if (lastElement & 1) {
6378
+ // if (isOdd(lastElement)) {
6379
+ if (lastElement % 2) {
6369
6380
  yield lastIndex * this.bitsPerElement + bit;
6370
6381
  }
6371
6382
  lastElement >>= 1;
@@ -6429,6 +6440,7 @@
6429
6440
  }
6430
6441
  // 输入一定是一个小于bitsPerElement的值, 取值范围是[0, bitsPerElement)
6431
6442
  getMask(value) {
6443
+ // return 2 ** value
6432
6444
  return 1 << value;
6433
6445
  }
6434
6446
  }