Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 4dfd75e8 authored by Simon Chan's avatar Simon Chan
Browse files

feat(no-data-view): add all remaining functions

parent befcc1ff
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -19,3 +19,17 @@ Because they are very basic number operations, the performance between a JavaScr
(Except for `getBigUint64` and `setBigUint64`, Chrome uses an inefficient implementation, so this JavaScript implementation is even faster than the native one).

Check the [benchmark](./benchmark.md) for more details.

## Why there is no `setInt8`?

Assign a negative number to a `Uint8Array` will treat it as an unsigned number, so there is no need to provide a `setInt8` method.

```ts
import { getInt8 } from '@yume-chan/no-data-view';

const array = new Uint8Array(1);
array[0] = -1;
console.log(array[0]); // 255
console.log(new Int8Array(array.buffer)[0]); // -1
console.log(getInt8(array, 0)); // -1
```
+8 −8
Original line number Diff line number Diff line
@@ -24,8 +24,8 @@ export function setInt16LittleEndian(
    offset: number,
    value: number,
): void {
    buffer[offset] = value & 0xff;
    buffer[offset + 1] = (value >> 8) & 0xff;
    buffer[offset] = value;
    buffer[offset + 1] = value >> 8;
}

export function setInt16BigEndian(
@@ -33,8 +33,8 @@ export function setInt16BigEndian(
    offset: number,
    value: number,
): void {
    buffer[offset] = (value >> 8) & 0xff;
    buffer[offset + 1] = value & 0xff;
    buffer[offset] = value >> 8;
    buffer[offset + 1] = value;
}

export function setInt16(
@@ -44,10 +44,10 @@ export function setInt16(
    littleEndian: boolean,
): void {
    if (littleEndian) {
        buffer[offset] = value & 0xff;
        buffer[offset + 1] = (value >> 8) & 0xff;
        buffer[offset] = value;
        buffer[offset + 1] = value >> 8;
    } else {
        buffer[offset] = (value >> 8) & 0xff;
        buffer[offset + 1] = value & 0xff;
        buffer[offset] = value >> 8;
        buffer[offset + 1] = value;
    }
}
+75 −1
Original line number Diff line number Diff line
import { describe, expect, it } from "@jest/globals";

import { getInt32, getInt32BigEndian, getInt32LittleEndian } from "./int32.js";
import {
    getInt32,
    getInt32BigEndian,
    getInt32LittleEndian,
    setInt32,
    setInt32BigEndian,
    setInt32LittleEndian,
} from "./int32.js";

describe("getInt32", () => {
    describe("little endian", () => {
@@ -73,3 +80,70 @@ describe("getInt32", () => {
        );
    });
});

describe("setInt32", () => {
    describe("little endian", () => {
        it("should work for minimal value", () => {
            const expected = new Uint8Array(4);
            new DataView(expected.buffer).setInt32(0, -0x80000000, true);
            const actual = new Uint8Array(4);
            setInt32LittleEndian(actual, 0, -0x80000000);
            expect(actual).toEqual(expected);
        });

        it("should work for maximal value", () => {
            const expected = new Uint8Array(4);
            new DataView(expected.buffer).setInt32(0, 0x7fffffff, true);
            const actual = new Uint8Array(4);
            setInt32LittleEndian(actual, 0, 0x7fffffff);
            expect(actual).toEqual(expected);
        });

        it("should work for middle value", () => {
            const expected = new Uint8Array(4);
            new DataView(expected.buffer).setInt32(0, 0, true);
            const actual = new Uint8Array(4);
            setInt32LittleEndian(actual, 0, 0);
            expect(actual).toEqual(expected);
        });
    });

    describe("little endian", () => {
        it("should work for minimal value", () => {
            const expected = new Uint8Array(4);
            new DataView(expected.buffer).setInt32(0, -0x80000000, false);
            const actual = new Uint8Array(4);
            setInt32BigEndian(actual, 0, -0x80000000);
            expect(actual).toEqual(expected);
        });

        it("should work for maximal value", () => {
            const expected = new Uint8Array(4);
            new DataView(expected.buffer).setInt32(0, 0x7fffffff, false);
            const actual = new Uint8Array(4);
            setInt32BigEndian(actual, 0, 0x7fffffff);
            expect(actual).toEqual(expected);
        });

        it("should work for middle value", () => {
            const expected = new Uint8Array(4);
            new DataView(expected.buffer).setInt32(0, 0, false);
            const actual = new Uint8Array(4);
            setInt32BigEndian(actual, 0, 0);
            expect(actual).toEqual(expected);
        });
    });

    it("should work for selected endianness", () => {
        const expected = new Uint8Array(4);
        const actual = new Uint8Array(4);

        new DataView(expected.buffer).setInt32(0, 0x7fffffff, false);
        setInt32(actual, 0, 0x7fffffff, false);
        expect(actual).toEqual(expected);

        new DataView(expected.buffer).setInt32(0, 0x7fffffff, true);
        setInt32(actual, 0, 0x7fffffff, true);
        expect(actual).toEqual(expected);
    });
});
+41 −0
Original line number Diff line number Diff line
@@ -34,3 +34,44 @@ export function getInt32(
              (buffer[offset + 2]! << 8) |
              buffer[offset + 3]!;
}

export function setInt32LittleEndian(
    buffer: Uint8Array,
    offset: number,
    value: number,
) {
    buffer[offset] = value;
    buffer[offset + 1] = value >> 8;
    buffer[offset + 2] = value >> 16;
    buffer[offset + 3] = value >> 24;
}

export function setInt32BigEndian(
    buffer: Uint8Array,
    offset: number,
    value: number,
) {
    buffer[offset] = value >> 24;
    buffer[offset + 1] = value >> 16;
    buffer[offset + 2] = value >> 8;
    buffer[offset + 3] = value;
}

export function setInt32(
    buffer: Uint8Array,
    offset: number,
    value: number,
    littleEndian: boolean,
) {
    if (littleEndian) {
        buffer[offset] = value;
        buffer[offset + 1] = value >> 8;
        buffer[offset + 2] = value >> 16;
        buffer[offset + 3] = value >> 24;
    } else {
        buffer[offset] = value >> 24;
        buffer[offset + 1] = value >> 16;
        buffer[offset + 2] = value >> 8;
        buffer[offset + 3] = value;
    }
}
+24 −24
Original line number Diff line number Diff line
@@ -58,12 +58,12 @@ export function setInt64LittleEndian(
): void {
    buffer[offset] = Number(value & 0xffn);
    buffer[offset + 1] = Number((value >> 8n) & 0xffn);
    buffer[offset + 2] = Number((value >> 16n) & 0xffn);
    buffer[offset + 3] = Number((value >> 24n) & 0xffn);
    buffer[offset + 4] = Number((value >> 32n) & 0xffn);
    buffer[offset + 5] = Number((value >> 40n) & 0xffn);
    buffer[offset + 6] = Number((value >> 48n) & 0xffn);
    buffer[offset + 7] = Number((value >> 56n) & 0xffn);
    buffer[offset + 2] = Number(value >> 16n);
    buffer[offset + 3] = Number(value >> 24n);
    buffer[offset + 4] = Number(value >> 32n);
    buffer[offset + 5] = Number(value >> 40n);
    buffer[offset + 6] = Number(value >> 48n);
    buffer[offset + 7] = Number(value >> 56n);
}

export function setInt64BigEndian(
@@ -71,12 +71,12 @@ export function setInt64BigEndian(
    offset: number,
    value: bigint,
): void {
    buffer[offset] = Number((value >> 56n) & 0xffn);
    buffer[offset + 1] = Number((value >> 48n) & 0xffn);
    buffer[offset + 2] = Number((value >> 40n) & 0xffn);
    buffer[offset + 3] = Number((value >> 32n) & 0xffn);
    buffer[offset + 4] = Number((value >> 24n) & 0xffn);
    buffer[offset + 5] = Number((value >> 16n) & 0xffn);
    buffer[offset] = Number(value >> 56n);
    buffer[offset + 1] = Number(value >> 48n);
    buffer[offset + 2] = Number(value >> 40n);
    buffer[offset + 3] = Number(value >> 32n);
    buffer[offset + 4] = Number(value >> 24n);
    buffer[offset + 5] = Number(value >> 16n);
    buffer[offset + 6] = Number((value >> 8n) & 0xffn);
    buffer[offset + 7] = Number(value & 0xffn);
}
@@ -90,19 +90,19 @@ export function setInt64(
    if (littleEndian) {
        buffer[offset] = Number(value & 0xffn);
        buffer[offset + 1] = Number((value >> 8n) & 0xffn);
        buffer[offset + 2] = Number((value >> 16n) & 0xffn);
        buffer[offset + 3] = Number((value >> 24n) & 0xffn);
        buffer[offset + 4] = Number((value >> 32n) & 0xffn);
        buffer[offset + 5] = Number((value >> 40n) & 0xffn);
        buffer[offset + 6] = Number((value >> 48n) & 0xffn);
        buffer[offset + 7] = Number((value >> 56n) & 0xffn);
        buffer[offset + 2] = Number(value >> 16n);
        buffer[offset + 3] = Number(value >> 24n);
        buffer[offset + 4] = Number(value >> 32n);
        buffer[offset + 5] = Number(value >> 40n);
        buffer[offset + 6] = Number(value >> 48n);
        buffer[offset + 7] = Number(value >> 56n);
    } else {
        buffer[offset] = Number((value >> 56n) & 0xffn);
        buffer[offset + 1] = Number((value >> 48n) & 0xffn);
        buffer[offset + 2] = Number((value >> 40n) & 0xffn);
        buffer[offset + 3] = Number((value >> 32n) & 0xffn);
        buffer[offset + 4] = Number((value >> 24n) & 0xffn);
        buffer[offset + 5] = Number((value >> 16n) & 0xffn);
        buffer[offset] = Number(value >> 56n);
        buffer[offset + 1] = Number(value >> 48n);
        buffer[offset + 2] = Number(value >> 40n);
        buffer[offset + 3] = Number(value >> 32n);
        buffer[offset + 4] = Number(value >> 24n);
        buffer[offset + 5] = Number(value >> 16n);
        buffer[offset + 6] = Number((value >> 8n) & 0xffn);
        buffer[offset + 7] = Number(value & 0xffn);
    }
Loading