@blackglory/structures 0.10.19 → 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 (44) hide show
  1. package/README.md +2 -1
  2. package/dist/es2015/index.min.mjs +2 -2
  3. package/dist/es2015/index.min.mjs.map +1 -1
  4. package/dist/es2015/index.mjs +46 -22
  5. package/dist/es2015/index.mjs.map +1 -1
  6. package/dist/es2015/index.umd.js +46 -22
  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 +2 -2
  11. package/dist/es2018/index.min.mjs.map +1 -1
  12. package/dist/es2018/index.mjs +46 -22
  13. package/dist/es2018/index.mjs.map +1 -1
  14. package/dist/es2018/index.umd.js +46 -22
  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 +13 -18
  19. package/lib/es2015/bit-set.js.map +1 -1
  20. package/lib/es2015/dynamic-typed-array.d.ts +1 -0
  21. package/lib/es2015/dynamic-typed-array.js +3 -0
  22. package/lib/es2015/dynamic-typed-array.js.map +1 -1
  23. package/lib/es2015/typed-bit-set.js +8 -4
  24. package/lib/es2015/typed-bit-set.js.map +1 -1
  25. package/lib/es2015/utils/bit-scan.d.ts +1 -0
  26. package/lib/es2015/utils/bit-scan.js +14 -0
  27. package/lib/es2015/utils/bit-scan.js.map +1 -0
  28. package/lib/es2015/utils/trailing-zeros.d.ts +1 -0
  29. package/lib/es2015/utils/trailing-zeros.js +14 -0
  30. package/lib/es2015/utils/trailing-zeros.js.map +1 -0
  31. package/lib/es2018/bit-set.js +13 -18
  32. package/lib/es2018/bit-set.js.map +1 -1
  33. package/lib/es2018/dynamic-typed-array.d.ts +1 -0
  34. package/lib/es2018/dynamic-typed-array.js +3 -0
  35. package/lib/es2018/dynamic-typed-array.js.map +1 -1
  36. package/lib/es2018/typed-bit-set.js +8 -4
  37. package/lib/es2018/typed-bit-set.js.map +1 -1
  38. package/lib/es2018/utils/bit-scan.d.ts +1 -0
  39. package/lib/es2018/utils/bit-scan.js +14 -0
  40. package/lib/es2018/utils/bit-scan.js.map +1 -0
  41. package/lib/es2018/utils/trailing-zeros.d.ts +1 -0
  42. package/lib/es2018/utils/trailing-zeros.js +14 -0
  43. package/lib/es2018/utils/trailing-zeros.js.map +1 -0
  44. package/package.json +3 -2
@@ -5918,6 +5918,9 @@
5918
5918
  get [Symbol.toStringTag]() {
5919
5919
  return this.constructor.name;
5920
5920
  }
5921
+ get BYTES_PER_ELEMENT() {
5922
+ return this.typedArrayConstructor.BYTES_PER_ELEMENT;
5923
+ }
5921
5924
  /**
5922
5925
  * 数组当前的容量.
5923
5926
  */
@@ -6219,12 +6222,31 @@
6219
6222
  }
6220
6223
  }
6221
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
+
6222
6240
  class BitSet {
6223
- constructor(bitsPerElement = 8) {
6241
+ constructor(bitsPerElement = 31) {
6224
6242
  this.bitsPerElement = bitsPerElement;
6225
6243
  this.array = [];
6226
6244
  this.length = 0;
6227
6245
  this._size = 0;
6246
+ es2018Exports$1.assert(Number.isInteger(bitsPerElement), 'The parameter bitsPerElement must be an integer');
6247
+ es2018Exports$1.assert(bitsPerElement > 0, 'The parameter bitsPerElement must be greater than 0');
6248
+ // `31`是该数据结构中能够处理的最大值
6249
+ es2018Exports$1.assert(bitsPerElement <= 31, 'The mask of bitsPerElement must be less than or equal to 31');
6228
6250
  }
6229
6251
  get [Symbol.toStringTag]() {
6230
6252
  return this.constructor.name;
@@ -6237,26 +6259,18 @@
6237
6259
  }
6238
6260
  *values() {
6239
6261
  if (this.length > 0) {
6240
- const maxArrayLength = Math.ceil(this.length / this.bitsPerElement);
6241
- const remainder = this.bitsPerElement
6242
- - (maxArrayLength * this.bitsPerElement - this.length);
6243
- const lastIndex = maxArrayLength - 1;
6244
- 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++) {
6245
6265
  let element = this.array[index];
6246
- for (let bit = 0; bit < this.bitsPerElement; bit++) {
6247
- if (element & 1) {
6248
- yield index * this.bitsPerElement + bit;
6249
- }
6250
- 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;
6251
6272
  }
6252
6273
  }
6253
- let lastElement = this.array[maxArrayLength - 1];
6254
- for (let bit = 0; bit < remainder; bit++) {
6255
- if (lastElement & 1) {
6256
- yield lastIndex * this.bitsPerElement + bit;
6257
- }
6258
- lastElement >>= 1;
6259
- }
6260
6274
  }
6261
6275
  }
6262
6276
  _dumpBinaryStrings() {
@@ -6316,6 +6330,7 @@
6316
6330
  }
6317
6331
  // 输入一定是一个小于bitsPerElement的值, 取值范围是[0, bitsPerElement)
6318
6332
  getMask(value) {
6333
+ // return 2 ** value
6319
6334
  return 1 << value;
6320
6335
  }
6321
6336
  }
@@ -6323,9 +6338,14 @@
6323
6338
  class TypedBitSet {
6324
6339
  constructor(array) {
6325
6340
  this.array = array;
6326
- this.bitsPerElement = this.array.internalTypedArray.BYTES_PER_ELEMENT * 8;
6327
6341
  this.length = 0;
6328
6342
  this._size = 0;
6343
+ const bitsPerElement = array.BYTES_PER_ELEMENT * 8;
6344
+ es2018Exports$1.assert(Number.isInteger(bitsPerElement), 'The parameter bitsPerElement must be an integer');
6345
+ es2018Exports$1.assert(bitsPerElement > 0, 'The parameter bitsPerElement must be greater than 0');
6346
+ // `32`是该数据结构中能够处理的最大值
6347
+ es2018Exports$1.assert(bitsPerElement <= 32, 'The mask of bitsPerElement must be less than or equal to 32');
6348
+ this.bitsPerElement = bitsPerElement;
6329
6349
  }
6330
6350
  get [Symbol.toStringTag]() {
6331
6351
  return this.constructor.name;
@@ -6338,14 +6358,16 @@
6338
6358
  }
6339
6359
  *values() {
6340
6360
  if (this.length > 0) {
6341
- const maxArrayLength = Math.ceil(this.length / this.bitsPerElement);
6361
+ // maxArrayLength = Math.ceil(this.length / this.bitsPerElement)
6362
+ const maxArrayLength = ~~(this.length / this.bitsPerElement) + 1;
6342
6363
  const remainder = this.bitsPerElement
6343
6364
  - (maxArrayLength * this.bitsPerElement - this.length);
6344
6365
  const lastIndex = maxArrayLength - 1;
6345
6366
  for (let index = 0; index < lastIndex; index++) {
6346
6367
  let element = this.array.internalTypedArray[index];
6347
6368
  for (let bit = 0; bit < this.bitsPerElement; bit++) {
6348
- if (element & 1) {
6369
+ // if (isOdd(element)) {
6370
+ if (element % 2) {
6349
6371
  yield index * this.bitsPerElement + bit;
6350
6372
  }
6351
6373
  element >>= 1;
@@ -6353,7 +6375,8 @@
6353
6375
  }
6354
6376
  let lastElement = this.array.internalTypedArray[maxArrayLength - 1];
6355
6377
  for (let bit = 0; bit < remainder; bit++) {
6356
- if (lastElement & 1) {
6378
+ // if (isOdd(lastElement)) {
6379
+ if (lastElement % 2) {
6357
6380
  yield lastIndex * this.bitsPerElement + bit;
6358
6381
  }
6359
6382
  lastElement >>= 1;
@@ -6417,6 +6440,7 @@
6417
6440
  }
6418
6441
  // 输入一定是一个小于bitsPerElement的值, 取值范围是[0, bitsPerElement)
6419
6442
  getMask(value) {
6443
+ // return 2 ** value
6420
6444
  return 1 << value;
6421
6445
  }
6422
6446
  }