JSFiddle - React, Tailwind, and code Playground
FastIntegerCompression.js Test
by skibulk
JavaScript
// you can provide an iterable
function FastIntegerCompression() {
}
function bytelog(val) {
if (val < (1 << 7)) {
return 1;
} else if (val < (1 << 14)) {
return 2;
} else if (val < (1 << 21)) {
return 3;
} else if (val < (1 << 28)) {
return 4;
}
return 5;
}
// compute how many bytes an array of integers would use once compressed
FastIntegerCompression.computeCompressedSizeInBytes = function(input) {
var c = input.length;
var answer = 0;
for(var i = 0; i < c; i++) {
answer += bytelog(input[i]);
}
return answer;
};
// compress an array of integers, return a compressed buffer (as an ArrayBuffer)
FastIntegerCompression.compress = function(input) {
var c = input.length;
var buf = new ArrayBuffer(FastIntegerCompression.computeCompressedSizeInBytes(input));
var view = new Int8Array(buf);
var pos = 0
for(var i = 0; i < c; i++) {
var val = input[i];
if (val < (1 << 7)) {
view[pos++] = val ;
} else if (val < (1 << 14)) {
view[pos++] = (val & 0x7F) | 0x80;
view[pos++] = val >>> 7;
} else if (val < (1 << 21)) {
view[pos++] = (val & 0x7F) | 0x80;
view[pos++] = ( (val >>> 7) & 0x7F ) | 0x80;
view[pos++] = val >>> 14;
} else if (val < (1 << 28)) {
view[pos++] = (val & 0x7F ) | 0x80 ;
view[pos++] = ( (val >>> 7) & 0x7F ) | 0x80;
view[pos++] = ( (val >>> 14) & 0x7F ) | 0x80;
view[pos++] = val >>> 21;
} else {
view[pos++] = ( val & 0x7F ) | 0x80;
view[pos++] = ( (val >>> 7) & 0x7F ) | 0x80;
view[pos++] = ( (val >>> 14) & 0x7F ) | 0x80;
view[pos++] = ( (val >>> 21) & 0x7F ) | 0x80;
view[pos++] = val >>> 28;
}
}
return buf;
};
// from a compressed array of integers stored ArrayBuffer, compute the number of compressed integers by scanning the input
FastIntegerCompression.computeHowManyIntegers = function(input) {
var view = new Int8Array(input);
var c = view.length;
var count = 0;
for(var i = 0;...