@maplibre/mlt 1.1.6 → 1.1.7

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 (173) hide show
  1. package/dist/decoding/bigEndianDecode.d.ts +13 -0
  2. package/dist/decoding/bigEndianDecode.js +50 -0
  3. package/dist/decoding/bigEndianDecode.js.map +1 -0
  4. package/dist/decoding/decodingTestUtils.d.ts +1 -1
  5. package/dist/decoding/decodingTestUtils.js.map +1 -1
  6. package/dist/decoding/decodingUtils.js +4 -2
  7. package/dist/decoding/decodingUtils.js.map +1 -1
  8. package/dist/decoding/fastPforDecoder.d.ts +48 -0
  9. package/dist/decoding/fastPforDecoder.js +482 -0
  10. package/dist/decoding/fastPforDecoder.js.map +1 -0
  11. package/dist/decoding/fastPforShared.d.ts +9 -0
  12. package/dist/decoding/fastPforShared.js +29 -0
  13. package/dist/decoding/fastPforShared.js.map +1 -0
  14. package/dist/decoding/fastPforUnpack.d.ts +23 -0
  15. package/dist/decoding/fastPforUnpack.js +910 -0
  16. package/dist/decoding/fastPforUnpack.js.map +1 -0
  17. package/dist/decoding/geometryDecoder.d.ts +2 -2
  18. package/dist/decoding/geometryDecoder.js +11 -8
  19. package/dist/decoding/geometryDecoder.js.map +1 -1
  20. package/dist/decoding/integerDecodingUtils.d.ts +14 -10
  21. package/dist/decoding/integerDecodingUtils.js +44 -22
  22. package/dist/decoding/integerDecodingUtils.js.map +1 -1
  23. package/dist/decoding/integerStreamDecoder.d.ts +1 -1
  24. package/dist/decoding/integerStreamDecoder.js +13 -6
  25. package/dist/decoding/integerStreamDecoder.js.map +1 -1
  26. package/dist/decoding/propertyDecoder.js +10 -14
  27. package/dist/decoding/propertyDecoder.js.map +1 -1
  28. package/dist/decoding/stringDecoder.js +1 -4
  29. package/dist/decoding/stringDecoder.js.map +1 -1
  30. package/dist/encoding/bigEndianEncode.d.ts +7 -0
  31. package/dist/encoding/bigEndianEncode.js +16 -0
  32. package/dist/encoding/bigEndianEncode.js.map +1 -0
  33. package/dist/encoding/constGeometryVectorEncoder.d.ts +19 -0
  34. package/dist/encoding/constGeometryVectorEncoder.js +248 -0
  35. package/dist/encoding/constGeometryVectorEncoder.js.map +1 -0
  36. package/dist/encoding/encodingUtils.d.ts +1 -1
  37. package/dist/encoding/encodingUtils.js +2 -2
  38. package/dist/encoding/encodingUtils.js.map +1 -1
  39. package/dist/encoding/fastPforEncoder.d.ts +19 -0
  40. package/dist/encoding/fastPforEncoder.js +310 -0
  41. package/dist/encoding/fastPforEncoder.js.map +1 -0
  42. package/dist/encoding/integerEncodingUtils.d.ts +7 -7
  43. package/dist/encoding/integerEncodingUtils.js +25 -17
  44. package/dist/encoding/integerEncodingUtils.js.map +1 -1
  45. package/dist/encoding/integerStreamEncoder.d.ts +1 -1
  46. package/dist/encoding/integerStreamEncoder.js +5 -5
  47. package/dist/encoding/integerStreamEncoder.js.map +1 -1
  48. package/dist/encoding/packNullableUtils.d.ts +1 -1
  49. package/dist/encoding/packNullableUtils.js.map +1 -1
  50. package/dist/encoding/propertyEncoder.d.ts +1 -1
  51. package/dist/encoding/propertyEncoder.js +8 -8
  52. package/dist/encoding/propertyEncoder.js.map +1 -1
  53. package/dist/encoding/stringEncoder.js +3 -3
  54. package/dist/encoding/stringEncoder.js.map +1 -1
  55. package/dist/encoding/zOrderCurveEncoder.js +1 -1
  56. package/dist/encoding/zOrderCurveEncoder.js.map +1 -1
  57. package/dist/metadata/tile/logicalStreamType.d.ts +3 -3
  58. package/dist/metadata/tile/logicalStreamType.js.map +1 -1
  59. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.d.ts +1 -1
  60. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.js.map +1 -1
  61. package/dist/metadata/tileset/typeMap.d.ts +10 -2
  62. package/dist/metadata/tileset/typeMap.js +25 -15
  63. package/dist/metadata/tileset/typeMap.js.map +1 -1
  64. package/dist/mltDecoder.js +29 -26
  65. package/dist/mltDecoder.js.map +1 -1
  66. package/dist/mltMetadata.js.map +1 -1
  67. package/dist/vector/constant/intConstVector.d.ts +1 -1
  68. package/dist/vector/constant/intConstVector.js +1 -1
  69. package/dist/vector/constant/intConstVector.js.map +1 -1
  70. package/dist/vector/constant/longConstVector.d.ts +1 -1
  71. package/dist/vector/constant/longConstVector.js +1 -1
  72. package/dist/vector/constant/longConstVector.js.map +1 -1
  73. package/dist/vector/dictionary/stringDictionaryVector.d.ts +0 -1
  74. package/dist/vector/dictionary/stringDictionaryVector.js +0 -2
  75. package/dist/vector/dictionary/stringDictionaryVector.js.map +1 -1
  76. package/dist/vector/featureTable.d.ts +4 -5
  77. package/dist/vector/featureTable.js +2 -29
  78. package/dist/vector/featureTable.js.map +1 -1
  79. package/dist/vector/filter/flatSelectionVector.d.ts +1 -1
  80. package/dist/vector/filter/flatSelectionVector.js.map +1 -1
  81. package/dist/vector/filter/selectionVectorUtils.d.ts +1 -1
  82. package/dist/vector/filter/selectionVectorUtils.js.map +1 -1
  83. package/dist/vector/filter/sequenceSelectionVector.d.ts +1 -1
  84. package/dist/vector/filter/sequenceSelectionVector.js.map +1 -1
  85. package/dist/vector/flat/stringFlatVector.d.ts +0 -1
  86. package/dist/vector/flat/stringFlatVector.js +0 -2
  87. package/dist/vector/flat/stringFlatVector.js.map +1 -1
  88. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.d.ts +0 -2
  89. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.js +0 -36
  90. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.js.map +1 -1
  91. package/dist/vector/geometry/constGeometryVector.d.ts +2 -2
  92. package/dist/vector/geometry/constGeometryVector.js +1 -1
  93. package/dist/vector/geometry/constGeometryVector.js.map +1 -1
  94. package/dist/vector/geometry/constGpuVector.d.ts +2 -2
  95. package/dist/vector/geometry/constGpuVector.js +1 -1
  96. package/dist/vector/geometry/constGpuVector.js.map +1 -1
  97. package/dist/vector/geometry/flatGeometryVector.d.ts +1 -1
  98. package/dist/vector/geometry/flatGeometryVector.js.map +1 -1
  99. package/dist/vector/geometry/flatGpuVector.d.ts +1 -1
  100. package/dist/vector/geometry/flatGpuVector.js.map +1 -1
  101. package/dist/vector/geometry/geometryType.js.map +1 -1
  102. package/dist/vector/geometry/geometryVector.d.ts +4 -5
  103. package/dist/vector/geometry/geometryVector.js +0 -8
  104. package/dist/vector/geometry/geometryVector.js.map +1 -1
  105. package/dist/vector/geometry/geometryVectorConverter.d.ts +1 -1
  106. package/dist/vector/geometry/geometryVectorConverter.js +167 -211
  107. package/dist/vector/geometry/geometryVectorConverter.js.map +1 -1
  108. package/dist/vector/geometry/gpuVector.d.ts +2 -2
  109. package/dist/vector/geometry/gpuVector.js.map +1 -1
  110. package/dist/vector/geometry/topologyVector.d.ts +5 -9
  111. package/dist/vector/geometry/topologyVector.js +1 -19
  112. package/dist/vector/geometry/topologyVector.js.map +1 -1
  113. package/dist/vector/geometry/vertexBufferType.js.map +1 -1
  114. package/dist/vector/intVector.d.ts +7 -7
  115. package/dist/vector/intVector.js.map +1 -1
  116. package/dist/vector/vector.js +1 -1
  117. package/dist/vector/vector.js.map +1 -1
  118. package/dist/vector/vectorType.js.map +1 -1
  119. package/package.json +9 -10
  120. package/dist/decoding/decodingUtils.spec.d.ts +0 -1
  121. package/dist/decoding/decodingUtils.spec.js +0 -141
  122. package/dist/decoding/decodingUtils.spec.js.map +0 -1
  123. package/dist/decoding/fsstDecoder.spec.d.ts +0 -1
  124. package/dist/decoding/fsstDecoder.spec.js +0 -57
  125. package/dist/decoding/fsstDecoder.spec.js.map +0 -1
  126. package/dist/decoding/integerDecodingUtils.spec.d.ts +0 -1
  127. package/dist/decoding/integerDecodingUtils.spec.js +0 -300
  128. package/dist/decoding/integerDecodingUtils.spec.js.map +0 -1
  129. package/dist/decoding/integerStreamDecoder.spec.d.ts +0 -1
  130. package/dist/decoding/integerStreamDecoder.spec.js +0 -402
  131. package/dist/decoding/integerStreamDecoder.spec.js.map +0 -1
  132. package/dist/decoding/propertyDecoder.spec.d.ts +0 -1
  133. package/dist/decoding/propertyDecoder.spec.js +0 -448
  134. package/dist/decoding/propertyDecoder.spec.js.map +0 -1
  135. package/dist/decoding/stringDecoder.spec.d.ts +0 -1
  136. package/dist/decoding/stringDecoder.spec.js +0 -387
  137. package/dist/decoding/stringDecoder.spec.js.map +0 -1
  138. package/dist/decoding/unpackNullableUtils.spec.d.ts +0 -1
  139. package/dist/decoding/unpackNullableUtils.spec.js +0 -71
  140. package/dist/decoding/unpackNullableUtils.spec.js.map +0 -1
  141. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.d.ts +0 -1
  142. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.js +0 -142
  143. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.js.map +0 -1
  144. package/dist/mltDecoder.spec.d.ts +0 -1
  145. package/dist/mltDecoder.spec.js +0 -152
  146. package/dist/mltDecoder.spec.js.map +0 -1
  147. package/dist/vector/filter/flatSelectionVector.spec.d.ts +0 -1
  148. package/dist/vector/filter/flatSelectionVector.spec.js +0 -51
  149. package/dist/vector/filter/flatSelectionVector.spec.js.map +0 -1
  150. package/dist/vector/filter/selectionVectorUtil.spec.d.ts +0 -1
  151. package/dist/vector/filter/selectionVectorUtil.spec.js +0 -154
  152. package/dist/vector/filter/selectionVectorUtil.spec.js.map +0 -1
  153. package/dist/vector/filter/sequenceSelectionVector.spec.d.ts +0 -1
  154. package/dist/vector/filter/sequenceSelectionVector.spec.js +0 -115
  155. package/dist/vector/filter/sequenceSelectionVector.spec.js.map +0 -1
  156. package/dist/vector/flat/floatFlatVector.spec.d.ts +0 -1
  157. package/dist/vector/flat/floatFlatVector.spec.js +0 -14
  158. package/dist/vector/flat/floatFlatVector.spec.js.map +0 -1
  159. package/dist/vector/flat/intFlatVector.spec.d.ts +0 -1
  160. package/dist/vector/flat/intFlatVector.spec.js +0 -15
  161. package/dist/vector/flat/intFlatVector.spec.js.map +0 -1
  162. package/dist/vector/flat/longFlatVector.spec.d.ts +0 -1
  163. package/dist/vector/flat/longFlatVector.spec.js +0 -14
  164. package/dist/vector/flat/longFlatVector.spec.js.map +0 -1
  165. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.d.ts +0 -1
  166. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.js +0 -28
  167. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.js.map +0 -1
  168. package/dist/vector/geometry/zOrderCurve.spec.d.ts +0 -1
  169. package/dist/vector/geometry/zOrderCurve.spec.js +0 -25
  170. package/dist/vector/geometry/zOrderCurve.spec.js.map +0 -1
  171. package/dist/vector/sequence/longSequenceVektor.spec.d.ts +0 -1
  172. package/dist/vector/sequence/longSequenceVektor.spec.js +0 -11
  173. package/dist/vector/sequence/longSequenceVektor.spec.js.map +0 -1
@@ -0,0 +1,482 @@
1
+ import { MASKS, DEFAULT_PAGE_SIZE, BLOCK_SIZE, greatestMultiple, roundUpToMultipleOf32, normalizePageSize, } from "./fastPforShared";
2
+ import { fastUnpack32_2, fastUnpack32_3, fastUnpack32_4, fastUnpack32_5, fastUnpack32_6, fastUnpack32_7, fastUnpack32_8, fastUnpack32_9, fastUnpack32_10, fastUnpack32_11, fastUnpack32_12, fastUnpack32_16, fastUnpack256_1, fastUnpack256_2, fastUnpack256_3, fastUnpack256_4, fastUnpack256_5, fastUnpack256_6, fastUnpack256_7, fastUnpack256_8, fastUnpack256_16, fastUnpack256_Generic, } from "./fastPforUnpack";
3
+ const MAX_BIT_WIDTH = 32;
4
+ const BIT_WIDTH_SLOTS = MAX_BIT_WIDTH + 1;
5
+ const PAGE_SIZE = normalizePageSize(DEFAULT_PAGE_SIZE);
6
+ const BYTE_CONTAINER_SIZE = ((3 * PAGE_SIZE) / BLOCK_SIZE + PAGE_SIZE) | 0;
7
+ /**
8
+ * Creates an isolated workspace for decoding.
9
+ * Reusing a workspace across calls avoids repeated allocations.
10
+ */
11
+ export function createDecoderWorkspace() {
12
+ const byteContainer = new Uint8Array(BYTE_CONTAINER_SIZE);
13
+ return {
14
+ dataToBePacked: new Array(BIT_WIDTH_SLOTS),
15
+ dataPointers: new Int32Array(BIT_WIDTH_SLOTS),
16
+ byteContainer,
17
+ byteContainerI32: new Int32Array(byteContainer.buffer, byteContainer.byteOffset, byteContainer.byteLength >>> 2),
18
+ exceptionSizes: new Int32Array(BIT_WIDTH_SLOTS),
19
+ };
20
+ }
21
+ export function createFastPforWireDecodeWorkspace(initialEncodedWordCapacity = 16) {
22
+ if (initialEncodedWordCapacity < 0) {
23
+ throw new RangeError(`initialEncodedWordCapacity must be >= 0, got ${initialEncodedWordCapacity}`);
24
+ }
25
+ const capacity = Math.max(16, initialEncodedWordCapacity | 0);
26
+ return {
27
+ encodedWords: new Int32Array(capacity),
28
+ decoderWorkspace: createDecoderWorkspace(),
29
+ };
30
+ }
31
+ export function ensureFastPforWireEncodedWordsCapacity(workspace, requiredWordCount) {
32
+ if (requiredWordCount <= workspace.encodedWords.length)
33
+ return workspace.encodedWords;
34
+ const next = new Int32Array(Math.max(16, requiredWordCount * 2));
35
+ workspace.encodedWords = next;
36
+ return next;
37
+ }
38
+ function materializeByteContainer(inValues, byteContainerStart, byteSize, workspace) {
39
+ if (workspace.byteContainer.length < byteSize) {
40
+ workspace.byteContainer = new Uint8Array(byteSize * 2);
41
+ workspace.byteContainerI32 = undefined;
42
+ }
43
+ const byteContainer = workspace.byteContainer;
44
+ const numFullInts = byteSize >>> 2;
45
+ if ((byteContainer.byteOffset & 3) === 0) {
46
+ let intView = workspace.byteContainerI32;
47
+ if (!intView ||
48
+ intView.buffer !== byteContainer.buffer ||
49
+ intView.byteOffset !== byteContainer.byteOffset ||
50
+ intView.length < numFullInts) {
51
+ intView = workspace.byteContainerI32 = new Int32Array(byteContainer.buffer, byteContainer.byteOffset, byteContainer.byteLength >>> 2);
52
+ }
53
+ intView.set(inValues.subarray(byteContainerStart, byteContainerStart + numFullInts));
54
+ }
55
+ else {
56
+ for (let i = 0; i < numFullInts; i = (i + 1) | 0) {
57
+ const val = inValues[(byteContainerStart + i) | 0] | 0;
58
+ const base = i << 2;
59
+ byteContainer[base] = val & 0xff;
60
+ byteContainer[(base + 1) | 0] = (val >>> 8) & 0xff;
61
+ byteContainer[(base + 2) | 0] = (val >>> 16) & 0xff;
62
+ byteContainer[(base + 3) | 0] = (val >>> 24) & 0xff;
63
+ }
64
+ }
65
+ const remainder = byteSize & 3;
66
+ if (remainder > 0) {
67
+ const lastIntIdx = (byteContainerStart + numFullInts) | 0;
68
+ const lastVal = inValues[lastIntIdx] | 0;
69
+ const base = numFullInts << 2;
70
+ for (let r = 0; r < remainder; r = (r + 1) | 0) {
71
+ byteContainer[(base + r) | 0] = (lastVal >>> (r << 3)) & 0xff;
72
+ }
73
+ }
74
+ return byteContainer;
75
+ }
76
+ /**
77
+ * Unpacks the per-bitWidth "exception streams" described by the page's bitmap.
78
+ *
79
+ * @remarks
80
+ * For each bit-width present in the bitmap, a stream header gives the count of outlier values for that
81
+ * bit-width, followed by packed bits representing those values.
82
+ *
83
+ * @param inValues - Packed input (32-bit words).
84
+ * @param inExcept - Offset (32-bit word index) where the exception bitmap starts.
85
+ * @param workspace - Decoder workspace used to store the unpacked exception streams.
86
+ * @returns The new input offset (32-bit word index) after consuming all exception streams.
87
+ */
88
+ function unpackExceptionStreams(inValues, inExcept, workspace) {
89
+ const bitmap = inValues[inExcept++] | 0;
90
+ const dataToBePacked = workspace.dataToBePacked;
91
+ for (let bitWidth = 2; bitWidth <= MAX_BIT_WIDTH; bitWidth = (bitWidth + 1) | 0) {
92
+ if (((bitmap >>> (bitWidth - 1)) & 1) === 0)
93
+ continue;
94
+ if (inExcept >= inValues.length) {
95
+ throw new Error(`FastPFOR decode: truncated exception stream header (bitWidth=${bitWidth}, streamWordIndex=${inExcept}, needWords=1, availableWords=${inValues.length - inExcept}, encodedWords=${inValues.length})`);
96
+ }
97
+ const size = inValues[inExcept++] >>> 0;
98
+ const roundedUp = roundUpToMultipleOf32(size);
99
+ const wordsNeeded = (size * bitWidth + 31) >>> 5;
100
+ if (inExcept + wordsNeeded > inValues.length) {
101
+ throw new Error(`FastPFOR decode: truncated exception stream (bitWidth=${bitWidth}, size=${size}, streamWordIndex=${inExcept}, needWords=${wordsNeeded}, availableWords=${inValues.length - inExcept}, encodedWords=${inValues.length})`);
102
+ }
103
+ let exceptionStream = dataToBePacked[bitWidth];
104
+ if (!exceptionStream || exceptionStream.length < roundedUp) {
105
+ exceptionStream = dataToBePacked[bitWidth] = new Int32Array(roundedUp);
106
+ }
107
+ let j = 0;
108
+ for (; j < size; j = (j + 32) | 0) {
109
+ fastUnpack32(inValues, inExcept, exceptionStream, j, bitWidth);
110
+ inExcept = (inExcept + bitWidth) | 0;
111
+ }
112
+ const overflow = (j - size) | 0;
113
+ inExcept = (inExcept - ((overflow * bitWidth) >>> 5)) | 0;
114
+ workspace.exceptionSizes[bitWidth] = size;
115
+ }
116
+ return inExcept;
117
+ }
118
+ /**
119
+ * Unpacks one 256-value block from the packed bitstream using a specialized implementation for common widths.
120
+ *
121
+ * @param inValues - Packed input (32-bit words).
122
+ * @param inPos - Input offset (32-bit word index) where the packed block starts.
123
+ * @param out - Output buffer.
124
+ * @param outPos - Output offset where the 256 values will be written.
125
+ * @param bitWidth - Base bit-width used for this block.
126
+ * @returns The new input offset (32-bit word index) right after the packed block data.
127
+ */
128
+ function unpackBlock256(inValues, inPos, out, outPos, bitWidth) {
129
+ switch (bitWidth) {
130
+ case 1:
131
+ fastUnpack256_1(inValues, inPos, out, outPos);
132
+ break;
133
+ case 2:
134
+ fastUnpack256_2(inValues, inPos, out, outPos);
135
+ break;
136
+ case 3:
137
+ fastUnpack256_3(inValues, inPos, out, outPos);
138
+ break;
139
+ case 4:
140
+ fastUnpack256_4(inValues, inPos, out, outPos);
141
+ break;
142
+ case 5:
143
+ fastUnpack256_5(inValues, inPos, out, outPos);
144
+ break;
145
+ case 6:
146
+ fastUnpack256_6(inValues, inPos, out, outPos);
147
+ break;
148
+ case 7:
149
+ fastUnpack256_7(inValues, inPos, out, outPos);
150
+ break;
151
+ case 8:
152
+ fastUnpack256_8(inValues, inPos, out, outPos);
153
+ break;
154
+ case 16:
155
+ fastUnpack256_16(inValues, inPos, out, outPos);
156
+ break;
157
+ default:
158
+ fastUnpack256_Generic(inValues, inPos, out, outPos, bitWidth);
159
+ break;
160
+ }
161
+ return (inPos + (bitWidth << 3)) | 0;
162
+ }
163
+ /**
164
+ * Reads and validates the 2-byte block header from the byteContainer.
165
+ *
166
+ * @remarks
167
+ * The header is `[bitWidth, exceptionCount]`, both stored as single bytes.
168
+ *
169
+ * @param byteContainer - Byte metadata buffer for the page.
170
+ * @param byteContainerLen - The valid byte length in `byteContainer` for this page.
171
+ * @param bytePosIn - Current offset in `byteContainer`.
172
+ * @param block - Block index within the page (for error messages).
173
+ * @returns The parsed header and the updated `bytePosIn`.
174
+ */
175
+ function readBlockHeader(byteContainer, byteContainerLen, bytePosIn, block) {
176
+ if (bytePosIn + 2 > byteContainerLen) {
177
+ throw new Error(`FastPFOR decode: byteContainer underflow at block=${block} (need 2 bytes for [bitWidth, exceptionCount], bytePos=${bytePosIn}, byteSize=${byteContainerLen})`);
178
+ }
179
+ const bitWidth = byteContainer[bytePosIn++];
180
+ const exceptionCount = byteContainer[bytePosIn++];
181
+ if (bitWidth > MAX_BIT_WIDTH) {
182
+ throw new Error(`FastPFOR decode: invalid bitWidth=${bitWidth} at block=${block} (expected 0..${MAX_BIT_WIDTH}). This likely indicates corrupted or truncated input.`);
183
+ }
184
+ return { bitWidth, exceptionCount, bytePosIn };
185
+ }
186
+ /**
187
+ * Reads and validates the exception header for a block.
188
+ *
189
+ * @remarks
190
+ * The header contains `maxBits` (1 byte), which defines the width of the outlier values as
191
+ * `exceptionBitWidth = maxBits - bitWidth`.
192
+ *
193
+ * @param byteContainer - Byte metadata buffer for the page.
194
+ * @param byteContainerLen - The valid byte length in `byteContainer` for this page.
195
+ * @param bytePosIn - Current offset in `byteContainer`.
196
+ * @param bitWidth - Base bit-width for the block.
197
+ * @param exceptionCount - Number of exceptions/outliers in this block.
198
+ * @param block - Block index within the page (for error messages).
199
+ * @returns Parsed `maxBits`, `exceptionBitWidth`, and the updated `bytePosIn`.
200
+ */
201
+ function readBlockExceptionHeader(byteContainer, byteContainerLen, bytePosIn, bitWidth, exceptionCount, block) {
202
+ if (bytePosIn + 1 > byteContainerLen) {
203
+ throw new Error(`FastPFOR decode: exception header underflow at block=${block} (need 1 byte for maxBits, bytePos=${bytePosIn}, byteSize=${byteContainerLen})`);
204
+ }
205
+ const maxBits = byteContainer[bytePosIn++];
206
+ if (maxBits < bitWidth || maxBits > MAX_BIT_WIDTH) {
207
+ throw new Error(`FastPFOR decode: invalid maxBits=${maxBits} at block=${block} (bitWidth=${bitWidth}, expected ${bitWidth}..${MAX_BIT_WIDTH})`);
208
+ }
209
+ const exceptionBitWidth = (maxBits - bitWidth) | 0;
210
+ if (exceptionBitWidth < 1 || exceptionBitWidth > MAX_BIT_WIDTH) {
211
+ throw new Error(`FastPFOR decode: invalid exceptionBitWidth=${exceptionBitWidth} at block=${block} (bitWidth=${bitWidth}, maxBits=${maxBits})`);
212
+ }
213
+ if (bytePosIn + exceptionCount > byteContainerLen) {
214
+ throw new Error(`FastPFOR decode: exception positions underflow at block=${block} (need=${exceptionCount}, have=${byteContainerLen - bytePosIn})`);
215
+ }
216
+ return { maxBits, exceptionBitWidth, bytePosIn };
217
+ }
218
+ /**
219
+ * Applies (block-local) FastPFOR "exceptions" (outliers) to an already-unpacked base 256-value block.
220
+ *
221
+ * @param out - Output buffer containing the base unpacked values for the block.
222
+ * @param blockOutPos - Offset in `out` where the 256-value block starts.
223
+ * @param bitWidth - Base bit-width for the block.
224
+ * @param exceptionCount - Number of exceptions/outliers in this block.
225
+ * @param byteContainer - Byte metadata buffer for the page.
226
+ * @param byteContainerLen - The valid byte length in `byteContainer` for this page.
227
+ * @param bytePosIn - Current offset in `byteContainer` (right after `[bitWidth, exceptionCount]`).
228
+ * @param workspace - Decoder workspace holding the unpacked exception streams.
229
+ * @param block - Block index within the page (for error messages).
230
+ * @returns The updated `bytePosIn` after consuming the exception metadata bytes.
231
+ *
232
+ * The exception metadata is stored in `byteContainer`:
233
+ * - `maxBits` (1 byte): the maximum bit-width of any value in the block
234
+ * - `exceptionCount` exception positions (1 byte each, 0..255)
235
+ *
236
+ * The exception values themselves are read from the pre-unpacked exception streams stored in `workspace`.
237
+ * Returns the new position in the byteContainer after consuming the exception metadata bytes.
238
+ */
239
+ function applyBlockExceptions(out, blockOutPos, bitWidth, exceptionCount, byteContainer, byteContainerLen, bytePosIn, workspace, block) {
240
+ const { maxBits, exceptionBitWidth, bytePosIn: afterHeaderPos, } = readBlockExceptionHeader(byteContainer, byteContainerLen, bytePosIn, bitWidth, exceptionCount, block);
241
+ bytePosIn = afterHeaderPos;
242
+ if (exceptionBitWidth === 1) {
243
+ const shift = 1 << bitWidth;
244
+ for (let k = 0; k < exceptionCount; k = (k + 1) | 0) {
245
+ const pos = byteContainer[bytePosIn++];
246
+ out[(pos + blockOutPos) | 0] |= shift;
247
+ }
248
+ return bytePosIn;
249
+ }
250
+ const exceptionValues = workspace.dataToBePacked[exceptionBitWidth];
251
+ if (!exceptionValues) {
252
+ throw new Error(`FastPFOR decode: missing exception stream for exceptionBitWidth=${exceptionBitWidth} (bitWidth=${bitWidth}, maxBits=${maxBits}) at block ${block}`);
253
+ }
254
+ const exceptionPointers = workspace.dataPointers;
255
+ let exPtr = exceptionPointers[exceptionBitWidth] | 0;
256
+ const exSize = workspace.exceptionSizes[exceptionBitWidth] | 0;
257
+ if (exPtr + exceptionCount > exSize) {
258
+ throw new Error(`FastPFOR decode: exception stream overflow for exceptionBitWidth=${exceptionBitWidth} (ptr=${exPtr}, need ${exceptionCount}, size=${exSize}) at block ${block}`);
259
+ }
260
+ for (let k = 0; k < exceptionCount; k = (k + 1) | 0) {
261
+ const pos = byteContainer[bytePosIn++];
262
+ const val = exceptionValues[exPtr++] | 0;
263
+ out[(pos + blockOutPos) | 0] |= val << bitWidth;
264
+ }
265
+ exceptionPointers[exceptionBitWidth] = exPtr;
266
+ return bytePosIn;
267
+ }
268
+ function decodePageBlocks(inValues, pageStart, inPos, packedEnd, out, outPos, blocks, byteContainer, byteContainerLen, workspace) {
269
+ let tmpInPos = inPos | 0;
270
+ let bytePosIn = 0;
271
+ for (let run = 0; run < blocks; run = (run + 1) | 0) {
272
+ const header = readBlockHeader(byteContainer, byteContainerLen, bytePosIn, run);
273
+ bytePosIn = header.bytePosIn;
274
+ const bitWidth = header.bitWidth;
275
+ const exceptionCount = header.exceptionCount;
276
+ const blockOutPos = (outPos + run * BLOCK_SIZE) | 0;
277
+ switch (bitWidth) {
278
+ case 0:
279
+ out.fill(0, blockOutPos, blockOutPos + BLOCK_SIZE);
280
+ break;
281
+ case 32:
282
+ for (let i = 0; i < BLOCK_SIZE; i = (i + 1) | 0) {
283
+ out[(blockOutPos + i) | 0] = inValues[(tmpInPos + i) | 0] | 0;
284
+ }
285
+ tmpInPos = (tmpInPos + BLOCK_SIZE) | 0;
286
+ break;
287
+ default:
288
+ tmpInPos = unpackBlock256(inValues, tmpInPos, out, blockOutPos, bitWidth);
289
+ break;
290
+ }
291
+ if (exceptionCount > 0) {
292
+ bytePosIn = applyBlockExceptions(out, blockOutPos, bitWidth, exceptionCount, byteContainer, byteContainerLen, bytePosIn, workspace, run);
293
+ }
294
+ }
295
+ if (tmpInPos !== packedEnd) {
296
+ throw new Error(`FastPFOR decode: packed region mismatch (pageStart=${pageStart}, packedStart=${inPos}, consumedPackedEnd=${tmpInPos}, expectedPackedEnd=${packedEnd}, packedWords=${packedEnd - inPos}, encoded.length=${inValues.length})`);
297
+ }
298
+ return;
299
+ }
300
+ /**
301
+ * Decodes one FastPFOR page (aligned to 256-value blocks).
302
+ */
303
+ function decodePage(inValues, out, inPos, outPos, thisSize, workspace) {
304
+ const pageStart = inPos | 0;
305
+ const whereMeta = inValues[pageStart] | 0;
306
+ if (whereMeta <= 0 || pageStart + whereMeta > inValues.length - 1) {
307
+ throw new Error(`FastPFOR decode: invalid whereMeta=${whereMeta} at pageStart=${pageStart} (expected > 0 and pageStart+whereMeta < encoded.length=${inValues.length})`);
308
+ }
309
+ const packedStart = (pageStart + 1) | 0;
310
+ const packedEnd = (pageStart + whereMeta) | 0;
311
+ const byteSize = inValues[packedEnd] >>> 0;
312
+ const metaInts = (byteSize + 3) >>> 2;
313
+ const byteContainerStart = packedEnd + 1;
314
+ const bitmapPos = byteContainerStart + metaInts;
315
+ if (bitmapPos >= inValues.length) {
316
+ throw new Error(`FastPFOR decode: invalid byteSize=${byteSize} (metaInts=${metaInts}, pageStart=${pageStart}, packedEnd=${packedEnd}, byteContainerStart=${byteContainerStart}) causes bitmapPos=${bitmapPos} out of bounds (encoded.length=${inValues.length})`);
317
+ }
318
+ const byteContainer = materializeByteContainer(inValues, byteContainerStart, byteSize, workspace);
319
+ const byteContainerLen = byteSize;
320
+ const inExcept = unpackExceptionStreams(inValues, bitmapPos, workspace);
321
+ const exceptionPointers = workspace.dataPointers;
322
+ exceptionPointers.fill(0);
323
+ const startOutPos = outPos | 0;
324
+ const blocks = (thisSize / BLOCK_SIZE) | 0;
325
+ decodePageBlocks(inValues, pageStart, packedStart, packedEnd, out, startOutPos, blocks, byteContainer, byteContainerLen, workspace);
326
+ return inExcept;
327
+ }
328
+ function decodeAlignedPages(inValues, out, inPos, outPos, outLength, workspace) {
329
+ const alignedOutLength = greatestMultiple(outLength, BLOCK_SIZE);
330
+ const finalOut = outPos + alignedOutLength;
331
+ let tmpOutPos = outPos;
332
+ let tmpInPos = inPos;
333
+ while (tmpOutPos !== finalOut) {
334
+ const thisSize = Math.min(PAGE_SIZE, finalOut - tmpOutPos);
335
+ tmpInPos = decodePage(inValues, out, tmpInPos, tmpOutPos, thisSize, workspace);
336
+ tmpOutPos = (tmpOutPos + thisSize) | 0;
337
+ }
338
+ return tmpInPos;
339
+ }
340
+ /**
341
+ * Decodes the VariableByte tail (MSB=1 terminator, opposite of Protobuf Varint).
342
+ */
343
+ function decodeVByte(inValues, inPos, inLength, out, outPos, expectedCount) {
344
+ if (expectedCount === 0)
345
+ return inPos;
346
+ let bitOffset = 0;
347
+ let wordIndex = inPos;
348
+ const finalWordIndex = inPos + inLength;
349
+ const outPos0 = outPos;
350
+ let tmpOutPos = outPos;
351
+ const targetOut = outPos + expectedCount;
352
+ let accumulator = 0;
353
+ let accumulatorShift = 0;
354
+ while (wordIndex < finalWordIndex && tmpOutPos < targetOut) {
355
+ const word = inValues[wordIndex];
356
+ const byte = (word >>> bitOffset) & 0xff;
357
+ bitOffset += 8;
358
+ wordIndex += bitOffset >>> 5;
359
+ bitOffset &= 31;
360
+ accumulator |= (byte & 0x7f) << accumulatorShift;
361
+ if ((byte & 0x80) !== 0) {
362
+ out[tmpOutPos++] = accumulator | 0;
363
+ accumulator = 0;
364
+ accumulatorShift = 0;
365
+ }
366
+ else {
367
+ accumulatorShift += 7;
368
+ if (accumulatorShift > 28) {
369
+ throw new Error(`FastPFOR VByte: unterminated value (expected MSB=1 terminator within 5 bytes; shift=${accumulatorShift}, partial=${accumulator}, decoded=${tmpOutPos - outPos0}/${expectedCount}, inPos=${wordIndex}, inEnd=${finalWordIndex})`);
370
+ }
371
+ }
372
+ }
373
+ if (tmpOutPos !== targetOut) {
374
+ throw new Error(`FastPFOR VByte: truncated stream (decoded=${tmpOutPos - outPos0}, expected=${expectedCount}, consumedWords=${wordIndex - inPos}/${inLength}, vbyteStart=${inPos}, vbyteEnd=${finalWordIndex})`);
375
+ }
376
+ return wordIndex;
377
+ }
378
+ /**
379
+ * Decodes a sequence of FastPFOR-encoded integers.
380
+ *
381
+ * @param encoded The input buffer containing FastPFOR encoded data.
382
+ * @param numValues The number of integers expected to be decoded.
383
+ * @param workspace Optional workspace for reuse across calls. If omitted, a new workspace is created per call.
384
+ */
385
+ export function decodeFastPforInt32(encoded, numValues, workspace) {
386
+ let inPos = 0;
387
+ let outPos = 0;
388
+ const decoded = new Int32Array(numValues);
389
+ const decoderWorkspace = workspace ?? createDecoderWorkspace();
390
+ if (encoded.length > 0) {
391
+ const alignedLength = encoded[inPos] | 0;
392
+ inPos = (inPos + 1) | 0;
393
+ if (alignedLength < 0 || (alignedLength & (BLOCK_SIZE - 1)) !== 0) {
394
+ throw new Error(`FastPFOR decode: invalid alignedLength=${alignedLength} (expected >= 0 and multiple of ${BLOCK_SIZE})`);
395
+ }
396
+ if (outPos + alignedLength > decoded.length) {
397
+ throw new Error(`FastPFOR decode: output buffer too small (outPos=${outPos}, alignedLength=${alignedLength}, out.length=${decoded.length})`);
398
+ }
399
+ inPos = decodeAlignedPages(encoded, decoded, inPos, outPos, alignedLength, decoderWorkspace);
400
+ outPos = (outPos + alignedLength) | 0;
401
+ }
402
+ const remainingLength = (encoded.length - inPos) | 0;
403
+ const expectedTail = (numValues - outPos) | 0;
404
+ decodeVByte(encoded, inPos, remainingLength, decoded, outPos, expectedTail);
405
+ return decoded;
406
+ }
407
+ function fastUnpack32(inValues, inPos, out, outPos, bitWidth) {
408
+ switch (bitWidth) {
409
+ case 2:
410
+ fastUnpack32_2(inValues, inPos, out, outPos);
411
+ return;
412
+ case 3:
413
+ fastUnpack32_3(inValues, inPos, out, outPos);
414
+ return;
415
+ case 4:
416
+ fastUnpack32_4(inValues, inPos, out, outPos);
417
+ return;
418
+ case 5:
419
+ fastUnpack32_5(inValues, inPos, out, outPos);
420
+ return;
421
+ case 6:
422
+ fastUnpack32_6(inValues, inPos, out, outPos);
423
+ return;
424
+ case 7:
425
+ fastUnpack32_7(inValues, inPos, out, outPos);
426
+ return;
427
+ case 8:
428
+ fastUnpack32_8(inValues, inPos, out, outPos);
429
+ return;
430
+ case 9:
431
+ fastUnpack32_9(inValues, inPos, out, outPos);
432
+ return;
433
+ case 10:
434
+ fastUnpack32_10(inValues, inPos, out, outPos);
435
+ return;
436
+ case 11:
437
+ fastUnpack32_11(inValues, inPos, out, outPos);
438
+ return;
439
+ case 12:
440
+ fastUnpack32_12(inValues, inPos, out, outPos);
441
+ return;
442
+ case 16:
443
+ fastUnpack32_16(inValues, inPos, out, outPos);
444
+ return;
445
+ case 32:
446
+ for (let i = 0; i < 32; i = (i + 1) | 0) {
447
+ out[(outPos + i) | 0] = inValues[(inPos + i) | 0] | 0;
448
+ }
449
+ return;
450
+ default:
451
+ break;
452
+ }
453
+ const valueMask = MASKS[bitWidth] >>> 0;
454
+ let inputWordIndex = inPos;
455
+ let bitOffset = 0;
456
+ let currentWord = inValues[inputWordIndex] >>> 0;
457
+ for (let i = 0; i < 32; i++) {
458
+ if (bitOffset + bitWidth <= 32) {
459
+ const value = (currentWord >>> bitOffset) & valueMask;
460
+ out[outPos + i] = value | 0;
461
+ bitOffset += bitWidth;
462
+ if (bitOffset === 32) {
463
+ bitOffset = 0;
464
+ inputWordIndex++;
465
+ if (i !== 31)
466
+ currentWord = inValues[inputWordIndex] >>> 0;
467
+ }
468
+ }
469
+ else {
470
+ const lowBits = 32 - bitOffset;
471
+ const low = currentWord >>> bitOffset;
472
+ inputWordIndex++;
473
+ currentWord = inValues[inputWordIndex] >>> 0;
474
+ const highMask = MASKS[bitWidth - lowBits] >>> 0;
475
+ const high = currentWord & highMask;
476
+ const value = (low | (high << lowBits)) & valueMask;
477
+ out[outPos + i] = value | 0;
478
+ bitOffset = bitWidth - lowBits;
479
+ }
480
+ }
481
+ }
482
+ //# sourceMappingURL=fastPforDecoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastPforDecoder.js","sourceRoot":"","sources":["../../src/decoding/fastPforDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n MASKS,\n DEFAULT_PAGE_SIZE,\n BLOCK_SIZE,\n greatestMultiple,\n roundUpToMultipleOf32,\n normalizePageSize,\n type Int32Buf,\n type Uint8Buf,\n} from \"./fastPforShared\";\nimport {\n fastUnpack32_2,\n fastUnpack32_3,\n fastUnpack32_4,\n fastUnpack32_5,\n fastUnpack32_6,\n fastUnpack32_7,\n fastUnpack32_8,\n fastUnpack32_9,\n fastUnpack32_10,\n fastUnpack32_11,\n fastUnpack32_12,\n fastUnpack32_16,\n fastUnpack256_1,\n fastUnpack256_2,\n fastUnpack256_3,\n fastUnpack256_4,\n fastUnpack256_5,\n fastUnpack256_6,\n fastUnpack256_7,\n fastUnpack256_8,\n fastUnpack256_16,\n fastUnpack256_Generic,\n} from \"./fastPforUnpack\";\n\n/**\n * FastPFOR decoding implementation.\n *\n * @remarks\n * Terminology note: \"exceptions\" in FastPFOR refer to **outlier values** within a block that do not fit in the\n * chosen base bit-width for that block. These are stored in separate \"exception streams\" and later applied back\n * to the unpacked base values. This is unrelated to JavaScript/TypeScript runtime exceptions.\n */\n\n/**\n * Workspace for the FastPFOR decoder.\n */\nexport type FastPforDecoderWorkspace = {\n dataToBePacked: Array<Int32Array | undefined>;\n dataPointers: Int32Array;\n byteContainer: Uint8Buf;\n byteContainerI32?: Int32Array;\n exceptionSizes: Int32Array;\n};\n\n/**\n * Workspace for decoding the FastPFOR *wire format* (big-endian int32 words).\n *\n * @remarks\n * This workspace owns:\n * - a scratch `encodedWords` buffer to materialize big-endian words\n * - the reusable `FastPforDecoderWorkspace` used by `decodeFastPforInt32`\n *\n * The caller is responsible for creating and reusing this object.\n */\nexport type FastPforWireDecodeWorkspace = {\n encodedWords: Int32Array;\n decoderWorkspace: FastPforDecoderWorkspace;\n};\n\nconst MAX_BIT_WIDTH = 32;\nconst BIT_WIDTH_SLOTS = MAX_BIT_WIDTH + 1;\n\nconst PAGE_SIZE = normalizePageSize(DEFAULT_PAGE_SIZE);\nconst BYTE_CONTAINER_SIZE = ((3 * PAGE_SIZE) / BLOCK_SIZE + PAGE_SIZE) | 0;\n\n/**\n * Creates an isolated workspace for decoding.\n * Reusing a workspace across calls avoids repeated allocations.\n */\nexport function createDecoderWorkspace(): FastPforDecoderWorkspace {\n const byteContainer = new Uint8Array(BYTE_CONTAINER_SIZE) as Uint8Buf;\n return {\n dataToBePacked: new Array(BIT_WIDTH_SLOTS),\n dataPointers: new Int32Array(BIT_WIDTH_SLOTS),\n byteContainer,\n byteContainerI32: new Int32Array(\n byteContainer.buffer,\n byteContainer.byteOffset,\n byteContainer.byteLength >>> 2,\n ),\n exceptionSizes: new Int32Array(BIT_WIDTH_SLOTS),\n };\n}\n\nexport function createFastPforWireDecodeWorkspace(\n initialEncodedWordCapacity: number = 16,\n): FastPforWireDecodeWorkspace {\n if (initialEncodedWordCapacity < 0) {\n throw new RangeError(`initialEncodedWordCapacity must be >= 0, got ${initialEncodedWordCapacity}`);\n }\n\n const capacity = Math.max(16, initialEncodedWordCapacity | 0);\n return {\n encodedWords: new Int32Array(capacity),\n decoderWorkspace: createDecoderWorkspace(),\n };\n}\n\nexport function ensureFastPforWireEncodedWordsCapacity(\n workspace: FastPforWireDecodeWorkspace,\n requiredWordCount: number,\n): Int32Array {\n if (requiredWordCount <= workspace.encodedWords.length) return workspace.encodedWords;\n\n const next = new Int32Array(Math.max(16, requiredWordCount * 2));\n workspace.encodedWords = next;\n return next;\n}\n\nfunction materializeByteContainer(\n inValues: Int32Array,\n byteContainerStart: number,\n byteSize: number,\n workspace: FastPforDecoderWorkspace,\n): Uint8Buf {\n if (workspace.byteContainer.length < byteSize) {\n workspace.byteContainer = new Uint8Array(byteSize * 2) as Uint8Buf;\n workspace.byteContainerI32 = undefined;\n }\n const byteContainer = workspace.byteContainer;\n const numFullInts = byteSize >>> 2;\n\n if ((byteContainer.byteOffset & 3) === 0) {\n let intView = workspace.byteContainerI32;\n if (\n !intView ||\n intView.buffer !== byteContainer.buffer ||\n intView.byteOffset !== byteContainer.byteOffset ||\n intView.length < numFullInts\n ) {\n intView = workspace.byteContainerI32 = new Int32Array(\n byteContainer.buffer,\n byteContainer.byteOffset,\n byteContainer.byteLength >>> 2,\n );\n }\n\n intView.set(inValues.subarray(byteContainerStart, byteContainerStart + numFullInts));\n } else {\n for (let i = 0; i < numFullInts; i = (i + 1) | 0) {\n const val = inValues[(byteContainerStart + i) | 0] | 0;\n const base = i << 2;\n byteContainer[base] = val & 0xff;\n byteContainer[(base + 1) | 0] = (val >>> 8) & 0xff;\n byteContainer[(base + 2) | 0] = (val >>> 16) & 0xff;\n byteContainer[(base + 3) | 0] = (val >>> 24) & 0xff;\n }\n }\n\n const remainder = byteSize & 3;\n if (remainder > 0) {\n const lastIntIdx = (byteContainerStart + numFullInts) | 0;\n const lastVal = inValues[lastIntIdx] | 0;\n const base = numFullInts << 2;\n for (let r = 0; r < remainder; r = (r + 1) | 0) {\n byteContainer[(base + r) | 0] = (lastVal >>> (r << 3)) & 0xff;\n }\n }\n\n return byteContainer;\n}\n\n/**\n * Unpacks the per-bitWidth \"exception streams\" described by the page's bitmap.\n *\n * @remarks\n * For each bit-width present in the bitmap, a stream header gives the count of outlier values for that\n * bit-width, followed by packed bits representing those values.\n *\n * @param inValues - Packed input (32-bit words).\n * @param inExcept - Offset (32-bit word index) where the exception bitmap starts.\n * @param workspace - Decoder workspace used to store the unpacked exception streams.\n * @returns The new input offset (32-bit word index) after consuming all exception streams.\n */\nfunction unpackExceptionStreams(inValues: Int32Array, inExcept: number, workspace: FastPforDecoderWorkspace): number {\n const bitmap = inValues[inExcept++] | 0;\n const dataToBePacked = workspace.dataToBePacked;\n\n for (let bitWidth = 2; bitWidth <= MAX_BIT_WIDTH; bitWidth = (bitWidth + 1) | 0) {\n if (((bitmap >>> (bitWidth - 1)) & 1) === 0) continue;\n\n if (inExcept >= inValues.length) {\n throw new Error(\n `FastPFOR decode: truncated exception stream header (bitWidth=${bitWidth}, streamWordIndex=${inExcept}, needWords=1, availableWords=${inValues.length - inExcept}, encodedWords=${inValues.length})`,\n );\n }\n const size = inValues[inExcept++] >>> 0;\n const roundedUp = roundUpToMultipleOf32(size);\n\n const wordsNeeded = (size * bitWidth + 31) >>> 5;\n if (inExcept + wordsNeeded > inValues.length) {\n throw new Error(\n `FastPFOR decode: truncated exception stream (bitWidth=${bitWidth}, size=${size}, streamWordIndex=${inExcept}, needWords=${wordsNeeded}, availableWords=${inValues.length - inExcept}, encodedWords=${inValues.length})`,\n );\n }\n\n let exceptionStream = dataToBePacked[bitWidth];\n if (!exceptionStream || exceptionStream.length < roundedUp) {\n exceptionStream = dataToBePacked[bitWidth] = new Int32Array(roundedUp);\n }\n\n let j = 0;\n for (; j < size; j = (j + 32) | 0) {\n fastUnpack32(inValues, inExcept, exceptionStream, j, bitWidth);\n inExcept = (inExcept + bitWidth) | 0;\n }\n\n const overflow = (j - size) | 0;\n inExcept = (inExcept - ((overflow * bitWidth) >>> 5)) | 0;\n\n workspace.exceptionSizes[bitWidth] = size;\n }\n\n return inExcept;\n}\n\n/**\n * Unpacks one 256-value block from the packed bitstream using a specialized implementation for common widths.\n *\n * @param inValues - Packed input (32-bit words).\n * @param inPos - Input offset (32-bit word index) where the packed block starts.\n * @param out - Output buffer.\n * @param outPos - Output offset where the 256 values will be written.\n * @param bitWidth - Base bit-width used for this block.\n * @returns The new input offset (32-bit word index) right after the packed block data.\n */\nfunction unpackBlock256(\n inValues: Int32Array,\n inPos: number,\n out: Int32Array,\n outPos: number,\n bitWidth: number,\n): number {\n switch (bitWidth) {\n case 1:\n fastUnpack256_1(inValues, inPos, out, outPos);\n break;\n case 2:\n fastUnpack256_2(inValues, inPos, out, outPos);\n break;\n case 3:\n fastUnpack256_3(inValues, inPos, out, outPos);\n break;\n case 4:\n fastUnpack256_4(inValues, inPos, out, outPos);\n break;\n case 5:\n fastUnpack256_5(inValues, inPos, out, outPos);\n break;\n case 6:\n fastUnpack256_6(inValues, inPos, out, outPos);\n break;\n case 7:\n fastUnpack256_7(inValues, inPos, out, outPos);\n break;\n case 8:\n fastUnpack256_8(inValues, inPos, out, outPos);\n break;\n case 16:\n fastUnpack256_16(inValues, inPos, out, outPos);\n break;\n default:\n fastUnpack256_Generic(inValues, inPos, out, outPos, bitWidth);\n break;\n }\n\n return (inPos + (bitWidth << 3)) | 0;\n}\n\n/**\n * Reads and validates the 2-byte block header from the byteContainer.\n *\n * @remarks\n * The header is `[bitWidth, exceptionCount]`, both stored as single bytes.\n *\n * @param byteContainer - Byte metadata buffer for the page.\n * @param byteContainerLen - The valid byte length in `byteContainer` for this page.\n * @param bytePosIn - Current offset in `byteContainer`.\n * @param block - Block index within the page (for error messages).\n * @returns The parsed header and the updated `bytePosIn`.\n */\nfunction readBlockHeader(\n byteContainer: Uint8Array,\n byteContainerLen: number,\n bytePosIn: number,\n block: number,\n): { bitWidth: number; exceptionCount: number; bytePosIn: number } {\n if (bytePosIn + 2 > byteContainerLen) {\n throw new Error(\n `FastPFOR decode: byteContainer underflow at block=${block} (need 2 bytes for [bitWidth, exceptionCount], bytePos=${bytePosIn}, byteSize=${byteContainerLen})`,\n );\n }\n\n const bitWidth = byteContainer[bytePosIn++];\n const exceptionCount = byteContainer[bytePosIn++];\n\n if (bitWidth > MAX_BIT_WIDTH) {\n throw new Error(\n `FastPFOR decode: invalid bitWidth=${bitWidth} at block=${block} (expected 0..${MAX_BIT_WIDTH}). This likely indicates corrupted or truncated input.`,\n );\n }\n\n return { bitWidth, exceptionCount, bytePosIn };\n}\n\n/**\n * Reads and validates the exception header for a block.\n *\n * @remarks\n * The header contains `maxBits` (1 byte), which defines the width of the outlier values as\n * `exceptionBitWidth = maxBits - bitWidth`.\n *\n * @param byteContainer - Byte metadata buffer for the page.\n * @param byteContainerLen - The valid byte length in `byteContainer` for this page.\n * @param bytePosIn - Current offset in `byteContainer`.\n * @param bitWidth - Base bit-width for the block.\n * @param exceptionCount - Number of exceptions/outliers in this block.\n * @param block - Block index within the page (for error messages).\n * @returns Parsed `maxBits`, `exceptionBitWidth`, and the updated `bytePosIn`.\n */\nfunction readBlockExceptionHeader(\n byteContainer: Uint8Array,\n byteContainerLen: number,\n bytePosIn: number,\n bitWidth: number,\n exceptionCount: number,\n block: number,\n): { maxBits: number; exceptionBitWidth: number; bytePosIn: number } {\n if (bytePosIn + 1 > byteContainerLen) {\n throw new Error(\n `FastPFOR decode: exception header underflow at block=${block} (need 1 byte for maxBits, bytePos=${bytePosIn}, byteSize=${byteContainerLen})`,\n );\n }\n const maxBits = byteContainer[bytePosIn++];\n\n if (maxBits < bitWidth || maxBits > MAX_BIT_WIDTH) {\n throw new Error(\n `FastPFOR decode: invalid maxBits=${maxBits} at block=${block} (bitWidth=${bitWidth}, expected ${bitWidth}..${MAX_BIT_WIDTH})`,\n );\n }\n const exceptionBitWidth = (maxBits - bitWidth) | 0;\n if (exceptionBitWidth < 1 || exceptionBitWidth > MAX_BIT_WIDTH) {\n throw new Error(\n `FastPFOR decode: invalid exceptionBitWidth=${exceptionBitWidth} at block=${block} (bitWidth=${bitWidth}, maxBits=${maxBits})`,\n );\n }\n\n if (bytePosIn + exceptionCount > byteContainerLen) {\n throw new Error(\n `FastPFOR decode: exception positions underflow at block=${block} (need=${exceptionCount}, have=${byteContainerLen - bytePosIn})`,\n );\n }\n\n return { maxBits, exceptionBitWidth, bytePosIn };\n}\n\n/**\n * Applies (block-local) FastPFOR \"exceptions\" (outliers) to an already-unpacked base 256-value block.\n *\n * @param out - Output buffer containing the base unpacked values for the block.\n * @param blockOutPos - Offset in `out` where the 256-value block starts.\n * @param bitWidth - Base bit-width for the block.\n * @param exceptionCount - Number of exceptions/outliers in this block.\n * @param byteContainer - Byte metadata buffer for the page.\n * @param byteContainerLen - The valid byte length in `byteContainer` for this page.\n * @param bytePosIn - Current offset in `byteContainer` (right after `[bitWidth, exceptionCount]`).\n * @param workspace - Decoder workspace holding the unpacked exception streams.\n * @param block - Block index within the page (for error messages).\n * @returns The updated `bytePosIn` after consuming the exception metadata bytes.\n *\n * The exception metadata is stored in `byteContainer`:\n * - `maxBits` (1 byte): the maximum bit-width of any value in the block\n * - `exceptionCount` exception positions (1 byte each, 0..255)\n *\n * The exception values themselves are read from the pre-unpacked exception streams stored in `workspace`.\n * Returns the new position in the byteContainer after consuming the exception metadata bytes.\n */\nfunction applyBlockExceptions(\n out: Int32Array,\n blockOutPos: number,\n bitWidth: number,\n exceptionCount: number,\n byteContainer: Uint8Array,\n byteContainerLen: number,\n bytePosIn: number,\n workspace: FastPforDecoderWorkspace,\n block: number,\n): number {\n const {\n maxBits,\n exceptionBitWidth,\n bytePosIn: afterHeaderPos,\n } = readBlockExceptionHeader(byteContainer, byteContainerLen, bytePosIn, bitWidth, exceptionCount, block);\n bytePosIn = afterHeaderPos;\n\n if (exceptionBitWidth === 1) {\n const shift = 1 << bitWidth;\n for (let k = 0; k < exceptionCount; k = (k + 1) | 0) {\n const pos = byteContainer[bytePosIn++];\n out[(pos + blockOutPos) | 0] |= shift;\n }\n return bytePosIn;\n }\n\n const exceptionValues = workspace.dataToBePacked[exceptionBitWidth];\n if (!exceptionValues) {\n throw new Error(\n `FastPFOR decode: missing exception stream for exceptionBitWidth=${exceptionBitWidth} (bitWidth=${bitWidth}, maxBits=${maxBits}) at block ${block}`,\n );\n }\n\n const exceptionPointers = workspace.dataPointers;\n let exPtr = exceptionPointers[exceptionBitWidth] | 0;\n const exSize = workspace.exceptionSizes[exceptionBitWidth] | 0;\n\n if (exPtr + exceptionCount > exSize) {\n throw new Error(\n `FastPFOR decode: exception stream overflow for exceptionBitWidth=${exceptionBitWidth} (ptr=${exPtr}, need ${exceptionCount}, size=${exSize}) at block ${block}`,\n );\n }\n\n for (let k = 0; k < exceptionCount; k = (k + 1) | 0) {\n const pos = byteContainer[bytePosIn++];\n const val = exceptionValues[exPtr++] | 0;\n out[(pos + blockOutPos) | 0] |= val << bitWidth;\n }\n exceptionPointers[exceptionBitWidth] = exPtr;\n return bytePosIn;\n}\n\nfunction decodePageBlocks(\n inValues: Int32Array,\n pageStart: number,\n inPos: number,\n packedEnd: number,\n out: Int32Array,\n outPos: number,\n blocks: number,\n byteContainer: Uint8Array,\n byteContainerLen: number,\n workspace: FastPforDecoderWorkspace,\n): void {\n let tmpInPos = inPos | 0;\n let bytePosIn = 0;\n\n for (let run = 0; run < blocks; run = (run + 1) | 0) {\n const header = readBlockHeader(byteContainer, byteContainerLen, bytePosIn, run);\n bytePosIn = header.bytePosIn;\n const bitWidth = header.bitWidth;\n const exceptionCount = header.exceptionCount;\n\n const blockOutPos = (outPos + run * BLOCK_SIZE) | 0;\n\n switch (bitWidth) {\n case 0:\n out.fill(0, blockOutPos, blockOutPos + BLOCK_SIZE);\n break;\n\n case 32:\n for (let i = 0; i < BLOCK_SIZE; i = (i + 1) | 0) {\n out[(blockOutPos + i) | 0] = inValues[(tmpInPos + i) | 0] | 0;\n }\n tmpInPos = (tmpInPos + BLOCK_SIZE) | 0;\n break;\n\n default:\n tmpInPos = unpackBlock256(inValues, tmpInPos, out, blockOutPos, bitWidth);\n break;\n }\n\n if (exceptionCount > 0) {\n bytePosIn = applyBlockExceptions(\n out,\n blockOutPos,\n bitWidth,\n exceptionCount,\n byteContainer,\n byteContainerLen,\n bytePosIn,\n workspace,\n run,\n );\n }\n }\n\n if (tmpInPos !== packedEnd) {\n throw new Error(\n `FastPFOR decode: packed region mismatch (pageStart=${pageStart}, packedStart=${inPos}, consumedPackedEnd=${tmpInPos}, expectedPackedEnd=${packedEnd}, packedWords=${packedEnd - inPos}, encoded.length=${inValues.length})`,\n );\n }\n\n return;\n}\n\n/**\n * Decodes one FastPFOR page (aligned to 256-value blocks).\n */\nfunction decodePage(\n inValues: Int32Array,\n out: Int32Array,\n inPos: number,\n outPos: number,\n thisSize: number,\n workspace: FastPforDecoderWorkspace,\n): number {\n const pageStart = inPos | 0;\n const whereMeta = inValues[pageStart] | 0;\n\n if (whereMeta <= 0 || pageStart + whereMeta > inValues.length - 1) {\n throw new Error(\n `FastPFOR decode: invalid whereMeta=${whereMeta} at pageStart=${pageStart} (expected > 0 and pageStart+whereMeta < encoded.length=${inValues.length})`,\n );\n }\n\n const packedStart = (pageStart + 1) | 0;\n const packedEnd = (pageStart + whereMeta) | 0;\n\n const byteSize = inValues[packedEnd] >>> 0;\n const metaInts = (byteSize + 3) >>> 2;\n const byteContainerStart = packedEnd + 1;\n const bitmapPos = byteContainerStart + metaInts;\n\n if (bitmapPos >= inValues.length) {\n throw new Error(\n `FastPFOR decode: invalid byteSize=${byteSize} (metaInts=${metaInts}, pageStart=${pageStart}, packedEnd=${packedEnd}, byteContainerStart=${byteContainerStart}) causes bitmapPos=${bitmapPos} out of bounds (encoded.length=${inValues.length})`,\n );\n }\n\n const byteContainer = materializeByteContainer(inValues, byteContainerStart, byteSize, workspace);\n const byteContainerLen = byteSize;\n\n const inExcept = unpackExceptionStreams(inValues, bitmapPos, workspace);\n\n const exceptionPointers = workspace.dataPointers;\n exceptionPointers.fill(0);\n const startOutPos = outPos | 0;\n const blocks = (thisSize / BLOCK_SIZE) | 0;\n decodePageBlocks(\n inValues,\n pageStart,\n packedStart,\n packedEnd,\n out,\n startOutPos,\n blocks,\n byteContainer,\n byteContainerLen,\n workspace,\n );\n\n return inExcept;\n}\n\nfunction decodeAlignedPages(\n inValues: Int32Array,\n out: Int32Array,\n inPos: number,\n outPos: number,\n outLength: number,\n workspace: FastPforDecoderWorkspace,\n): number {\n const alignedOutLength = greatestMultiple(outLength, BLOCK_SIZE);\n const finalOut = outPos + alignedOutLength;\n let tmpOutPos = outPos;\n let tmpInPos = inPos;\n\n while (tmpOutPos !== finalOut) {\n const thisSize = Math.min(PAGE_SIZE, finalOut - tmpOutPos);\n tmpInPos = decodePage(inValues, out, tmpInPos, tmpOutPos, thisSize, workspace);\n tmpOutPos = (tmpOutPos + thisSize) | 0;\n }\n\n return tmpInPos;\n}\n\n/**\n * Decodes the VariableByte tail (MSB=1 terminator, opposite of Protobuf Varint).\n */\nfunction decodeVByte(\n inValues: Int32Array,\n inPos: number,\n inLength: number,\n out: Int32Array,\n outPos: number,\n expectedCount: number,\n): number {\n if (expectedCount === 0) return inPos;\n\n let bitOffset = 0;\n let wordIndex = inPos;\n const finalWordIndex = inPos + inLength;\n const outPos0 = outPos;\n let tmpOutPos = outPos;\n const targetOut = outPos + expectedCount;\n\n let accumulator = 0;\n let accumulatorShift = 0;\n\n while (wordIndex < finalWordIndex && tmpOutPos < targetOut) {\n const word = inValues[wordIndex];\n const byte = (word >>> bitOffset) & 0xff;\n bitOffset += 8;\n wordIndex += bitOffset >>> 5;\n bitOffset &= 31;\n\n accumulator |= (byte & 0x7f) << accumulatorShift;\n if ((byte & 0x80) !== 0) {\n out[tmpOutPos++] = accumulator | 0;\n accumulator = 0;\n accumulatorShift = 0;\n } else {\n accumulatorShift += 7;\n if (accumulatorShift > 28) {\n throw new Error(\n `FastPFOR VByte: unterminated value (expected MSB=1 terminator within 5 bytes; shift=${accumulatorShift}, partial=${accumulator}, decoded=${tmpOutPos - outPos0}/${expectedCount}, inPos=${wordIndex}, inEnd=${finalWordIndex})`,\n );\n }\n }\n }\n\n if (tmpOutPos !== targetOut) {\n throw new Error(\n `FastPFOR VByte: truncated stream (decoded=${tmpOutPos - outPos0}, expected=${expectedCount}, consumedWords=${wordIndex - inPos}/${inLength}, vbyteStart=${inPos}, vbyteEnd=${finalWordIndex})`,\n );\n }\n\n return wordIndex;\n}\n\n/**\n * Decodes a sequence of FastPFOR-encoded integers.\n *\n * @param encoded The input buffer containing FastPFOR encoded data.\n * @param numValues The number of integers expected to be decoded.\n * @param workspace Optional workspace for reuse across calls. If omitted, a new workspace is created per call.\n */\nexport function decodeFastPforInt32(\n encoded: Int32Buf,\n numValues: number,\n workspace?: FastPforDecoderWorkspace,\n): Int32Array {\n let inPos = 0;\n let outPos = 0;\n const decoded = new Int32Array(numValues);\n\n const decoderWorkspace = workspace ?? createDecoderWorkspace();\n\n if (encoded.length > 0) {\n const alignedLength = encoded[inPos] | 0;\n inPos = (inPos + 1) | 0;\n\n if (alignedLength < 0 || (alignedLength & (BLOCK_SIZE - 1)) !== 0) {\n throw new Error(\n `FastPFOR decode: invalid alignedLength=${alignedLength} (expected >= 0 and multiple of ${BLOCK_SIZE})`,\n );\n }\n\n if (outPos + alignedLength > decoded.length) {\n throw new Error(\n `FastPFOR decode: output buffer too small (outPos=${outPos}, alignedLength=${alignedLength}, out.length=${decoded.length})`,\n );\n }\n\n inPos = decodeAlignedPages(encoded, decoded, inPos, outPos, alignedLength, decoderWorkspace);\n outPos = (outPos + alignedLength) | 0;\n }\n\n const remainingLength = (encoded.length - inPos) | 0;\n const expectedTail = (numValues - outPos) | 0;\n decodeVByte(encoded, inPos, remainingLength, decoded, outPos, expectedTail);\n\n return decoded;\n}\n\nfunction fastUnpack32(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number, bitWidth: number): void {\n switch (bitWidth) {\n case 2:\n fastUnpack32_2(inValues, inPos, out, outPos);\n return;\n case 3:\n fastUnpack32_3(inValues, inPos, out, outPos);\n return;\n case 4:\n fastUnpack32_4(inValues, inPos, out, outPos);\n return;\n case 5:\n fastUnpack32_5(inValues, inPos, out, outPos);\n return;\n case 6:\n fastUnpack32_6(inValues, inPos, out, outPos);\n return;\n case 7:\n fastUnpack32_7(inValues, inPos, out, outPos);\n return;\n case 8:\n fastUnpack32_8(inValues, inPos, out, outPos);\n return;\n case 9:\n fastUnpack32_9(inValues, inPos, out, outPos);\n return;\n case 10:\n fastUnpack32_10(inValues, inPos, out, outPos);\n return;\n case 11:\n fastUnpack32_11(inValues, inPos, out, outPos);\n return;\n case 12:\n fastUnpack32_12(inValues, inPos, out, outPos);\n return;\n case 16:\n fastUnpack32_16(inValues, inPos, out, outPos);\n return;\n case 32:\n for (let i = 0; i < 32; i = (i + 1) | 0) {\n out[(outPos + i) | 0] = inValues[(inPos + i) | 0] | 0;\n }\n return;\n default:\n break;\n }\n\n const valueMask = MASKS[bitWidth] >>> 0;\n let inputWordIndex = inPos;\n let bitOffset = 0;\n let currentWord = inValues[inputWordIndex] >>> 0;\n\n for (let i = 0; i < 32; i++) {\n if (bitOffset + bitWidth <= 32) {\n const value = (currentWord >>> bitOffset) & valueMask;\n out[outPos + i] = value | 0;\n bitOffset += bitWidth;\n\n if (bitOffset === 32) {\n bitOffset = 0;\n inputWordIndex++;\n if (i !== 31) currentWord = inValues[inputWordIndex] >>> 0;\n }\n } else {\n const lowBits = 32 - bitOffset;\n const low = currentWord >>> bitOffset;\n\n inputWordIndex++;\n currentWord = inValues[inputWordIndex] >>> 0;\n const highMask = MASKS[bitWidth - lowBits] >>> 0;\n const high = currentWord & highMask;\n\n const value = (low | (high << lowBits)) & valueMask;\n out[outPos + i] = value | 0;\n bitOffset = bitWidth - lowBits;\n }\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export type Int32Buf = Int32Array<ArrayBufferLike>;
2
+ export type Uint8Buf = Uint8Array<ArrayBufferLike>;
3
+ export declare const MASKS: Readonly<Uint32Array>;
4
+ export declare const DEFAULT_PAGE_SIZE = 65536;
5
+ export declare const BLOCK_SIZE = 256;
6
+ export declare function greatestMultiple(value: number, factor: number): number;
7
+ export declare function roundUpToMultipleOf32(value: number): number;
8
+ export declare function normalizePageSize(pageSize: number): number;
9
+ export declare function bswap32(value: number): number;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Bit masks for each bitwidth 0-32.
3
+ * DO NOT MUTATE - this is a shared constant.
4
+ */
5
+ const masks = new Uint32Array(33);
6
+ masks[0] = 0;
7
+ for (let bitWidth = 1; bitWidth <= 32; bitWidth++) {
8
+ masks[bitWidth] = bitWidth === 32 ? 0xffffffff : 0xffffffff >>> (32 - bitWidth);
9
+ }
10
+ export const MASKS = masks;
11
+ export const DEFAULT_PAGE_SIZE = 65536;
12
+ export const BLOCK_SIZE = 256;
13
+ export function greatestMultiple(value, factor) {
14
+ return value - (value % factor);
15
+ }
16
+ export function roundUpToMultipleOf32(value) {
17
+ return greatestMultiple(value + 31, 32);
18
+ }
19
+ export function normalizePageSize(pageSize) {
20
+ if (!Number.isFinite(pageSize) || pageSize <= 0)
21
+ return DEFAULT_PAGE_SIZE;
22
+ const aligned = greatestMultiple(Math.floor(pageSize), BLOCK_SIZE);
23
+ return aligned === 0 ? BLOCK_SIZE : aligned;
24
+ }
25
+ export function bswap32(value) {
26
+ const x = value >>> 0;
27
+ return (((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x >>> 8) & 0xff00) | ((x >>> 24) & 0xff)) >>> 0;
28
+ }
29
+ //# sourceMappingURL=fastPforShared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastPforShared.js","sourceRoot":"","sources":["../../src/decoding/fastPforShared.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACb,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;IAChD,KAAK,CAAC,QAAQ,CAAC,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AACpF,CAAC;AACD,MAAM,CAAC,MAAM,KAAK,GAA0B,KAAK,CAAC;AAElD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AACvC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,MAAc;IAC1D,OAAO,KAAK,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IAC/C,OAAO,gBAAgB,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAC9C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAE1E,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IACnE,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACjC,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;IACtB,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AACzG,CAAC","sourcesContent":["export type Int32Buf = Int32Array<ArrayBufferLike>;\nexport type Uint8Buf = Uint8Array<ArrayBufferLike>;\n\n/**\n * Bit masks for each bitwidth 0-32.\n * DO NOT MUTATE - this is a shared constant.\n */\nconst masks = new Uint32Array(33);\nmasks[0] = 0;\nfor (let bitWidth = 1; bitWidth <= 32; bitWidth++) {\n masks[bitWidth] = bitWidth === 32 ? 0xffffffff : 0xffffffff >>> (32 - bitWidth);\n}\nexport const MASKS: Readonly<Uint32Array> = masks;\n\nexport const DEFAULT_PAGE_SIZE = 65536;\nexport const BLOCK_SIZE = 256;\n\nexport function greatestMultiple(value: number, factor: number): number {\n return value - (value % factor);\n}\n\nexport function roundUpToMultipleOf32(value: number): number {\n return greatestMultiple(value + 31, 32);\n}\n\nexport function normalizePageSize(pageSize: number): number {\n if (!Number.isFinite(pageSize) || pageSize <= 0) return DEFAULT_PAGE_SIZE;\n\n const aligned = greatestMultiple(Math.floor(pageSize), BLOCK_SIZE);\n return aligned === 0 ? BLOCK_SIZE : aligned;\n}\n\nexport function bswap32(value: number): number {\n const x = value >>> 0;\n return (((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x >>> 8) & 0xff00) | ((x >>> 24) & 0xff)) >>> 0;\n}\n"]}
@@ -0,0 +1,23 @@
1
+ export declare function fastUnpack32_1(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
2
+ export declare function fastUnpack32_2(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
3
+ export declare function fastUnpack32_3(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
4
+ export declare function fastUnpack32_4(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
5
+ export declare function fastUnpack32_5(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
6
+ export declare function fastUnpack32_6(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
7
+ export declare function fastUnpack32_7(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
8
+ export declare function fastUnpack32_8(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
9
+ export declare function fastUnpack32_9(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
10
+ export declare function fastUnpack32_10(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
11
+ export declare function fastUnpack32_11(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
12
+ export declare function fastUnpack32_12(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
13
+ export declare function fastUnpack32_16(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
14
+ export declare function fastUnpack256_1(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
15
+ export declare function fastUnpack256_2(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
16
+ export declare function fastUnpack256_3(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
17
+ export declare function fastUnpack256_4(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
18
+ export declare function fastUnpack256_5(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
19
+ export declare function fastUnpack256_6(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
20
+ export declare function fastUnpack256_7(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
21
+ export declare function fastUnpack256_8(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
22
+ export declare function fastUnpack256_16(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number): void;
23
+ export declare function fastUnpack256_Generic(inValues: Int32Array, inPos: number, out: Int32Array, outPos: number, bitWidth: number): void;