From 3902ba61049c491f4683ec95e1effeaeec5a1bba Mon Sep 17 00:00:00 2001 From: Joshua Tenner Date: Mon, 29 Jul 2019 13:02:54 -0400 Subject: [PATCH] [Implement] subarray --- assembly/buffer/index.ts | 13 +++++++++++++ package-lock.json | 2 +- tests/buffer.spec.ts | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/assembly/buffer/index.ts b/assembly/buffer/index.ts index fb5d4ca..caff5ac 100644 --- a/assembly/buffer/index.ts +++ b/assembly/buffer/index.ts @@ -27,6 +27,19 @@ export class Buffer extends Uint8Array { return value instanceof Buffer; } + // Adapted from https://github.com/AssemblyScript/assemblyscript/blob/master/std/assembly/typedarray.ts + public subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Buffer { + var len = this.dataLength; + begin = begin < 0 ? max(len + begin, 0) : min(begin, len); + end = end < 0 ? max(len + end, 0) : min(end, len); + end = max(end, begin); + var out = changetype(__alloc(offsetof(), idof())); // retains + out.data = this.data; // retains + out.dataStart = this.dataStart + begin; + out.dataLength = end - begin; + return out; + } + readInt8(offset: i32 = 0): i8 { if(i32(offset < 0) | i32(offset >= this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE); return load(this.dataStart + offset); diff --git a/package-lock.json b/package-lock.json index 1d4efe9..05a35d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ } }, "assemblyscript": { - "version": "github:assemblyscript/assemblyscript#4c938f7689c39e3a1ad813356781e2689fd4ec70", + "version": "github:assemblyscript/assemblyscript#227c626921175ab19701752397fa513171750d38", "from": "github:assemblyscript/assemblyscript", "dev": true, "requires": { diff --git a/tests/buffer.spec.ts b/tests/buffer.spec.ts index ba4ff36..5fc3ac2 100644 --- a/tests/buffer.spec.ts +++ b/tests/buffer.spec.ts @@ -102,7 +102,7 @@ describe("buffer", () => { // expectFn(() => { // let newBuff = new Buffer(1); // newBuff.writeInt8(5,10); - // }).toThrow(); + // }).toThrow(); }); test("#writeUInt8", () => { @@ -115,8 +115,8 @@ describe("buffer", () => { // expectFn(() => { // let newBuff = new Buffer(1); // newBuff.writeUInt8(5,10); - // }).toThrow(); - }); + // }).toThrow(); + }); test("#readInt16LE", () => { let buff = create([0x0,0x05,0x0]); @@ -213,4 +213,34 @@ describe("buffer", () => { // newBuff.writeUInt16BE(0); // }).toThrow(); }); + + test("#subarray", () => { + let example = create([1, 2, 3, 4, 5, 6, 7, 8]); + + // no parameters means copy the Buffer + let actual = example.subarray(); + expect(actual).toStrictEqual(example); + expect(actual.buffer).toBe(example.buffer); // should use the same buffer + + // start at offset 5 + actual = example.subarray(5); + let expected = create([6, 7, 8]); + // trace("length", 1, expected.length); + expect(actual).toStrictEqual(expected); + + // negative start indicies, start at (8 - 5) + actual = example.subarray(-5); + expected = create([4, 5, 6, 7, 8]); + expect(actual).toStrictEqual(expected); + + // two parameters + actual = example.subarray(2, 6); + expected = create([3, 4, 5, 6]); + expect(actual).toStrictEqual(expected); + + // negative end index + actual = example.subarray(4, -1); + expected = create([5, 6, 7]); + expect(actual).toStrictEqual(expected); + }); });