Skip to content

Commit

Permalink
Merge pull request #12 from aegenet/feat-mw-write-some-bytes
Browse files Browse the repository at this point in the history
feat(memory-writer): writeSomeBytes
  • Loading branch information
aegenet committed Aug 12, 2023
2 parents efabddc + 5f81f9c commit 3b68543
Show file tree
Hide file tree
Showing 9 changed files with 57 additions and 2 deletions.
5 changes: 4 additions & 1 deletion packages/belt-memory-rw/src/browser/memory-creator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ describe('browser memory-creator', () => {
memCreator.writeByte(1);
memCreator.writeBytes([2, 3]);
memCreator.writeBytes(new Uint8Array([2, 3]));
memCreator.writeSomeBytes(1, [5, 3]);
memCreator.writeSomeBytes(1, new Uint8Array([9, 3]));
memCreator.writeCString16BE('456');
memCreator.writeCString16LE('789');
memCreator.writeCString32BE('01234');
Expand All @@ -32,7 +34,7 @@ describe('browser memory-creator', () => {
memCreator.writeUInt32LE(33333);
memCreator.writeUInt8(254);

assert.strictEqual(memCreator.length, 95);
assert.strictEqual(memCreator.length, 97);
assert.strictEqual(memCreator.length, memCreator.position);
assert.strictEqual(memCreator.remaining, 0);
try {
Expand All @@ -46,6 +48,7 @@ describe('browser memory-creator', () => {
assert.strictEqual(reader.readByte(), 1);
assert.deepStrictEqual(Array.from(new Uint8Array(reader.readBytes(2))), [2, 3]);
assert.deepStrictEqual(Array.from(new Uint8Array(reader.readBytes(2))), [2, 3]);
assert.deepStrictEqual(Array.from(new Uint8Array(reader.readBytes(2))), [5, 9]);
assert.strictEqual(reader.readCString16BE(), '456');
assert.strictEqual(reader.readCString16LE(), '789');
assert.strictEqual(reader.readCString32BE(), '01234');
Expand Down
5 changes: 5 additions & 0 deletions packages/belt-memory-rw/src/browser/memory-creator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ export class MemoryCreator implements IMemoryCreator<ArrayBuffer> {
this._encapsWithBuffer(writer => writer.writeBytes(values), Array.isArray(values) ? values.length : values.byteLength);
}

/** @inheritdoc */
public writeSomeBytes(size: number, values: number[] | ArrayBuffer): void {
this._encapsWithBuffer(writer => writer.writeSomeBytes(size, values), size);
}

/** @inheritdoc */
public writeString(value: string): void {
this._encapsWithBuffer(writer => writer.writeString(value), value.length);
Expand Down
9 changes: 9 additions & 0 deletions packages/belt-memory-rw/src/browser/memory-writer-le.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,15 @@ describe('browser memory-writer LE', () => {
const reader = new MemoryReader(buffer);
assert.deepStrictEqual(Array.from(new Uint8Array(reader.readBytes(5))), [8, 7, 6, 5, 4]);
});

it('writeSomeBytes', () => {
const buffer = new ArrayBuffer(32);
const writer = new MemoryWriter(buffer);
writer.writeSomeBytes(3, [8, 7, 6, 5, 4]);

const reader = new MemoryReader(buffer);
assert.deepStrictEqual(Array.from(new Uint8Array(reader.readBytes(5))), [8, 7, 6, 0, 0]);
});
});

describe('number', () => {
Expand Down
11 changes: 11 additions & 0 deletions packages/belt-memory-rw/src/browser/memory-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ export class MemoryWriter extends MemoryCommon implements IMemoryWriter<ArrayBuf
}
}

/** @inheritdoc */
public writeSomeBytes(size: number, values: number[] | ArrayBuffer) {
if (Array.isArray(values)) {
for (let i = 0; i < size; i++) {
this._dv.setUint8(this._offset++, values[i]);
}
} else {
new Uint8Array(this._buf).set(new Uint8Array(values.slice(0, size)), this._offset);
}
}

/** @inheritdoc */
public writeString(value: string) {
for (let i = 0; i < value.length; i++) {
Expand Down
3 changes: 3 additions & 0 deletions packages/belt-memory-rw/src/common/i-memory-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ export interface IMemoryWriter<InternalType = unknown> extends IMemoryCommon {
/** Write bytes */
writeBytes(values: number[] | InternalType): void;

/** Write some bytes */
writeSomeBytes(size: number, values: number[] | InternalType): void;

/** Write an ISO-8859-1 string [VARY STR] */
writeString(value: string): void;

Expand Down
5 changes: 4 additions & 1 deletion packages/belt-memory-rw/src/node/memory-creator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ describe('nodejs memory-creator', () => {
memCreator.writeByte(1);
memCreator.writeBytes([2, 3]);
memCreator.writeBytes(Buffer.from([2, 3]));
memCreator.writeSomeBytes(1, [5, 3]);
memCreator.writeSomeBytes(1, [9, 3]);
memCreator.writeCString16BE('456');
memCreator.writeCString16LE('789');
memCreator.writeCString32BE('01234');
Expand All @@ -32,7 +34,7 @@ describe('nodejs memory-creator', () => {
memCreator.writeUInt32LE(33333);
memCreator.writeUInt8(254);

assert.strictEqual(memCreator.length, 95);
assert.strictEqual(memCreator.length, 97);
assert.strictEqual(memCreator.length, memCreator.position);
assert.strictEqual(memCreator.remaining, 0);

Expand All @@ -46,6 +48,7 @@ describe('nodejs memory-creator', () => {
assert.strictEqual(reader.readByte(), 1);
assert.deepStrictEqual(Array.from(reader.readBytes(2)), [2, 3]);
assert.deepStrictEqual(Array.from(reader.readBytes(2)), [2, 3]);
assert.deepStrictEqual(Array.from(new Uint8Array(reader.readBytes(2))), [5, 9]);
assert.strictEqual(reader.readCString16BE(), '456');
assert.strictEqual(reader.readCString16LE(), '789');
assert.strictEqual(reader.readCString32BE(), '01234');
Expand Down
5 changes: 5 additions & 0 deletions packages/belt-memory-rw/src/node/memory-creator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ export class MemoryCreator implements IMemoryCreator<Buffer> {
this._encapsWithBuffer(writer => writer.writeBytes(values), values.length);
}

/** @inheritdoc */
public writeSomeBytes(size: number, values: Buffer): void {
this._encapsWithBuffer(writer => writer.writeSomeBytes(size, values), size);
}

/** @inheritdoc */
public writeString(value: string): void {
this._encapsWithBuffer(writer => writer.writeString(value), value.length);
Expand Down
9 changes: 9 additions & 0 deletions packages/belt-memory-rw/src/node/memory-writer-le.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,15 @@ describe('nodejs memory-writer LE', () => {
const reader = new MemoryReader(buffer);
assert.deepStrictEqual(Array.from(reader.readBytes(5)), [8, 7, 6, 5, 4]);
});

it('writeSomeBytes', () => {
const buffer = Buffer.alloc(32);
const writer = new MemoryWriter(buffer);
writer.writeSomeBytes(3, [8, 7, 6, 5, 4]);

const reader = new MemoryReader(buffer);
assert.deepStrictEqual(Array.from(reader.readBytes(5)), [8, 7, 6, 0, 0]);
});
});

describe('number', () => {
Expand Down
7 changes: 7 additions & 0 deletions packages/belt-memory-rw/src/node/memory-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ export class MemoryWriter extends MemoryCommon implements IMemoryWriter<Buffer>,
});
}

/** @inheritdoc */
public writeSomeBytes(size: number, values: number[] | Buffer) {
for (let i = 0; i < size; i++) {
this._buf.writeUInt8(values[i], this._offset++);
}
}

/** @inheritdoc */
public writeString(value: string) {
this._buf.write(value, this._offset, value.length, 'latin1');
Expand Down

0 comments on commit 3b68543

Please sign in to comment.