From bc4acf86fdc7da76551b9c4b2e29f6fd2765ab55 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 4 Jul 2019 21:22:26 -0400 Subject: [PATCH 01/10] Semicolon. --- FastIntegerCompression.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FastIntegerCompression.js b/FastIntegerCompression.js index 8584552..8cbd647 100644 --- a/FastIntegerCompression.js +++ b/FastIntegerCompression.js @@ -50,7 +50,7 @@ FastIntegerCompression.compress = function(input) { var c = input.length; var buf = new ArrayBuffer(FastIntegerCompression.computeCompressedSizeInBytes(input)); var view = new Int8Array(buf); - var pos = 0 + var pos = 0; for(var i = 0; i < c; i++) { var val = input[i]; if (val < (1 << 7)) { From 4566511918f7f93caa8d71eeb57ed25bf1f5c0aa Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 14 Sep 2019 17:33:09 -0400 Subject: [PATCH 02/10] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b72cb9..085012a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![codebeat badge](https://codebeat.co/badges/fbff9479-9394-40c6-b12d-8c6b666c115e)](https://codebeat.co/projects/github-com-lemire-fastintegercompression-js) This is an integer compression library in JavaScript, useful for work on indexes. -Given an array of small integers, it produces an ArrayBuffer that uses far fewer bytes +Given an array of small non-negative integers, it produces an ArrayBuffer that uses far fewer bytes than the original (using VByte compression). It assumes a modern JavaScript engine with typed arrays. From d9df101bc8918484621e66c059216cac80444301 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 16 Sep 2019 12:09:45 -0400 Subject: [PATCH 03/10] Fix for https://github.com/lemire/FastIntegerCompression.js/issues/3 --- FastIntegerCompression.js | 104 +++++++++++++++++++++++++++++++++++++- README.md | 13 ++++- package.json | 2 +- unit/basictests.js | 9 ++++ 4 files changed, 125 insertions(+), 3 deletions(-) diff --git a/FastIntegerCompression.js b/FastIntegerCompression.js index 8cbd647..37d8627 100644 --- a/FastIntegerCompression.js +++ b/FastIntegerCompression.js @@ -21,6 +21,7 @@ function FastIntegerCompression() { } +// private function function bytelog(val) { if (val < (1 << 7)) { return 1; @@ -34,7 +35,19 @@ function bytelog(val) { return 5; } +// private function +function zigzag_encode(val) { + return (val + val) ^ (val >> 31);; +} + +// private function +function zigzag_decode(val) { + return (val >> 1) ^ (- (val & 1)); +} + + // compute how many bytes an array of integers would use once compressed +// input is expected to be an array of non-negative integers FastIntegerCompression.computeCompressedSizeInBytes = function(input) { var c = input.length; var answer = 0; @@ -45,7 +58,20 @@ FastIntegerCompression.computeCompressedSizeInBytes = function(input) { }; -// compress an array of integers, return a compressed buffer (as an ArrayBuffer) +// compute how many bytes an array of integers would use once compressed +// input is expected to be an array of integers, some of them can be negative +FastIntegerCompression.computeCompressedSizeInBytesSigned = function(input) { + var c = input.length; + var answer = 0; + for(var i = 0; i < c; i++) { + answer += bytelog(zigzag_encode(input[i])); + } + return answer; +}; + +// Compress an array of integers, return a compressed buffer (as an ArrayBuffer). +// It is expected that the integers are non-negative: the caller is responsible +// for making this check. Floating-point numbers are not supported. FastIntegerCompression.compress = function(input) { var c = input.length; var buf = new ArrayBuffer(FastIntegerCompression.computeCompressedSizeInBytes(input)); @@ -89,6 +115,8 @@ FastIntegerCompression.computeHowManyIntegers = function(input) { return c - count; } // uncompress an array of integer from an ArrayBuffer, return the array +// it is assumed that they were compressed using the compress function, the caller +// is responsible for ensuring that it is the case. FastIntegerCompression.uncompress = function(input) { var array = [] var inbyte = new Int8Array(input); @@ -127,6 +155,80 @@ FastIntegerCompression.uncompress = function(input) { }; +// Compress an array of integers, return a compressed buffer (as an ArrayBuffer). +// The integers can be signed (negative), but floating-point values are not supported. +FastIntegerCompression.compressSigned = function(input) { + var c = input.length; + var buf = new ArrayBuffer(FastIntegerCompression.computeCompressedSizeInBytesSigned(input)); + var view = new Int8Array(buf); + var pos = 0; + for(var i = 0; i < c; i++) { + var val = zigzag_encode(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; +}; + +// uncompress an array of integer from an ArrayBuffer, return the array +// it is assumed that they were compressed using the compressSigned function, the caller +// is responsible for ensuring that it is the case. +FastIntegerCompression.uncompressSigned = function(input) { + var array = [] + var inbyte = new Int8Array(input); + var end = inbyte.length; + var pos = 0; + while (end > pos) { + var c = inbyte[pos++]; + var v = c & 0x7F; + if (c >= 0) { + array.push(zigzag_decode(v)) + continue; + } + c = inbyte[pos++]; + v |= (c & 0x7F) << 7; + if (c >= 0) { + array.push(zigzag_decode(v)) + continue; + } + c = inbyte[pos++]; + v |= (c & 0x7F) << 14; + if (c >= 0) { + array.push(zigzag_decode(v)) + continue; + } + c = inbyte[pos++]; + v |= (c & 0x7F) << 21; + if (c >= 0) { + array.push(zigzag_decode(v)) + continue; + } + c = inbyte[pos++]; + v |= c << 28; + array.push(zigzag_decode(v)) + } + return array; +}; + /////////////// module.exports = FastIntegerCompression; diff --git a/README.md b/README.md index 085012a..7280ec9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![codebeat badge](https://codebeat.co/badges/fbff9479-9394-40c6-b12d-8c6b666c115e)](https://codebeat.co/projects/github-com-lemire-fastintegercompression-js) This is an integer compression library in JavaScript, useful for work on indexes. -Given an array of small non-negative integers, it produces an ArrayBuffer that uses far fewer bytes +Given an array of small integers, it produces an ArrayBuffer that uses far fewer bytes than the original (using VByte compression). It assumes a modern JavaScript engine with typed arrays. @@ -18,6 +18,17 @@ From the compressed data, you can later recover the original array quickly var back = FastIntegerCompression.uncompress(buf); // gets back [10,100000,65999,10,10,0,1,1,2000] ``` +By default, non-negative integers are expected. If you have signed (negative and positive) integers, then you must use distinct functions since we need to code the sign bit: + + +```javascript + // var FastIntegerCompression = require("fastintcompression");// if you use node + var array = [10,100000,65999,10,10,0,-1,-1,-2000]; + var buf = FastIntegerCompression.compressSigned(array); + var back = FastIntegerCompression.uncompressSigned(buf); // gets back [10,100000,65999,10,10,0,-1,-1,-2000] +``` + + You can install the library under node with the command line ```bash npm install fastintcompression diff --git a/package.json b/package.json index 1e8d0a1..6f93838 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "homepage": "https://github.com/lemire/FastIntegerCompression.js#readme", "devDependencies": { "benchmark": "~1.0.0", - "mocha": "^2.3.4" + "mocha": "^2.5.3" }, "author": "Daniel Lemire (http://lemire.me/en/)" } diff --git a/unit/basictests.js b/unit/basictests.js index ef724ce..f449351 100644 --- a/unit/basictests.js +++ b/unit/basictests.js @@ -24,4 +24,13 @@ describe('FastIntegerCompression', function() { }); + + it('Testing simple compression (signed)', function() { + var array = [10,100000,65999,10,10,0,-1,-1,-2000]; + var buf = FastIntegerCompression.compressSigned(array); + if(! FastIntegerCompression.computeHowManyIntegers(buf) == array.length) throw "bad count"; + var back = FastIntegerCompression.uncompressSigned(buf); + if(!arraysEquals(array,back)) throw "bad"; + + }); }); From 7816ebf5800085f8e4b37fb4c0194ff900d47105 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 16 Sep 2019 12:10:15 -0400 Subject: [PATCH 04/10] 0.0.3 --- package-lock.json | 160 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f578883 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,160 @@ +{ + "name": "fastintcompression", + "version": "0.0.3", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "benchmark": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", + "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", + "dev": true + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2.0.4", + "minimatch": "0.3.0" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 6f93838..1bdf9d2 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "compression", "performance" ], - "version": "0.0.2", + "version": "0.0.3", "repository": { "type": "git", "url": "git+https://github.com/lemire/FastIntegerCompression.js.git" From 56ef0f0d6ad7d138682ddbb912df483c70b939eb Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 14 Jul 2020 12:51:07 -0400 Subject: [PATCH 05/10] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 7280ec9..93e721c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # FastIntegerCompression [![Build Status](https://travis-ci.org/lemire/FastIntegerCompression.js.png)](https://travis-ci.org/lemire/FastIntegerCompression.js) -[![codebeat badge](https://codebeat.co/badges/fbff9479-9394-40c6-b12d-8c6b666c115e)](https://codebeat.co/projects/github-com-lemire-fastintegercompression-js) This is an integer compression library in JavaScript, useful for work on indexes. Given an array of small integers, it produces an ArrayBuffer that uses far fewer bytes From 1e9a2f164a247e78cf01a1f18b4b696fc3b45c50 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 4 Sep 2020 10:14:16 -0400 Subject: [PATCH 06/10] Fixing issue 4 --- FastIntegerCompression.js | 1 + README.md | 4 ++-- unit/basictests.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/FastIntegerCompression.js b/FastIntegerCompression.js index 37d8627..b146400 100644 --- a/FastIntegerCompression.js +++ b/FastIntegerCompression.js @@ -149,6 +149,7 @@ FastIntegerCompression.uncompress = function(input) { } c = inbyte[pos++]; v |= c << 28; + v >>>= 0; // make positive array.push(v) } return array; diff --git a/README.md b/README.md index 93e721c..8d507a4 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,12 @@ From the compressed data, you can later recover the original array quickly ```javascript // var FastIntegerCompression = require("fastintcompression");// if you use node - var array = [10,100000,65999,10,10,0,1,1,2000]; + var array = [10,100000,65999,10,10,0,1,1,2000,0xFFFFFFFF]; var buf = FastIntegerCompression.compress(array); var back = FastIntegerCompression.uncompress(buf); // gets back [10,100000,65999,10,10,0,1,1,2000] ``` -By default, non-negative integers are expected. If you have signed (negative and positive) integers, then you must use distinct functions since we need to code the sign bit: +By default, non-negative 32-bit integers are expected. If you have signed (negative and positive) 32-bit integers, then you must use distinct functions since we need to code the sign bit: ```javascript diff --git a/unit/basictests.js b/unit/basictests.js index f449351..65b0340 100644 --- a/unit/basictests.js +++ b/unit/basictests.js @@ -15,7 +15,7 @@ describe('FastIntegerCompression', function() { }; it('Testing simple compression', function() { - var array = [10,100000,65999,10,10,0,1,1,2000]; + var array = [10,100000,65999,10,10,0,1,1,2000,0xFFFFFFFF]; var buf = FastIntegerCompression.compress(array); if(! FastIntegerCompression.computeHowManyIntegers(buf) == array.length) throw "bad count"; var back = FastIntegerCompression.uncompress(buf); From c712d37987959c4154d5ea4a0ca2a7f10c1a094b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 4 Sep 2020 17:05:52 -0400 Subject: [PATCH 07/10] 0.0.4 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f578883..660d6f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "fastintcompression", - "version": "0.0.3", + "version": "0.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1bdf9d2..c7a1500 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "compression", "performance" ], - "version": "0.0.3", + "version": "0.0.4", "repository": { "type": "git", "url": "git+https://github.com/lemire/FastIntegerCompression.js.git" From 033768f72e69ea4e33f8d29fca7cf516e0c5356b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 14 Sep 2020 14:19:36 -0400 Subject: [PATCH 08/10] Improved wording. --- FastIntegerCompression.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/FastIntegerCompression.js b/FastIntegerCompression.js index b146400..d05db84 100644 --- a/FastIntegerCompression.js +++ b/FastIntegerCompression.js @@ -17,7 +17,7 @@ 'use strict'; -// you can provide an iterable +// You can provide an iterable. function FastIntegerCompression() { } @@ -46,8 +46,8 @@ function zigzag_decode(val) { } -// compute how many bytes an array of integers would use once compressed -// input is expected to be an array of non-negative integers +// Compute how many bytes an array of integers would use once compressed. +// The input is expected to be an array of non-negative integers. FastIntegerCompression.computeCompressedSizeInBytes = function(input) { var c = input.length; var answer = 0; @@ -58,8 +58,8 @@ FastIntegerCompression.computeCompressedSizeInBytes = function(input) { }; -// compute how many bytes an array of integers would use once compressed -// input is expected to be an array of integers, some of them can be negative +// Compute how many bytes an array of integers would use once compressed. +// The input is expected to be an array of integers, some of them can be negative. FastIntegerCompression.computeCompressedSizeInBytesSigned = function(input) { var c = input.length; var answer = 0; @@ -104,7 +104,8 @@ FastIntegerCompression.compress = function(input) { return buf; }; -// from a compressed array of integers stored ArrayBuffer, compute the number of compressed integers by scanning the input +// 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; @@ -114,11 +115,11 @@ FastIntegerCompression.computeHowManyIntegers = function(input) { } return c - count; } -// uncompress an array of integer from an ArrayBuffer, return the array -// it is assumed that they were compressed using the compress function, the caller +// Uncompress an array of integer from an ArrayBuffer, return the array. +// It is assumed that they were compressed using the compress function, the caller // is responsible for ensuring that it is the case. FastIntegerCompression.uncompress = function(input) { - var array = [] + var array = [] // The size of the output is not yet known. var inbyte = new Int8Array(input); var end = inbyte.length; var pos = 0; @@ -190,11 +191,11 @@ FastIntegerCompression.compressSigned = function(input) { return buf; }; -// uncompress an array of integer from an ArrayBuffer, return the array -// it is assumed that they were compressed using the compressSigned function, the caller +// Uncompress an array of integer from an ArrayBuffer, return the array. +// It is assumed that they were compressed using the compressSigned function, the caller // is responsible for ensuring that it is the case. FastIntegerCompression.uncompressSigned = function(input) { - var array = [] + var array = [] // The size of the output is not yet known. var inbyte = new Int8Array(input); var end = inbyte.length; var pos = 0; From 525756a50fbce11f4262e6e457dcdf5cd04ad8ae Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 2 Apr 2023 18:03:18 -0400 Subject: [PATCH 09/10] Fixing issue 11 --- FastIntegerCompression.js | 4 +- package-lock.json | 152 ++++++++++++++++++++++++++------------ unit/basictests.js | 4 +- 3 files changed, 108 insertions(+), 52 deletions(-) diff --git a/FastIntegerCompression.js b/FastIntegerCompression.js index d05db84..640978b 100644 --- a/FastIntegerCompression.js +++ b/FastIntegerCompression.js @@ -107,11 +107,11 @@ FastIntegerCompression.compress = function(input) { // 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 view = new Uint8Array(input); var c = view.length; var count = 0; for(var i = 0; i < c; i++) { - count += (input[i]>>>7); + count += (view[i]>>>7); } return c - count; } diff --git a/package-lock.json b/package-lock.json index 660d6f9..de40278 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,125 +1,167 @@ { "name": "fastintcompression", "version": "0.0.4", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "benchmark": { + "packages": { + "": { + "name": "fastintcompression", + "version": "0.0.4", + "license": "Apache-2.0", + "devDependencies": { + "benchmark": "~1.0.0", + "mocha": "^2.5.3" + } + }, + "node_modules/benchmark": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", - "dev": true + "dev": true, + "engines": [ + "node", + "rhino" + ] }, - "commander": { + "node_modules/commander": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6.x" + } }, - "debug": { + "node_modules/debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, - "requires": { + "dependencies": { "ms": "0.7.1" } }, - "diff": { + "node_modules/diff": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.3.1" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "glob": { + "node_modules/glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", "dev": true, - "requires": { - "inherits": "2.0.4", - "minimatch": "0.3.0" + "dependencies": { + "inherits": "2", + "minimatch": "0.3" + }, + "engines": { + "node": "*" } }, - "growl": { + "node_modules/growl": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "jade": { + "node_modules/jade": { "version": "0.26.3", "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", "dev": true, - "requires": { + "dependencies": { "commander": "0.6.1", "mkdirp": "0.3.0" }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "dev": true - } + "bin": { + "jade": "bin/jade" } }, - "lru-cache": { + "node_modules/jade/node_modules/commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true, + "engines": { + "node": ">= 0.4.x" + } + }, + "node_modules/jade/node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/lru-cache": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", "dev": true }, - "minimatch": { + "node_modules/minimatch": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, - "mkdirp": { + "node_modules/mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", "dev": true, - "requires": { + "dependencies": { "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "mocha": { + "node_modules/mocha": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", "dev": true, - "requires": { + "dependencies": { "commander": "2.3.0", "debug": "2.2.0", "diff": "1.4.0", @@ -130,30 +172,44 @@ "mkdirp": "0.5.1", "supports-color": "1.2.0", "to-iso-string": "0.0.2" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 0.8.x" } }, - "ms": { + "node_modules/ms": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true }, - "sigmund": { + "node_modules/sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", "dev": true }, - "supports-color": { + "node_modules/supports-color": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } }, - "to-iso-string": { + "node_modules/to-iso-string": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "deprecated": "to-iso-string has been deprecated, use @segment/to-iso-string instead.", "dev": true } } diff --git a/unit/basictests.js b/unit/basictests.js index 65b0340..34b1e05 100644 --- a/unit/basictests.js +++ b/unit/basictests.js @@ -17,7 +17,7 @@ describe('FastIntegerCompression', function() { it('Testing simple compression', function() { var array = [10,100000,65999,10,10,0,1,1,2000,0xFFFFFFFF]; var buf = FastIntegerCompression.compress(array); - if(! FastIntegerCompression.computeHowManyIntegers(buf) == array.length) throw "bad count"; + if(FastIntegerCompression.computeHowManyIntegers(buf) !== array.length) throw "bad count"; var back = FastIntegerCompression.uncompress(buf); if(!arraysEquals(array,back)) throw "bad"; @@ -28,7 +28,7 @@ describe('FastIntegerCompression', function() { it('Testing simple compression (signed)', function() { var array = [10,100000,65999,10,10,0,-1,-1,-2000]; var buf = FastIntegerCompression.compressSigned(array); - if(! FastIntegerCompression.computeHowManyIntegers(buf) == array.length) throw "bad count"; + if(FastIntegerCompression.computeHowManyIntegers(buf) !== array.length) throw "bad count"; var back = FastIntegerCompression.uncompressSigned(buf); if(!arraysEquals(array,back)) throw "bad"; From 6eab6891f419c9568617e3928ad1221dd1c6211d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 2 Apr 2023 18:03:37 -0400 Subject: [PATCH 10/10] 0.1.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index de40278..8af750f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "fastintcompression", - "version": "0.0.4", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "fastintcompression", - "version": "0.0.4", + "version": "0.1.0", "license": "Apache-2.0", "devDependencies": { "benchmark": "~1.0.0", diff --git a/package.json b/package.json index c7a1500..acbd35a 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "compression", "performance" ], - "version": "0.0.4", + "version": "0.1.0", "repository": { "type": "git", "url": "git+https://github.com/lemire/FastIntegerCompression.js.git"