@osmix/core 0.2.0 → 0.3.0

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 (87) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +54 -7
  3. package/dist/contracts.d.ts +2 -1
  4. package/dist/contracts.d.ts.map +1 -1
  5. package/dist/entities.d.ts +21 -1
  6. package/dist/entities.d.ts.map +1 -1
  7. package/dist/entities.js +52 -3
  8. package/dist/entities.js.map +1 -1
  9. package/dist/ids.d.ts +18 -5
  10. package/dist/ids.d.ts.map +1 -1
  11. package/dist/ids.js +68 -18
  12. package/dist/ids.js.map +1 -1
  13. package/dist/index.d.ts +6 -3
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +6 -3
  16. package/dist/index.js.map +1 -1
  17. package/dist/indirect-kd-index.d.ts +28 -0
  18. package/dist/indirect-kd-index.d.ts.map +1 -0
  19. package/dist/indirect-kd-index.js +163 -0
  20. package/dist/indirect-kd-index.js.map +1 -0
  21. package/dist/limits.d.ts +30 -0
  22. package/dist/limits.d.ts.map +1 -0
  23. package/dist/limits.js +51 -0
  24. package/dist/limits.js.map +1 -0
  25. package/dist/nodes.d.ts +28 -13
  26. package/dist/nodes.d.ts.map +1 -1
  27. package/dist/nodes.js +181 -51
  28. package/dist/nodes.js.map +1 -1
  29. package/dist/osm.d.ts +59 -3
  30. package/dist/osm.d.ts.map +1 -1
  31. package/dist/osm.js +31 -2
  32. package/dist/osm.js.map +1 -1
  33. package/dist/relations.d.ts +10 -4
  34. package/dist/relations.d.ts.map +1 -1
  35. package/dist/relations.js +66 -28
  36. package/dist/relations.js.map +1 -1
  37. package/dist/renumber.d.ts +23 -0
  38. package/dist/renumber.d.ts.map +1 -0
  39. package/dist/renumber.js +64 -0
  40. package/dist/renumber.js.map +1 -0
  41. package/dist/stringtable.d.ts +2 -1
  42. package/dist/stringtable.d.ts.map +1 -1
  43. package/dist/stringtable.js +5 -1
  44. package/dist/stringtable.js.map +1 -1
  45. package/dist/tags.d.ts +44 -11
  46. package/dist/tags.d.ts.map +1 -1
  47. package/dist/tags.js +153 -27
  48. package/dist/tags.js.map +1 -1
  49. package/dist/typed-arrays.d.ts +63 -48
  50. package/dist/typed-arrays.d.ts.map +1 -1
  51. package/dist/typed-arrays.js +184 -107
  52. package/dist/typed-arrays.js.map +1 -1
  53. package/dist/ways.d.ts +50 -2
  54. package/dist/ways.d.ts.map +1 -1
  55. package/dist/ways.js +212 -35
  56. package/dist/ways.js.map +1 -1
  57. package/package.json +11 -12
  58. package/src/contracts.ts +2 -1
  59. package/src/entities.ts +67 -4
  60. package/src/ids.ts +72 -22
  61. package/src/index.ts +13 -7
  62. package/src/indirect-kd-index.ts +212 -0
  63. package/src/limits.ts +73 -0
  64. package/src/nodes.ts +228 -54
  65. package/src/osm.ts +90 -4
  66. package/src/relations.ts +80 -30
  67. package/src/renumber.ts +80 -0
  68. package/src/stringtable.ts +15 -1
  69. package/src/tags.ts +173 -31
  70. package/src/typed-arrays.ts +225 -113
  71. package/src/ways.ts +233 -38
  72. package/test/entity-index-errors.test.ts +41 -0
  73. package/test/ids.bench.ts +11 -7
  74. package/test/ids.test.ts +38 -0
  75. package/test/limits.test.ts +83 -0
  76. package/test/no-shared-array-buffer.test.ts +41 -0
  77. package/test/nodes-spatial-index.test.ts +261 -0
  78. package/test/osm-bbox.test.ts +30 -0
  79. package/test/relations.bench.ts +9 -4
  80. package/test/relations.test.ts +52 -29
  81. package/test/renumber.test.ts +54 -0
  82. package/test/spatial-index-rebuild.test.ts +33 -0
  83. package/test/storage-compaction.test.ts +269 -0
  84. package/test/tags-search.test.ts +13 -0
  85. package/test/typed-arrays.test.ts +178 -59
  86. package/src/types/geokdbush.d.ts +0 -32
  87. package/src/types/kdbush.d.ts +0 -47
@@ -1 +1 @@
1
- {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,KAAK,UAAU,EAA+B,MAAM,mBAAmB,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU;IAClE,6DAA6D;IAC7D,QAAQ,EAAE,CAAC,CAAC;IACZ,0CAA0C;IAC1C,QAAQ,EAAE,CAAC,CAAC;IACZ,iCAAiC;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,mCAAmC;IACnC,OAAO,EAAE,CAAC,CAAC;IAEX,uDAAuD;IACvD,WAAW,EAAE,CAAC,CAAC;IACf,sDAAsD;IACtD,aAAa,EAAE,CAAC,CAAC;IACjB,wDAAwD;IACxD,aAAa,EAAE,CAAC,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,IAAI;IACf,iEAAiE;IACjE,OAAO,CAAC,WAAW,CAAkC;IAGrD,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAmB;IACnC,mDAAmD;IACnD,OAAO,CAAC,QAAQ,CAAkB;IAClC,+CAA+C;IAC/C,OAAO,CAAC,OAAO,CAAmB;IAClC,uEAAuE;IACvE,OAAO,CAAC,OAAO,CAAmB;IAGlC;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAmB;IAEtC,4DAA4D;IAC5D,OAAO,CAAC,aAAa,CAAmB;IACxC,8DAA8D;IAC9D,OAAO,CAAC,aAAa,CAAmB;IAExC;;;OAGG;IACH,OAAO,CAAC,qBAAqB,CAA+B;IAE5D,2CAA2C;IAC3C,OAAO,CAAC,UAAU,CAAS;IAE3B;;OAEG;IACH,YAAY,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,iBAAiB,EAoBtE;IAED;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAc3D;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAclE;IAED;;;;;OAKG;IACH,UAAU,SAkBT;IAED;;OAEG;IACH,OAAO,YAEN;IAED;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjC;IAED;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAe1C;IAED;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU5D;IAED;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExB;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAKjC;IAED;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAGjC;IAED;;OAEG;IACH,aAAa,IAAI,iBAAiB,CAUjC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAKpC;IAED;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,QAIlF;IAED;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAM/C;CACF"}
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"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"}
package/dist/tags.js CHANGED
@@ -8,21 +8,26 @@
8
8
  * @module
9
9
  */
10
10
  import StringTable from "./stringtable.js";
11
- import { ResizeableTypedArray as RTA } from "./typed-arrays.js";
11
+ import { BufferConstructor, ResizeableTypedArray as RTA } from "./typed-arrays.js";
12
+ const TAG_RANK_BLOCK_SIZE = 256;
13
+ const TAG_BITS_PER_WORD = 32;
12
14
  /**
13
15
  * Bidirectional tag storage.
14
16
  *
15
- * Limits: Max 255 tags per entity.
16
17
  * Note: String indices reference a shared `StringTable`.
17
18
  */
18
19
  export class Tags {
19
20
  /** Reference to the shared string table for key/value storage */
20
21
  stringTable = new StringTable();
21
22
  // ─── Entity → Tag Lookup ───────────────────────────────────────────────────
22
- /** Maps entity index → start position in tagKeys/tagVals */
23
- tagStart;
24
- /** Maps entity index → number of tags (max 255) */
25
- tagCount;
23
+ /** Exact number of entities represented by this tag index. */
24
+ entityCount = 0;
25
+ /** One presence bit per entity. */
26
+ taggedEntityBits;
27
+ /** Tagged-entity prefix count at each 256-entity boundary. */
28
+ tagRankCheckpoints;
29
+ /** Tag offsets for tagged entities, including a final sentinel. */
30
+ tagOffsets;
26
31
  /** All tag key string indices, concatenated */
27
32
  tagKeys;
28
33
  /** All tag value string indices, concatenated (parallel to tagKeys) */
@@ -42,6 +47,10 @@ export class Tags {
42
47
  * Converted to flat arrays during buildIndex() and then cleared.
43
48
  */
44
49
  keyEntityIndexBuilder = new Map();
50
+ /** Tagged entity indexes collected during ingestion and released on finalization. */
51
+ taggedEntityIndexBuilder;
52
+ /** Largest tagged entity index seen so far; enforces ascending ingestion order. */
53
+ lastTaggedEntityIndex = -1;
45
54
  /** Whether buildIndex() has been called */
46
55
  indexBuilt = false;
47
56
  /**
@@ -50,23 +59,28 @@ export class Tags {
50
59
  constructor(stringTable, transferables) {
51
60
  this.stringTable = stringTable;
52
61
  if (transferables) {
53
- this.tagStart = RTA.from(Uint32Array, transferables.tagStart);
54
- this.tagCount = RTA.from(Uint8Array, transferables.tagCount);
62
+ this.entityCount = transferables.tagEntityCount;
63
+ this.taggedEntityBits = new Uint32Array(transferables.taggedEntityBits);
64
+ this.tagRankCheckpoints = new Uint32Array(transferables.tagRankCheckpoints);
65
+ this.tagOffsets = RTA.from(Uint32Array, transferables.tagOffsets);
55
66
  this.tagKeys = RTA.from(Uint32Array, transferables.tagKeys);
56
67
  this.tagVals = RTA.from(Uint32Array, transferables.tagVals);
57
68
  this.keyEntities = RTA.from(Uint32Array, transferables.keyEntities);
58
69
  this.keyIndexStart = RTA.from(Uint32Array, transferables.keyIndexStart);
59
70
  this.keyIndexCount = RTA.from(Uint32Array, transferables.keyIndexCount);
71
+ this.taggedEntityIndexBuilder = null;
60
72
  this.indexBuilt = true;
61
73
  }
62
74
  else {
63
- this.tagStart = new RTA(Uint32Array);
64
- this.tagCount = new RTA(Uint8Array);
75
+ this.taggedEntityBits = new Uint32Array(new BufferConstructor(0));
76
+ this.tagRankCheckpoints = new Uint32Array(new BufferConstructor(0));
77
+ this.tagOffsets = new RTA(Uint32Array);
65
78
  this.tagKeys = new RTA(Uint32Array);
66
79
  this.tagVals = new RTA(Uint32Array);
67
80
  this.keyEntities = new RTA(Uint32Array);
68
81
  this.keyIndexStart = new RTA(Uint32Array);
69
82
  this.keyIndexCount = new RTA(Uint32Array);
83
+ this.taggedEntityIndexBuilder = new RTA(Uint32Array);
70
84
  }
71
85
  }
72
86
  /**
@@ -86,10 +100,29 @@ export class Tags {
86
100
  }
87
101
  /**
88
102
  * Add tags to an entity using key and value indexes.
103
+ *
104
+ * Tagged entities must be added in strictly ascending entity-index order and
105
+ * at most once per entity: the rank/popcount lookup orders tagged entities by
106
+ * index while `tagOffsets` records them in call order, so an out-of-order or
107
+ * repeated tagged index would silently misalign every later entity's tags.
108
+ * `Entities.addEntity` (append-only) satisfies this naturally.
89
109
  */
90
110
  addTagKeysAndValues(index, keys, values) {
91
- this.tagStart.set(index, this.tagKeys.length);
92
- this.tagCount.set(index, keys.length);
111
+ if (this.indexBuilt)
112
+ throw Error("Tag index already built.");
113
+ if (keys.length !== values.length)
114
+ throw Error("Tag keys and values must have equal length.");
115
+ if (index < 0)
116
+ throw Error(`Invalid entity index: ${index}`);
117
+ this.entityCount = Math.max(this.entityCount, index + 1);
118
+ if (keys.length === 0)
119
+ return;
120
+ if (index <= this.lastTaggedEntityIndex) {
121
+ throw Error(`Tagged entity ${index} added out of order (last tagged entity: ${this.lastTaggedEntityIndex}). Tagged entities must be added once, in ascending index order.`);
122
+ }
123
+ this.lastTaggedEntityIndex = index;
124
+ this.taggedEntityIndexBuilder?.push(index);
125
+ this.tagOffsets.push(this.tagKeys.length);
93
126
  this.tagKeys.pushMany(keys);
94
127
  this.tagVals.pushMany(values);
95
128
  keys.forEach((key) => {
@@ -109,8 +142,32 @@ export class Tags {
109
142
  * Must be called before `hasKey()`.
110
143
  */
111
144
  buildIndex() {
112
- this.tagStart.compact();
113
- this.tagCount.compact();
145
+ if (this.indexBuilt)
146
+ return;
147
+ const taggedEntityIndexes = this.taggedEntityIndexBuilder;
148
+ if (!taggedEntityIndexes)
149
+ throw Error("Tagged entity builder is unavailable.");
150
+ const bitWordCount = Math.ceil(this.entityCount / TAG_BITS_PER_WORD);
151
+ this.taggedEntityBits = new Uint32Array(new BufferConstructor(bitWordCount * Uint32Array.BYTES_PER_ELEMENT));
152
+ for (let i = 0; i < taggedEntityIndexes.length; i++) {
153
+ const entityIndex = taggedEntityIndexes.at(i);
154
+ const wordIndex = entityIndex >>> 5;
155
+ this.taggedEntityBits[wordIndex] =
156
+ (this.taggedEntityBits[wordIndex] ?? 0) | (1 << (entityIndex & 31));
157
+ }
158
+ const checkpointCount = Math.ceil(this.entityCount / TAG_RANK_BLOCK_SIZE) + 1;
159
+ this.tagRankCheckpoints = new Uint32Array(new BufferConstructor(checkpointCount * Uint32Array.BYTES_PER_ELEMENT));
160
+ let taggedIndex = 0;
161
+ for (let checkpoint = 0; checkpoint < checkpointCount; checkpoint++) {
162
+ const entityBoundary = checkpoint * TAG_RANK_BLOCK_SIZE;
163
+ while (taggedIndex < taggedEntityIndexes.length &&
164
+ taggedEntityIndexes.at(taggedIndex) < entityBoundary) {
165
+ taggedIndex++;
166
+ }
167
+ this.tagRankCheckpoints[checkpoint] = taggedIndex;
168
+ }
169
+ this.tagOffsets.push(this.tagKeys.length);
170
+ this.tagOffsets.compact();
114
171
  this.tagKeys.compact();
115
172
  this.tagVals.compact();
116
173
  // Convert the builder map to flat arrays for the reverse index
@@ -119,9 +176,11 @@ export class Tags {
119
176
  this.keyIndexCount.set(keyIndex, entityIndexes.length);
120
177
  this.keyEntities.pushMany(entityIndexes);
121
178
  }
179
+ this.keyEntities.compact();
122
180
  this.keyIndexStart.compact();
123
181
  this.keyIndexCount.compact();
124
182
  this.keyEntityIndexBuilder.clear();
183
+ this.taggedEntityIndexBuilder = null;
125
184
  this.indexBuilt = true;
126
185
  }
127
186
  /**
@@ -134,16 +193,42 @@ export class Tags {
134
193
  * Get the number of tags for an entity.
135
194
  */
136
195
  cardinality(index) {
137
- return this.tagCount.at(index) ?? 0;
196
+ const taggedIndex = this.getTaggedEntityIndex(index);
197
+ if (taggedIndex === -1)
198
+ return 0;
199
+ return this.tagOffsets.at(taggedIndex + 1) - this.tagOffsets.at(taggedIndex);
200
+ }
201
+ /** Number of entities that have at least one tag. */
202
+ get taggedEntityCount() {
203
+ return this.indexBuilt
204
+ ? Math.max(0, this.tagOffsets.length - 1)
205
+ : (this.taggedEntityIndexBuilder?.length ?? 0);
206
+ }
207
+ /** Iterate tagged entity indexes without allocating an intermediate array. */
208
+ *taggedEntityIndexes() {
209
+ if (!this.indexBuilt)
210
+ throw Error("Tag index not built.");
211
+ for (let wordIndex = 0; wordIndex < this.taggedEntityBits.length; wordIndex++) {
212
+ let word = this.taggedEntityBits[wordIndex] ?? 0;
213
+ while (word !== 0) {
214
+ const lowestBit = word & -word;
215
+ const bit = 31 - Math.clz32(lowestBit);
216
+ const entityIndex = wordIndex * TAG_BITS_PER_WORD + bit;
217
+ if (entityIndex < this.entityCount)
218
+ yield entityIndex;
219
+ word = (word & (word - 1)) >>> 0;
220
+ }
221
+ }
138
222
  }
139
223
  /**
140
224
  * Get the tags for an entity.
141
225
  */
142
226
  getTags(index) {
143
- const tagCount = this.tagCount.at(index) ?? 0;
144
- if (tagCount === 0)
227
+ const taggedIndex = this.getTaggedEntityIndex(index);
228
+ if (taggedIndex === -1)
145
229
  return;
146
- const tagStart = this.tagStart.at(index) ?? 0;
230
+ const tagStart = this.tagOffsets.at(taggedIndex);
231
+ const tagCount = this.tagOffsets.at(taggedIndex + 1) - tagStart;
147
232
  const tagKeyIndexes = this.tagKeys.array.slice(tagStart, tagStart + tagCount);
148
233
  const tagValIndexes = this.tagVals.array.slice(tagStart, tagStart + tagCount);
149
234
  const tags = {};
@@ -180,7 +265,9 @@ export class Tags {
180
265
  * Get all entity indexes that have a specific tag key.
181
266
  */
182
267
  hasKey(keyIndex) {
183
- if (keyIndex < 0)
268
+ if (keyIndex < 0 ||
269
+ keyIndex >= this.keyIndexStart.length ||
270
+ keyIndex >= this.keyIndexCount.length)
184
271
  return [];
185
272
  const start = this.keyIndexStart.at(keyIndex) ?? 0;
186
273
  const count = this.keyIndexCount.at(keyIndex) ?? 0;
@@ -199,8 +286,10 @@ export class Tags {
199
286
  */
200
287
  transferables() {
201
288
  return {
202
- tagStart: this.tagStart.array.buffer,
203
- tagCount: this.tagCount.array.buffer,
289
+ tagEntityCount: this.entityCount,
290
+ taggedEntityBits: this.taggedEntityBits.buffer,
291
+ tagRankCheckpoints: this.tagRankCheckpoints.buffer,
292
+ tagOffsets: this.tagOffsets.array.buffer,
204
293
  tagKeys: this.tagKeys.array.buffer,
205
294
  tagVals: this.tagVals.array.buffer,
206
295
  keyEntities: this.keyEntities.array.buffer,
@@ -209,11 +298,16 @@ export class Tags {
209
298
  };
210
299
  }
211
300
  /**
212
- * Get the approximate memory requirements for a given number of tags in bytes.
301
+ * Get the approximate memory requirements for a tag index in bytes.
302
+ *
303
+ * @param tagCount - Total key/value pairs. Each costs 12 bytes: key, value and the
304
+ * reverse key → entity index. The small per-key index arrays are not counted.
213
305
  */
214
- static getBytesRequired(count) {
215
- return (count * Uint32Array.BYTES_PER_ELEMENT + // tagStart
216
- count * Uint8Array.BYTES_PER_ELEMENT // tagCount
306
+ static getBytesRequired(entityCount, taggedEntityCount = entityCount, tagCount = 0) {
307
+ return (Math.ceil(entityCount / TAG_BITS_PER_WORD) * Uint32Array.BYTES_PER_ELEMENT +
308
+ (Math.ceil(entityCount / TAG_RANK_BLOCK_SIZE) + 1) * Uint32Array.BYTES_PER_ELEMENT +
309
+ (taggedEntityCount + 1) * Uint32Array.BYTES_PER_ELEMENT +
310
+ tagCount * 3 * Uint32Array.BYTES_PER_ELEMENT // tagKeys + tagVals + keyEntities
217
311
  );
218
312
  }
219
313
  /**
@@ -230,10 +324,42 @@ export class Tags {
230
324
  */
231
325
  updateHash(hasher) {
232
326
  return hasher
233
- .update(this.tagStart.array)
234
- .update(this.tagCount.array)
327
+ .updateNumber(this.entityCount)
328
+ .update(this.taggedEntityBits)
329
+ .update(this.tagOffsets.array)
235
330
  .update(this.tagKeys.array)
236
331
  .update(this.tagVals.array);
237
332
  }
333
+ /**
334
+ * Return the compact tagged-entity ordinal, or -1 when the entity has no tags.
335
+ *
336
+ * The ordinal is the entity's rank among tagged entities: read the cached
337
+ * prefix count at the nearest 256-entity checkpoint, popcount the presence
338
+ * words between the checkpoint and the entity's word, then popcount the bits
339
+ * below the entity within its own word. The result indexes `tagOffsets`.
340
+ */
341
+ getTaggedEntityIndex(index) {
342
+ if (index < 0 || index >= this.entityCount)
343
+ return -1;
344
+ const wordIndex = index >>> 5;
345
+ const word = this.taggedEntityBits[wordIndex] ?? 0;
346
+ const bit = index & 31;
347
+ if ((word & (1 << bit)) === 0)
348
+ return -1;
349
+ const checkpoint = index >>> 8;
350
+ let rank = this.tagRankCheckpoints[checkpoint] ?? 0;
351
+ const checkpointWord = checkpoint * (TAG_RANK_BLOCK_SIZE / TAG_BITS_PER_WORD);
352
+ for (let i = checkpointWord; i < wordIndex; i++) {
353
+ rank += popcount(this.taggedEntityBits[i] ?? 0);
354
+ }
355
+ const lowerBitMask = bit === 0 ? 0 : 0xffffffff >>> (TAG_BITS_PER_WORD - bit);
356
+ return rank + popcount(word & lowerBitMask);
357
+ }
358
+ }
359
+ /** Count set bits in an unsigned 32-bit integer. */
360
+ function popcount(value) {
361
+ const pairs = value - ((value >>> 1) & 0x55555555);
362
+ const nibbles = (pairs & 0x33333333) + ((pairs >>> 2) & 0x33333333);
363
+ return (((nibbles + (nibbles >>> 4)) & 0x0f0f0f0f) * 0x01010101) >>> 24;
238
364
  }
239
365
  //# sourceMappingURL=tags.js.map
package/dist/tags.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tags.js","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAmB,oBAAoB,IAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAuBjF;;;;;GAKG;AACH,MAAM,OAAO,IAAI;IACf,iEAAiE;IACzD,WAAW,GAAgB,IAAI,WAAW,EAAE,CAAC;IAErD,8EAA8E;IAC9E,4DAA4D;IACpD,QAAQ,CAAmB;IACnC,mDAAmD;IAC3C,QAAQ,CAAkB;IAClC,+CAA+C;IACvC,OAAO,CAAmB;IAClC,uEAAuE;IAC/D,OAAO,CAAmB;IAElC,8EAA8E;IAC9E;;;OAGG;IACK,WAAW,CAAmB;IAEtC,4DAA4D;IACpD,aAAa,CAAmB;IACxC,8DAA8D;IACtD,aAAa,CAAmB;IAExC;;;OAGG;IACK,qBAAqB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE5D,2CAA2C;IACnC,UAAU,GAAG,KAAK,CAAC;IAE3B;;OAEG;IACH,YAAY,WAAwB,EAAE,aAAiC;QACrE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5D,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;YACpE,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAa,EAAE,IAAc;QACnC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEpD,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAa,EAAE,IAAc,EAAE,MAAgB;QACjE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE9B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,UAAU;QACR,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAEvB,+DAA+D;QAC/D,KAAK,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACnE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QAEnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAa;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;QAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAY,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;gBAClD,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,IAAc,EAAE,MAAgB;QACjD,MAAM,IAAI,GAAY,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;gBAClD,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAW;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAgB;QACrB,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,GAAW,EAAE,GAAW;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACtC,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;YACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;YACpC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;YAClC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM;YAC1C,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM;YAC9C,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM;SAC/C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAa;QACnC,OAAO,CACL,KAAK,GAAG,WAAW,CAAC,iBAAiB,GAAG,WAAW;YACnD,KAAK,GAAG,UAAU,CAAC,iBAAiB,CAAC,WAAW;SACjD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,WAAwB,EAAE,aAAgC;QACjF,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACtD,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,MAAqB;QAC9B,OAAO,MAAM;aACV,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;aAC3B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;aAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;aAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"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"}
@@ -22,9 +22,32 @@ export type TypedArray<B extends BufferType = BufferType> = Int8Array<B> | Uint8
22
22
  * Constructor interface for typed arrays.
23
23
  */
24
24
  export interface TypedArrayConstructor<T extends TypedArray<BufferType> = TypedArray<BufferType>> {
25
- new (buffer: BufferType): T;
25
+ new (buffer: BufferType, byteOffset?: number, length?: number): T;
26
26
  readonly BYTES_PER_ELEMENT: number;
27
+ readonly name: string;
27
28
  }
29
+ export type TypedBufferAllocationOperation = "create" | "grow" | "compact";
30
+ export type TypedBufferType = "array-buffer" | "shared-array-buffer";
31
+ /** Structured allocation failure suitable for transport across worker boundaries. */
32
+ export declare class TypedBufferAllocationError extends Error {
33
+ readonly code = "TYPED_BUFFER_ALLOCATION_FAILED";
34
+ readonly stage = "typed-buffer-allocation";
35
+ readonly operation: TypedBufferAllocationOperation;
36
+ readonly typedArray: string;
37
+ readonly bufferType: TypedBufferType;
38
+ readonly elementCount: number;
39
+ readonly bytesPerElement: number;
40
+ readonly requiredBytes: number;
41
+ constructor(args: {
42
+ operation: TypedBufferAllocationOperation;
43
+ typedArray: string;
44
+ bufferType: TypedBufferType;
45
+ elementCount: number;
46
+ bytesPerElement: number;
47
+ requiredBytes: number;
48
+ }, cause: unknown);
49
+ }
50
+ type BufferConstructorType = SharedArrayBufferConstructor | ArrayBufferConstructor;
28
51
  /**
29
52
  * Float64Array for storing OSM IDs.
30
53
  *
@@ -33,49 +56,31 @@ export interface TypedArrayConstructor<T extends TypedArray<BufferType> = TypedA
33
56
  * Float64Array allows typed array operations while maintaining precision.
34
57
  */
35
58
  export declare const IdArrayType: Float64ArrayConstructor;
36
- /**
37
- * Uint32Array for storing array indices.
38
- *
39
- * Internal indices into typed arrays never exceed 2^32 elements,
40
- * so Uint32Array provides the best balance of range and memory efficiency.
41
- */
42
- export declare const IndexArrayType: Uint32ArrayConstructor;
43
- /**
44
- * Initial buffer size for ResizeableTypedArray.
45
- * 1 MiB provides reasonable initial capacity while avoiding excessive memory allocation.
46
- */
47
- export declare const DEFAULT_BUFFER_SIZE: number;
48
59
  /**
49
60
  * Auto-expanding typed array wrapper.
50
61
  *
51
- * - `push()` appends elements, doubling buffer size as needed.
52
- * - `compact()` shrinks buffer to fit data.
53
- * - Supports growable SharedArrayBuffer and resizable ArrayBuffer.
62
+ * - `push()` / `pushMany()` append, growing the buffer in place when the runtime supports
63
+ * growable buffers, otherwise by reallocating.
64
+ * - `array` is a view of the stored items only; `compact()` shrinks the buffer to fit them.
65
+ * - `from()` wraps a finished (transferred) buffer, which can still grow.
54
66
  */
55
67
  export declare class ResizeableTypedArray<TA extends TypedArray> {
56
68
  /** The typed array constructor for this instance */
57
- ArrayType: TypedArrayConstructor<TA>;
58
- /** The current typed array view into the buffer */
59
- array: TA;
60
- /** Number of items actually stored (may be less than array.length) */
61
- items: number;
62
- /** The underlying ArrayBuffer or SharedArrayBuffer */
63
- buffer: BufferType;
64
- /** Current buffer size in bytes */
65
- bufferSize: number;
66
- /** Maximum byte length for growable buffers */
67
- maxByteLength: number;
69
+ readonly ArrayType: TypedArrayConstructor<TA>;
68
70
  /** Buffer constructor (SharedArrayBuffer or ArrayBuffer) */
69
- BC: SharedArrayBufferConstructor | ArrayBufferConstructor;
71
+ private readonly BC;
72
+ /** View of the whole buffer: stored items, then spare capacity. */
73
+ private view;
74
+ /** Number of items actually stored (may be less than the capacity). */
75
+ private items;
70
76
  /**
71
- * Reconstruct a ResizeableTypedArray from an existing buffer.
72
- *
73
- * Used after transferring buffers between workers. The resulting array
74
- * is considered "compacted" with items = array.length.
75
- *
76
- * @param ArrayType - The typed array constructor.
77
- * @param buffer - The existing buffer to wrap.
78
- * @returns A new ResizeableTypedArray wrapping the buffer.
77
+ * The buffer size a new column reaches when it is filled one `push` at a time to
78
+ * `requiredBytes`, for projecting peak memory before a load.
79
+ */
80
+ static capacityBytesFor(requiredBytes: number, bytesPerElement: number): number;
81
+ /**
82
+ * Wrap an existing buffer, as after transferring it between workers. Every element of the
83
+ * buffer is a stored item. Nothing is allocated until the array grows.
79
84
  */
80
85
  static from<TA extends TypedArray>(ArrayType: TypedArrayConstructor<TA>, buffer: BufferType): ResizeableTypedArray<TA>;
81
86
  /**
@@ -84,25 +89,26 @@ export declare class ResizeableTypedArray<TA extends TypedArray> {
84
89
  * @param ArrayType - The typed array constructor (e.g., Float64Array).
85
90
  * @param BC - Buffer constructor to use (defaults to SharedArrayBuffer if available).
86
91
  */
87
- constructor(ArrayType: TypedArrayConstructor<TA>, BC?: SharedArrayBufferConstructor | ArrayBufferConstructor);
88
- /**
89
- * Iterate over the array values.
90
- */
92
+ constructor(ArrayType: TypedArrayConstructor<TA>, BC?: BufferConstructorType,
93
+ /** @internal A view to wrap instead of allocating; used by `from()`. */
94
+ view?: TA);
95
+ /** The stored items. Before `compact()`, a view that excludes the spare capacity. */
96
+ get array(): TA;
97
+ /** The underlying buffer, including any spare capacity. */
98
+ get buffer(): BufferType;
99
+ get length(): number;
100
+ /** Number of items the current buffer can hold before it must grow. */
101
+ get capacity(): number;
102
+ /** Iterate over the stored values. */
91
103
  [Symbol.iterator](): ArrayIterator<number>;
92
- /**
93
- * Double the buffer capacity.
94
- * Uses in-place grow/resize if supported, otherwise allocates new buffer and copies.
95
- */
96
- expandArray(): void;
97
104
  /**
98
105
  * Get the value at an index. Handles negative indices.
99
106
  */
100
107
  at(index: number): number;
101
108
  /**
102
- * Get a slice of the array.
109
+ * Get a copy of a range of the stored items.
103
110
  */
104
111
  slice(start: number, end: number): Float32Array<ArrayBuffer> | Float64Array<ArrayBuffer> | Int16Array<ArrayBuffer> | Int32Array<ArrayBuffer> | Int8Array<ArrayBuffer> | Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer> | Uint8Array<ArrayBuffer> | Uint8ClampedArray<ArrayBuffer>;
105
- get length(): number;
106
112
  /**
107
113
  * Push a value to the end of the array.
108
114
  */
@@ -114,11 +120,20 @@ export declare class ResizeableTypedArray<TA extends TypedArray> {
114
120
  /**
115
121
  * Push multiple values to the end of the array.
116
122
  */
117
- pushMany(values: number[] | TypedArray): void;
123
+ pushMany(values: ArrayLike<number>): void;
118
124
  /**
119
125
  * Shrink the buffer to exactly fit stored items.
120
126
  * Buffer becomes fixed-length after compacting.
121
127
  */
122
128
  compact(): TA;
129
+ /** Make room for `count` items: grow in place if the buffer can, otherwise reallocate. */
130
+ private ensureCapacity;
131
+ /**
132
+ * Allocate `byteLength` bytes that can grow in place up to `reserveBytes` when the runtime
133
+ * allows. A failed reservation falls back to a buffer that doubles once, then to fixed size.
134
+ */
135
+ private allocate;
136
+ private allocationError;
123
137
  }
138
+ export {};
124
139
  //# sourceMappingURL=typed-arrays.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"typed-arrays.d.ts","sourceRoot":"","sources":["../src/typed-arrays.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,uDAGe,CAAC;AAE9C,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,IACpD,SAAS,CAAC,CAAC,CAAC,GACZ,UAAU,CAAC,CAAC,CAAC,GACb,iBAAiB,CAAC,CAAC,CAAC,GACpB,UAAU,CAAC,CAAC,CAAC,GACb,WAAW,CAAC,CAAC,CAAC,GACd,UAAU,CAAC,CAAC,CAAC,GACb,WAAW,CAAC,CAAC,CAAC,GACd,YAAY,CAAC,CAAC,CAAC,GACf,YAAY,CAAC,CAAC,CAAC,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC;IAC9F,KAAK,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,yBAAe,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,wBAAc,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QAAU,CAAC;AAE3C;;;;;;GAMG;AACH,qBAAa,oBAAoB,CAAC,EAAE,SAAS,UAAU;IACrD,oDAAoD;IACpD,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;IACrC,mDAAmD;IACnD,KAAK,EAAE,EAAE,CAAC;IACV,sEAAsE;IACtE,KAAK,SAAK;IAEV,sDAAsD;IACtD,MAAM,EAAE,UAAU,CAAC;IACnB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IAEtB,4DAA4D;IAC5D,EAAE,EAAE,4BAA4B,GAAG,sBAAsB,CAAC;IAE1D;;;;;;;;;OASG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,UAAU,EAAE,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,4BAS1F;IAED;;;;;OAKG;IACH,YACE,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,EACpC,EAAE,GAAE,4BAA4B,GAAG,sBAA0C,EAU9E;IAED;;OAEG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAEzC;IAED;;;OAGG;IACH,WAAW,SAsBV;IAED;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOxB;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,uPAE/B;IAED,IAAI,MAAM,WAET;IAED;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM1B;IAED;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAO/B;IAED;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,QAIrC;IAED;;;OAGG;IACH,OAAO,OAYN;CACF"}
1
+ {"version":3,"file":"typed-arrays.d.ts","sourceRoot":"","sources":["../src/typed-arrays.ts"],"names":[],"mappings":"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"}