@gmod/cram 3.0.6 → 3.0.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 (113) hide show
  1. package/dist/cram-bundle.js +1 -1
  2. package/dist/cramFile/codecs/byteArrayStop.d.ts +2 -2
  3. package/dist/cramFile/file.js +8 -10
  4. package/dist/cramFile/file.js.map +1 -1
  5. package/dist/cramFile/util.js.map +1 -1
  6. package/dist/htscodecs/arith_gen.d.ts +26 -0
  7. package/dist/htscodecs/arith_gen.js +558 -0
  8. package/dist/htscodecs/arith_gen.js.map +1 -0
  9. package/dist/htscodecs/arith_sh.d.ts +16 -0
  10. package/dist/htscodecs/arith_sh.js +128 -0
  11. package/dist/htscodecs/arith_sh.js.map +1 -0
  12. package/dist/htscodecs/byte_model.d.ts +11 -0
  13. package/dist/htscodecs/byte_model.js +113 -0
  14. package/dist/htscodecs/byte_model.js.map +1 -0
  15. package/dist/htscodecs/fqzcomp.d.ts +2 -0
  16. package/dist/htscodecs/fqzcomp.js +744 -0
  17. package/dist/htscodecs/fqzcomp.js.map +1 -0
  18. package/dist/htscodecs/index.d.ts +5 -0
  19. package/dist/htscodecs/index.js +70 -0
  20. package/dist/htscodecs/index.js.map +1 -0
  21. package/dist/htscodecs/iostream.d.ts +26 -0
  22. package/dist/htscodecs/iostream.js +242 -0
  23. package/dist/htscodecs/iostream.js.map +1 -0
  24. package/dist/htscodecs/main_arith_gen.d.ts +1 -0
  25. package/dist/htscodecs/main_arith_gen.js +86 -0
  26. package/dist/htscodecs/main_arith_gen.js.map +1 -0
  27. package/dist/htscodecs/main_fqzcomp.d.ts +1 -0
  28. package/dist/htscodecs/main_fqzcomp.js +112 -0
  29. package/dist/htscodecs/main_fqzcomp.js.map +1 -0
  30. package/dist/htscodecs/main_rans.d.ts +1 -0
  31. package/dist/htscodecs/main_rans.js +83 -0
  32. package/dist/htscodecs/main_rans.js.map +1 -0
  33. package/dist/htscodecs/main_rans4x16.d.ts +1 -0
  34. package/dist/htscodecs/main_rans4x16.js +82 -0
  35. package/dist/htscodecs/main_rans4x16.js.map +1 -0
  36. package/dist/htscodecs/main_tok3.d.ts +1 -0
  37. package/dist/htscodecs/main_tok3.js +84 -0
  38. package/dist/htscodecs/main_tok3.js.map +1 -0
  39. package/dist/htscodecs/rans.d.ts +2 -0
  40. package/dist/htscodecs/rans.js +480 -0
  41. package/dist/htscodecs/rans.js.map +1 -0
  42. package/dist/htscodecs/rans4x16.d.ts +2 -0
  43. package/dist/htscodecs/rans4x16.js +896 -0
  44. package/dist/htscodecs/rans4x16.js.map +1 -0
  45. package/dist/htscodecs/tok3.d.ts +2 -0
  46. package/dist/htscodecs/tok3.js +347 -0
  47. package/dist/htscodecs/tok3.js.map +1 -0
  48. package/esm/cramFile/codecs/byteArrayStop.d.ts +2 -2
  49. package/esm/cramFile/file.js +8 -10
  50. package/esm/cramFile/file.js.map +1 -1
  51. package/esm/cramFile/util.js.map +1 -1
  52. package/esm/htscodecs/arith_gen.d.ts +26 -0
  53. package/esm/htscodecs/arith_gen.js +558 -0
  54. package/esm/htscodecs/arith_gen.js.map +1 -0
  55. package/esm/htscodecs/arith_sh.d.ts +16 -0
  56. package/esm/htscodecs/arith_sh.js +128 -0
  57. package/esm/htscodecs/arith_sh.js.map +1 -0
  58. package/esm/htscodecs/byte_model.d.ts +11 -0
  59. package/esm/htscodecs/byte_model.js +113 -0
  60. package/esm/htscodecs/byte_model.js.map +1 -0
  61. package/esm/htscodecs/fqzcomp.d.ts +2 -0
  62. package/esm/htscodecs/fqzcomp.js +744 -0
  63. package/esm/htscodecs/fqzcomp.js.map +1 -0
  64. package/esm/htscodecs/index.d.ts +5 -0
  65. package/esm/htscodecs/index.js +70 -0
  66. package/esm/htscodecs/index.js.map +1 -0
  67. package/esm/htscodecs/iostream.d.ts +26 -0
  68. package/esm/htscodecs/iostream.js +242 -0
  69. package/esm/htscodecs/iostream.js.map +1 -0
  70. package/esm/htscodecs/main_arith_gen.d.ts +1 -0
  71. package/esm/htscodecs/main_arith_gen.js +86 -0
  72. package/esm/htscodecs/main_arith_gen.js.map +1 -0
  73. package/esm/htscodecs/main_fqzcomp.d.ts +1 -0
  74. package/esm/htscodecs/main_fqzcomp.js +112 -0
  75. package/esm/htscodecs/main_fqzcomp.js.map +1 -0
  76. package/esm/htscodecs/main_rans.d.ts +1 -0
  77. package/esm/htscodecs/main_rans.js +83 -0
  78. package/esm/htscodecs/main_rans.js.map +1 -0
  79. package/esm/htscodecs/main_rans4x16.d.ts +1 -0
  80. package/esm/htscodecs/main_rans4x16.js +82 -0
  81. package/esm/htscodecs/main_rans4x16.js.map +1 -0
  82. package/esm/htscodecs/main_tok3.d.ts +1 -0
  83. package/esm/htscodecs/main_tok3.js +84 -0
  84. package/esm/htscodecs/main_tok3.js.map +1 -0
  85. package/esm/htscodecs/rans.d.ts +2 -0
  86. package/esm/htscodecs/rans.js +480 -0
  87. package/esm/htscodecs/rans.js.map +1 -0
  88. package/esm/htscodecs/rans4x16.d.ts +2 -0
  89. package/esm/htscodecs/rans4x16.js +896 -0
  90. package/esm/htscodecs/rans4x16.js.map +1 -0
  91. package/esm/htscodecs/tok3.d.ts +2 -0
  92. package/esm/htscodecs/tok3.js +347 -0
  93. package/esm/htscodecs/tok3.js.map +1 -0
  94. package/package.json +1 -2
  95. package/src/cramFile/file.ts +8 -10
  96. package/src/cramFile/util.ts +0 -1
  97. package/src/htscodecs/Makefile +142 -0
  98. package/src/htscodecs/README.md +64 -0
  99. package/src/htscodecs/arith_gen.js +607 -0
  100. package/src/htscodecs/arith_sh.js +138 -0
  101. package/src/htscodecs/byte_model.js +126 -0
  102. package/src/htscodecs/fqzcomp.js +834 -0
  103. package/src/htscodecs/index.js +79 -0
  104. package/src/htscodecs/iostream.js +256 -0
  105. package/src/htscodecs/main_arith_gen.js +96 -0
  106. package/src/htscodecs/main_fqzcomp.js +113 -0
  107. package/src/htscodecs/main_rans.js +88 -0
  108. package/src/htscodecs/main_rans4x16.js +87 -0
  109. package/src/htscodecs/main_tok3.js +86 -0
  110. package/src/htscodecs/rans.js +545 -0
  111. package/src/htscodecs/rans4x16.js +1003 -0
  112. package/src/htscodecs/tok3.js +396 -0
  113. package/src/typings/htscodecs.d.ts +0 -6
@@ -0,0 +1,607 @@
1
+ /*
2
+ * Copyright (c) 2019,2020 Genome Research Ltd.
3
+ * Author(s): James Bonfield
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ *
8
+ * 1. Redistributions of source code must retain the above copyright notice,
9
+ * this list of conditions and the following disclaimer.
10
+ *
11
+ * 2. Redistributions in binary form must reproduce the above
12
+ * copyright notice, this list of conditions and the following
13
+ * disclaimer in the documentation and/or other materials provided
14
+ * with the distribution.
15
+ *
16
+ * 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
17
+ * Institute nor the names of its contributors may be used to endorse
18
+ * or promote products derived from this software without specific
19
+ * prior written permission.
20
+ *
21
+ * THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS
22
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
24
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH
25
+ * LTD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ */
33
+
34
+ const RangeCoder = require('./arith_sh')
35
+ const IOStream = require('./iostream')
36
+ const ByteModel = require('./byte_model')
37
+ const bzip2 = require('bzip2')
38
+
39
+ const ARITH_ORDER = 1
40
+ const ARITH_EXT = 4
41
+ const ARITH_STRIPE = 8
42
+ const ARITH_NOSIZE = 16
43
+ const ARITH_CAT = 32
44
+ const ARITH_RLE = 64
45
+ const ARITH_PACK = 128
46
+
47
+ module.exports = class RangeCoderGen {
48
+ decode(src) {
49
+ this.stream = new IOStream(src)
50
+ return this.decodeStream(this.stream)
51
+ }
52
+
53
+ decodeStream(stream, n_out = 0) {
54
+ var flags = this.stream.ReadByte()
55
+ if (!(flags & ARITH_NOSIZE)) n_out = this.stream.ReadUint7()
56
+ var e_len = n_out
57
+
58
+ var order = flags & ARITH_ORDER
59
+
60
+ // 4-way recursion
61
+ if (flags & ARITH_STRIPE) return this.decodeStripe(this.stream, n_out)
62
+
63
+ // Meta data
64
+ if (flags & ARITH_PACK) {
65
+ var P
66
+ ;[P, e_len] = this.decodePackMeta(this.stream)
67
+ }
68
+
69
+ // NOP, useful for tiny blocks
70
+ if (flags & ARITH_CAT) var data = this.decodeCat(this.stream, e_len)
71
+ // Entropy decode
72
+ else if (flags & ARITH_EXT) {
73
+ var data = this.decodeExt(this.stream, e_len)
74
+ } else if (flags & ARITH_RLE) {
75
+ var data = order
76
+ ? this.decodeRLE1(this.stream, e_len)
77
+ : this.decodeRLE0(this.stream, e_len)
78
+ } else {
79
+ var data = order
80
+ ? this.decode1(this.stream, e_len)
81
+ : this.decode0(this.stream, e_len)
82
+ }
83
+
84
+ // Transforms
85
+ if (flags & ARITH_PACK) data = this.decodePack(data, P, n_out)
86
+
87
+ return data
88
+ }
89
+
90
+ encode(src, flags) {
91
+ this.stream = new IOStream('', 0, src.length * 1.1 + 100) // guestimate worst case!
92
+
93
+ this.stream.WriteByte(flags)
94
+ if (!(flags & ARITH_NOSIZE)) this.stream.WriteUint7(src.length)
95
+
96
+ if (flags & ARITH_STRIPE)
97
+ return Buffer.concat([
98
+ this.stream.buf.slice(0, this.stream.pos),
99
+ this.encodeStripe(this.stream, src, flags >> 8),
100
+ ])
101
+
102
+ var order = flags & ARITH_ORDER
103
+ var e_len = src.length
104
+
105
+ // step 1: Encode meta-data
106
+ var pack_meta
107
+ if (flags & ARITH_PACK) [pack_meta, src, e_len] = this.encodePack(src)
108
+
109
+ // step 2: Write any meta data
110
+ if (flags & ARITH_PACK) this.stream.WriteStream(pack_meta)
111
+
112
+ // step 3: arith encoding below
113
+ if (flags & ARITH_RLE) {
114
+ return order
115
+ ? this.encodeRLE1(src, e_len, this.stream)
116
+ : this.encodeRLE0(src, e_len, this.stream)
117
+ } else {
118
+ return order
119
+ ? this.encode1(src, e_len, this.stream)
120
+ : this.encode0(src, e_len, this.stream)
121
+ }
122
+ }
123
+
124
+ //----------------------------------------------------------------------
125
+ // Order-0 codec
126
+ decode0(stream, n_out) {
127
+ var output = new Buffer.allocUnsafe(n_out)
128
+
129
+ var max_sym = stream.ReadByte()
130
+ if (max_sym == 0) max_sym = 256
131
+
132
+ var byte_model = new ByteModel(max_sym)
133
+
134
+ var rc = new RangeCoder(stream)
135
+ rc.RangeStartDecode(stream)
136
+
137
+ for (var i = 0; i < n_out; i++)
138
+ output[i] = byte_model.ModelDecode(stream, rc)
139
+
140
+ return output
141
+ }
142
+
143
+ encode0(src, n_in, out) {
144
+ // Count the maximum symbol present
145
+ var max_sym = 0
146
+ for (var i = 0; i < n_in; i++) if (max_sym < src[i]) max_sym = src[i]
147
+ max_sym++ // FIXME not what spec states!?
148
+
149
+ var byte_model = new ByteModel(max_sym)
150
+ out.WriteByte(max_sym)
151
+ var rc = new RangeCoder(out)
152
+
153
+ for (var i = 0; i < n_in; i++) byte_model.ModelEncode(out, rc, src[i])
154
+ rc.RangeFinishEncode(out)
155
+
156
+ return out.buf.slice(0, out.pos)
157
+ }
158
+
159
+ //----------------------------------------------------------------------
160
+ // Order-1 codec
161
+
162
+ decode1(stream, n_out) {
163
+ var output = new Buffer.allocUnsafe(n_out)
164
+
165
+ var max_sym = stream.ReadByte()
166
+ if (max_sym == 0) max_sym = 256
167
+
168
+ var byte_model = new Array(max_sym)
169
+ for (var i = 0; i < max_sym; i++) byte_model[i] = new ByteModel(max_sym)
170
+
171
+ var rc = new RangeCoder(stream)
172
+ rc.RangeStartDecode(stream)
173
+
174
+ var last = 0
175
+ for (var i = 0; i < n_out; i++) {
176
+ output[i] = byte_model[last].ModelDecode(stream, rc)
177
+ last = output[i]
178
+ }
179
+
180
+ return output
181
+ }
182
+
183
+ encode1(src, n_in, out) {
184
+ // Count the maximum symbol present
185
+ var max_sym = 0
186
+ for (var i = 0; i < n_in; i++) if (max_sym < src[i]) max_sym = src[i]
187
+ max_sym++ // FIXME not what spec states!
188
+
189
+ var byte_model = new Array(max_sym)
190
+ for (var i = 0; i < max_sym; i++) byte_model[i] = new ByteModel(max_sym)
191
+ out.WriteByte(max_sym)
192
+ var rc = new RangeCoder(out)
193
+
194
+ var last = 0
195
+ for (var i = 0; i < n_in; i++) {
196
+ byte_model[last].ModelEncode(out, rc, src[i])
197
+ last = src[i]
198
+ }
199
+ rc.RangeFinishEncode(out)
200
+
201
+ return out.buf.slice(0, out.pos)
202
+ }
203
+
204
+ //----------------------------------------------------------------------
205
+ // External codec
206
+ decodeExt(stream, n_out) {
207
+ // Bzip2 only for now
208
+ var output = new Buffer.allocUnsafe(n_out)
209
+ var bits = bzip2.array(stream.buf.slice(stream.pos))
210
+ var size = bzip2.header(bits)
211
+ var j = 0
212
+ do {
213
+ var chunk = bzip2.decompress(bits, size)
214
+ if (chunk != -1) {
215
+ Buffer.from(chunk).copy(output, j)
216
+ j += chunk.length
217
+ size -= chunk.length
218
+ }
219
+ } while (chunk != -1)
220
+
221
+ return output
222
+ }
223
+
224
+ encodeExt(stream, n_out) {
225
+ // We cannot compress using Bzip2 now as it's
226
+ // absent from bzip2.js, but consider using
227
+ // https://github.com/cscott/compressjs
228
+ }
229
+
230
+ //----------------------------------------------------------------------
231
+ // Order-0 RLE codec
232
+ decodeRLE0(stream, n_out) {
233
+ var output = new Buffer.allocUnsafe(n_out)
234
+
235
+ var max_sym = stream.ReadByte()
236
+ if (max_sym == 0) max_sym = 256
237
+
238
+ var model_lit = new ByteModel(max_sym)
239
+ var model_run = new Array(258)
240
+ for (var i = 0; i <= 257; i++) model_run[i] = new ByteModel(4)
241
+
242
+ var rc = new RangeCoder(stream)
243
+ rc.RangeStartDecode(stream)
244
+
245
+ var i = 0
246
+ while (i < n_out) {
247
+ output[i] = model_lit.ModelDecode(stream, rc)
248
+ var part = model_run[output[i]].ModelDecode(stream, rc)
249
+ var run = part
250
+ var rctx = 256
251
+ while (part == 3) {
252
+ part = model_run[rctx].ModelDecode(stream, rc)
253
+ rctx = 257
254
+ run += part
255
+ }
256
+ for (var j = 1; j <= run; j++) output[i + j] = output[i]
257
+ i += run + 1
258
+ }
259
+
260
+ return output
261
+ }
262
+
263
+ encodeRLE0(src, n_in, out) {
264
+ // Count the maximum symbol present
265
+ var max_sym = 0
266
+ for (var i = 0; i < n_in; i++) if (max_sym < src[i]) max_sym = src[i]
267
+ max_sym++ // FIXME not what spec states!
268
+
269
+ var model_lit = new ByteModel(max_sym)
270
+ var model_run = new Array(258)
271
+ for (var i = 0; i <= 257; i++) model_run[i] = new ByteModel(4)
272
+
273
+ out.WriteByte(max_sym)
274
+ var rc = new RangeCoder(out)
275
+
276
+ var i = 0
277
+ while (i < n_in) {
278
+ model_lit.ModelEncode(out, rc, src[i])
279
+ var run = 1
280
+ while (i + run < n_in && src[i + run] == src[i]) run++
281
+ run--
282
+
283
+ var rctx = src[i]
284
+ var last = src[i]
285
+ i += run + 1
286
+
287
+ var part = run >= 3 ? 3 : run
288
+ model_run[rctx].ModelEncode(out, rc, part)
289
+ run -= part
290
+ rctx = 256
291
+ while (part == 3) {
292
+ part = run >= 3 ? 3 : run
293
+ model_run[rctx].ModelEncode(out, rc, part)
294
+ rctx = 257
295
+ run -= part
296
+ }
297
+ }
298
+ rc.RangeFinishEncode(out)
299
+
300
+ return out.buf.slice(0, out.pos)
301
+ }
302
+
303
+ //----------------------------------------------------------------------
304
+ // Order-1 RLE codec
305
+
306
+ decodeRLE1(stream, n_out) {
307
+ var output = new Buffer.allocUnsafe(n_out)
308
+
309
+ var max_sym = stream.ReadByte()
310
+ if (max_sym == 0) max_sym = 256
311
+
312
+ var model_lit = new Array(max_sym)
313
+ for (var i = 0; i < max_sym; i++) model_lit[i] = new ByteModel(max_sym)
314
+
315
+ var model_run = new Array(258)
316
+ for (var i = 0; i <= 257; i++) model_run[i] = new ByteModel(4)
317
+
318
+ var rc = new RangeCoder(stream)
319
+ rc.RangeStartDecode(stream)
320
+
321
+ var last = 0
322
+ var i = 0
323
+ while (i < n_out) {
324
+ output[i] = model_lit[last].ModelDecode(stream, rc)
325
+ last = output[i]
326
+ var part = model_run[output[i]].ModelDecode(stream, rc)
327
+ var run = part
328
+ var rctx = 256
329
+ while (part == 3) {
330
+ part = model_run[rctx].ModelDecode(stream, rc)
331
+ rctx = 257
332
+ run += part
333
+ }
334
+ for (var j = 1; j <= run; j++) output[i + j] = output[i]
335
+ i += run + 1
336
+ }
337
+
338
+ return output
339
+ }
340
+
341
+ encodeRLE1(src, n_in, out) {
342
+ // Count the maximum symbol present
343
+ var max_sym = 0
344
+ for (var i = 0; i < n_in; i++) if (max_sym < src[i]) max_sym = src[i]
345
+ max_sym++ // FIXME not what spec states!
346
+
347
+ var model_lit = new Array(max_sym)
348
+ for (var i = 0; i < max_sym; i++) model_lit[i] = new ByteModel(max_sym)
349
+ var model_run = new Array(258)
350
+ for (var i = 0; i <= 257; i++) model_run[i] = new ByteModel(4)
351
+
352
+ out.WriteByte(max_sym)
353
+ var rc = new RangeCoder(out)
354
+
355
+ var i = 0
356
+ var last = 0
357
+ while (i < n_in) {
358
+ model_lit[last].ModelEncode(out, rc, src[i])
359
+ var run = 1
360
+ while (i + run < n_in && src[i + run] == src[i]) run++
361
+ run--
362
+
363
+ var rctx = src[i]
364
+ last = src[i]
365
+ i += run + 1
366
+
367
+ var part = run >= 3 ? 3 : run
368
+ model_run[rctx].ModelEncode(out, rc, part)
369
+ run -= part
370
+ rctx = 256
371
+ while (part == 3) {
372
+ part = run >= 3 ? 3 : run
373
+ model_run[rctx].ModelEncode(out, rc, part)
374
+ rctx = 257
375
+ run -= part
376
+ }
377
+ }
378
+ rc.RangeFinishEncode(out)
379
+
380
+ return out.buf.slice(0, out.pos)
381
+ }
382
+
383
+ //----------------------------------------------------------------------
384
+ // Pack method
385
+ decodePackMeta(stream) {
386
+ this.nsym = stream.ReadByte()
387
+
388
+ var M = new Array(this.nsym)
389
+ for (var i = 0; i < this.nsym; i++) M[i] = stream.ReadByte()
390
+
391
+ var e_len = stream.ReadUint7() // Could be derived data from nsym and n_out
392
+
393
+ return [M, e_len]
394
+ }
395
+
396
+ decodePack(data, M, len) {
397
+ var out = new Buffer.allocUnsafe(len)
398
+
399
+ if (this.nsym <= 1) {
400
+ // Constant value
401
+ for (var i = 0; i < len; i++) out[i] = M[0]
402
+ } else if (this.nsym <= 2) {
403
+ // 1 bit per value
404
+ for (var i = 0, j = 0; i < len; i++) {
405
+ if (i % 8 == 0) var v = data[j++]
406
+ out[i] = M[v & 1]
407
+ v >>= 1
408
+ }
409
+ } else if (this.nsym <= 4) {
410
+ // 2 bits per value
411
+ for (var i = 0, j = 0; i < len; i++) {
412
+ if (i % 4 == 0) var v = data[j++]
413
+ out[i] = M[v & 3]
414
+ v >>= 2
415
+ }
416
+ } else if (this.nsym <= 16) {
417
+ // 4 bits per value
418
+ for (var i = 0, j = 0; i < len; i++) {
419
+ if (i % 2 == 0) var v = data[j++]
420
+ out[i] = M[v & 15]
421
+ v >>= 4
422
+ }
423
+ } else {
424
+ // 8 bits per value: NOP
425
+ return data
426
+ }
427
+
428
+ return out
429
+ }
430
+
431
+ // Compute M array and return meta-data stream
432
+ packMeta(src) {
433
+ var stream = new IOStream('', 0, 1024)
434
+
435
+ // Count symbols
436
+ var M = new Array(256)
437
+ for (var i = 0; i < src.length; i++) M[src[i]] = 1
438
+
439
+ // Write Map
440
+ for (var nsym = 0, i = 0; i < 256; i++) if (M[i]) M[i] = ++nsym // map to 1..N
441
+ stream.WriteByte(nsym)
442
+
443
+ // FIXME: add check for nsym > 16?
444
+ // Or just accept it as an inefficient waste of time.
445
+ for (var i = 0; i < 256; i++) {
446
+ if (M[i]) {
447
+ stream.WriteByte(i) // adjust to 0..N-1
448
+ M[i]--
449
+ }
450
+ }
451
+
452
+ return [stream, M, nsym]
453
+ }
454
+
455
+ encodePack(data) {
456
+ var meta, M, nsym
457
+ ;[meta, M, nsym] = this.packMeta(data)
458
+
459
+ var len = data.length
460
+ var i = 0
461
+ if (nsym <= 1) {
462
+ // Constant values
463
+ meta.WriteUint7(0)
464
+ return [meta, new Buffer.allocUnsafe(0), 0]
465
+ }
466
+
467
+ if (nsym <= 2) {
468
+ // 1 bit per value
469
+ var out = new Buffer.allocUnsafe(Math.floor((len + 7) / 8))
470
+ for (var i = 0, j = 0; i < (len & ~7); i += 8, j++)
471
+ out[j] =
472
+ (M[data[i + 0]] << 0) +
473
+ (M[data[i + 1]] << 1) +
474
+ (M[data[i + 2]] << 2) +
475
+ (M[data[i + 3]] << 3) +
476
+ (M[data[i + 4]] << 4) +
477
+ (M[data[i + 5]] << 5) +
478
+ (M[data[i + 6]] << 6) +
479
+ (M[data[i + 7]] << 7)
480
+ if (i < len) {
481
+ out[j] = 0
482
+ var v = 0
483
+ while (i < len) {
484
+ out[j] |= M[data[i++]] << v
485
+ v++
486
+ }
487
+ j++
488
+ }
489
+
490
+ meta.WriteUint7(j)
491
+ return [meta, out, out.length]
492
+ }
493
+
494
+ if (nsym <= 4) {
495
+ // 2 bits per value
496
+ var out = new Buffer.allocUnsafe(Math.floor((len + 3) / 4))
497
+ for (var i = 0, j = 0; i < (len & ~3); i += 4, j++)
498
+ out[j] =
499
+ (M[data[i + 0]] << 0) +
500
+ (M[data[i + 1]] << 2) +
501
+ (M[data[i + 2]] << 4) +
502
+ (M[data[i + 3]] << 6)
503
+
504
+ if (i < len) {
505
+ out[j] = 0
506
+ var v = 0
507
+ while (i < len) {
508
+ out[j] |= M[data[i++]] << v
509
+ v += 2
510
+ }
511
+ j++
512
+ }
513
+
514
+ meta.WriteUint7(j)
515
+ return [meta, out, out.length]
516
+ }
517
+
518
+ if (nsym <= 16) {
519
+ // 4 bits per value
520
+ var out = new Buffer.allocUnsafe(Math.floor((len + 1) / 2))
521
+ for (var i = 0, j = 0; i < (len & ~1); i += 2, j++)
522
+ out[j] = (M[data[i + 0]] << 0) + (M[data[i + 1]] << 4)
523
+ if (i < len) out[j++] = M[data[i++]]
524
+
525
+ meta.WriteUint7(j)
526
+ return [meta, out, out.length]
527
+ }
528
+
529
+ // Otherwise an expensive NOP
530
+ meta.WriteUint7(data.length)
531
+ return [meta, data, data.length]
532
+ }
533
+
534
+ //----------------------------------------------------------------------
535
+ // STRIPE method
536
+ encodeStripe(hdr, src, N) {
537
+ if (N == 0) N = 4 // old default
538
+
539
+ // Split into multiple streams
540
+ var part = new Array(N)
541
+ var ulen = new Array(N)
542
+ for (var s = 0; s < N; s++) {
543
+ ulen[s] = Math.floor(src.length / N) + (src.length % N > s)
544
+ part[s] = new Array(ulen[s])
545
+ }
546
+
547
+ for (var x = 0, i = 0; i < src.length; i += N, x++) {
548
+ for (var j = 0; j < N; j++)
549
+ if (x < part[j].length) part[j][x] = src[i + j]
550
+ }
551
+
552
+ // Compress each part
553
+ var comp = new Array(N)
554
+ var total = 0
555
+ for (var s = 0; s < N; s++) {
556
+ // Example: try O0 and O1 and choose best
557
+ var comp0 = this.encode(part[s], 0)
558
+ var comp1 = this.encode(part[s], 1)
559
+ comp[s] = comp1.length < comp0.length ? comp1 : comp0
560
+ total += comp[s].length
561
+ }
562
+
563
+ // Serialise
564
+ var out = new IOStream('', 0, total + 5 * N + 1)
565
+ out.WriteByte(N)
566
+ for (var s = 0; s < N; s++) out.WriteUint7(comp[s].length)
567
+
568
+ for (var s = 0; s < N; s++) out.WriteData(comp[s], comp[s].length)
569
+
570
+ return out.buf.slice(0, out.buf.pos)
571
+ }
572
+
573
+ decodeStripe(stream, len) {
574
+ var N = stream.ReadByte()
575
+
576
+ // Retrieve lengths
577
+ var clen = new Array(N)
578
+ var ulen = new Array(N)
579
+ for (var j = 0; j < N; j++) clen[j] = stream.ReadUint7()
580
+
581
+ // Decode streams
582
+ var T = new Array(N)
583
+ for (var j = 0; j < N; j++) {
584
+ ulen[j] = Math.floor(len / N) + (len % N > j)
585
+ T[j] = this.decodeStream(stream, ulen[j])
586
+ }
587
+
588
+ // Transpose
589
+ var out = new Buffer.allocUnsafe(len)
590
+ for (var j = 0; j < N; j++) {
591
+ for (var i = 0; i < ulen[j]; i++) {
592
+ out[i * N + j] = T[j][i]
593
+ }
594
+ }
595
+
596
+ return out
597
+ }
598
+
599
+ //----------------------------------------------------------------------
600
+ // Cat method
601
+ decodeCat(stream, len) {
602
+ var out = new Buffer.allocUnsafe(len)
603
+ for (var i = 0; i < len; i++) out[i] = stream.ReadByte()
604
+
605
+ return out
606
+ }
607
+ }