diff --git a/assembly/buffer/index.ts b/assembly/buffer/index.ts index 87cf104..7a76822 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 5e15eaa..8193282 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]); @@ -214,6 +214,36 @@ describe("buffer", () => { // }).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); + }); + test("#Hex.encode", () => { let actual = "000102030405060708090a0b0c0d0e0f102030405060708090a0b0c0d0e0f0"; let exampleBuffer = create([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0]);