Skip to content

Commit 40ea2c5

Browse files
committed
feat: (u)int64
1 parent c0c6ed2 commit 40ea2c5

File tree

8 files changed

+105
-21
lines changed

8 files changed

+105
-21
lines changed

.eslintrc.cjs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
/** @type {import('eslint').Linter.Config} */
22
module.exports = {
3+
globals: {
4+
BigInt: false,
5+
BigInt64Array: false,
6+
BigUint64Array: false,
7+
},
38
root: true,
49
parserOptions: {
510
ecmaVersion: 'latest',

README.md

Lines changed: 20 additions & 21 deletions
Large diffs are not rendered by default.

src/codecs/array.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export function typeToElementClass(type) {
1010
case 'uint32': return Uint32Array;
1111
case 'float32': return Float32Array;
1212
case 'float64': return Float64Array;
13+
case 'bigint64': return BigInt64Array;
14+
case 'biguint64': return BigUint64Array;
1315
}
1416
return undefined;
1517
}

src/codecs/array.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import Uint32Codec from './uint32.js';
1111
import Float32Codec from './float32.js';
1212
import Float64Codec from './float64.js';
1313
import StringCodec from './string.js';
14+
import Int64Codec from './int64.js';
15+
import Uint64Codec from './uint64.js';
1416

1517
Codecs.uint8 = Uint8Codec;
1618
Codecs.int8 = Int8Codec;
@@ -22,6 +24,8 @@ Codecs.uint32 = Uint32Codec;
2224
Codecs.float32 = Float32Codec;
2325
Codecs.float64 = Float64Codec;
2426
Codecs.string = StringCodec;
27+
Codecs.int64 = Int64Codec;
28+
Codecs.uint64 = Uint64Codec;
2529

2630
for (const numberType of [
2731
'int8',
@@ -47,6 +51,26 @@ for (const numberType of [
4751
});
4852
}
4953

54+
test('int64 array', async () => {
55+
const codec = new Codec({
56+
element: {type: 'int64'},
57+
});
58+
const value = [1n, -2n, 3n, -4n];
59+
const view = new DataView(new ArrayBuffer(codec.size(value)));
60+
expect(codec.encode(value, view, 0)).to.equal(36);
61+
expect(codec.decode(view, {byteOffset: 0})).to.deep.equal(value);
62+
});
63+
64+
test('uint64 array', async () => {
65+
const codec = new Codec({
66+
element: {type: 'uint64'},
67+
});
68+
const value = [1n, 2n, 3n, 4n];
69+
const view = new DataView(new ArrayBuffer(codec.size(value)));
70+
expect(codec.encode(value, view, 0)).to.equal(36);
71+
expect(codec.decode(view, {byteOffset: 0})).to.deep.equal(value);
72+
});
73+
5074
test('string array', async () => {
5175
const codec = new Codec({
5276
element: {type: 'string'},

src/codecs/int64.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Int64Codec {
2+
decode(view, target) {
3+
const value = view.getBigInt64(target.byteOffset);
4+
target.byteOffset += 8;
5+
return value;
6+
}
7+
encode(value, view, byteOffset) {
8+
view.setBigInt64(byteOffset, value);
9+
return 8;
10+
}
11+
size() {
12+
return 8;
13+
}
14+
}
15+
16+
export default Int64Codec;

src/codecs/int64.test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import {expect, test} from 'vitest';
2+
3+
import Codec from './int64.js';
4+
5+
test('int64', async () => {
6+
const codec = new Codec();
7+
const value = -32n;
8+
const view = new DataView(new ArrayBuffer(codec.size(value)));
9+
expect(codec.encode(value, view, 0)).to.equal(8);
10+
expect(codec.decode(view, {byteOffset: 0})).to.deep.equal(value);
11+
});

src/codecs/uint64.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Uint64Codec {
2+
decode(view, target) {
3+
const value = view.getBigUint64(target.byteOffset);
4+
target.byteOffset += 8;
5+
return value;
6+
}
7+
encode(value, view, byteOffset) {
8+
view.setBigUint64(byteOffset, value);
9+
return 8;
10+
}
11+
size() {
12+
return 8;
13+
}
14+
}
15+
16+
export default Uint64Codec;

src/codecs/uint64.test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import {expect, test} from 'vitest';
2+
3+
import Codec from './uint64.js';
4+
5+
test('uint64', async () => {
6+
const codec = new Codec();
7+
const value = 32n;
8+
const view = new DataView(new ArrayBuffer(codec.size(value)));
9+
expect(codec.encode(value, view, 0)).to.equal(8);
10+
expect(codec.decode(view, {byteOffset: 0})).to.deep.equal(value);
11+
});

0 commit comments

Comments
 (0)