close
Skip to content

Commit 5ced001

Browse files
RedDwarfianjtenner
authored andcommitted
[Implement] Read/Write Int16/UInt16, LE and BE (#16)
* [Implement] ReadInt16BE and ReadInt16LE * [Cleanup] Consistent with std lib, Missing TODOs * [Implement] ReadUInt16BE and ReadUInt16LE * [Implement] write(U)Int(L/B)E * [Cleanup] [Optimize] Using recommended changes * [Cleanup] Directly comparing written buffers * [Cleanup] Increases tests readability and malleability * [Cleanup] Formatting * [Cleanup] commented toThrow() function formatting
1 parent 22e7456 commit 5ced001

3 files changed

Lines changed: 205 additions & 36 deletions

File tree

‎assembly/buffer/index.ts‎

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,69 @@ export class Buffer extends Uint8Array {
2727
return value instanceof Buffer;
2828
}
2929

30+
readInt8(offset: i32 = 0): i8 {
31+
if(i32(offset < 0) | i32(<u32>offset >= this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
32+
return load<i8>(this.dataStart + <usize>offset);
33+
}
34+
3035
readUInt8(offset: i32 = 0): u8 {
31-
if(<u32>offset >= this.dataLength) throw new RangeError(E_INDEXOUTOFRANGE);
32-
return load<u8>(this.dataStart + usize(offset));
36+
if(i32(offset < 0) | i32(<u32>offset >= this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
37+
return load<u8>(this.dataStart + <usize>offset);
38+
}
39+
40+
writeInt8(value: i8, offset: i32 = 0): i32 {
41+
if(i32(offset < 0) | i32(<u32>offset >= this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
42+
store<i8>(this.dataStart + offset, value);
43+
return offset + 1;
3344
}
3445

3546
writeUInt8(value: u8, offset: i32 = 0): i32 {
36-
if(<u32>offset >= this.dataLength) throw new RangeError(E_INDEXOUTOFRANGE);
47+
if(i32(offset < 0) | i32(<u32>offset >= this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
3748
store<u8>(this.dataStart + offset, value);
3849
return offset + 1;
3950
}
4051

41-
writeInt8(value: i8, offset: i32 = 0): i32 {
42-
if(<u32>offset >= this.dataLength) throw new RangeError(E_INDEXOUTOFRANGE);
43-
store<i8>(this.dataStart + offset, value);
44-
return offset + 1;
52+
readInt16LE(offset: i32 = 0): i16 {
53+
if(i32(offset < 0) | i32(<u32>offset + 2 > this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
54+
return load<i16>(this.dataStart + <usize>offset);
4555
}
4656

47-
readInt8(offset: i32 = 0): i8 {
48-
if(<u32>offset >= this.dataLength) throw new RangeError(E_INDEXOUTOFRANGE);
49-
return load<i8>(this.dataStart + usize(offset));
57+
readInt16BE(offset: i32 = 0): i16 {
58+
if(i32(offset < 0) | i32(<u32>offset + 2 > this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
59+
return bswap<i16>(load<i16>(this.dataStart + <usize>offset));
60+
}
61+
62+
readUInt16LE(offset: i32 = 0): u16 {
63+
if(i32(offset < 0) | i32(<u32>offset + 2 > this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
64+
return load<u16>(this.dataStart + <usize>offset);
65+
}
66+
67+
readUInt16BE(offset: i32 = 0): u16 {
68+
if(i32(offset < 0) | i32(<u32>offset + 2 > this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
69+
return bswap<u16>(load<u16>(this.dataStart + <usize>offset));
70+
}
71+
72+
writeInt16LE(value: i16, offset: i32 = 0): i32 {
73+
if(i32(offset < 0) | i32(<u32>offset + 2 > this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
74+
store<i16>(this.dataStart + offset, value);
75+
return offset + 2;
76+
}
77+
78+
writeInt16BE(value: i16, offset: i32 = 0): i32 {
79+
if(i32(offset < 0) | i32(<u32>offset + 2 > this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
80+
store<i16>(this.dataStart + offset, bswap<i16>(value));
81+
return offset + 2;
82+
}
83+
84+
writeUInt16LE(value: u16, offset: i32 = 0): i32 {
85+
if(i32(offset < 0) | i32(<u32>offset + 2 > this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
86+
store<u16>(this.dataStart + offset, value);
87+
return offset + 2;
88+
}
89+
90+
writeUInt16BE(value: u16, offset: i32 = 0): i32 {
91+
if(i32(offset < 0) | i32(<u32>offset + 2 > this.dataLength)) throw new RangeError(E_INDEXOUTOFRANGE);
92+
store<u16>(this.dataStart + offset, bswap<u16>(value));
93+
return offset + 2;
5094
}
5195
}

‎assembly/node.d.ts‎

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,28 @@ declare class Buffer extends Uint8Array {
55
static allocUnsafe(size: i32): Buffer;
66
/** This method asserts a value is a Buffer object via `value instanceof Buffer`. */
77
static isBuffer<T>(value: T): bool;
8+
/** Reads a signed integer at the designated offset. */
9+
readInt8(offset?: i32): i8;
810
/** Reads an unsigned integer at the designated offset. */
911
readUInt8(offset?: i32): u8;
10-
/** Writes an inputted u8 value to the buffer, at the desired offset. */
11-
writeUInt8(value:u8, offset?:i32): i32;
1212
/** Writes an inputted value to the buffer, at the desired offset. */
1313
writeInt8(value:i8, offset?:i32): i32;
14-
/** Reads a signed integer at the designated offset. */
15-
readInt8(offset?: i32): i8;
14+
/** Writes an inputted u8 value to the buffer, at the desired offset. */
15+
writeUInt8(value:u8, offset?:i32): i32;
16+
/** Reads a signed 16-bit integer, stored in Little Endian format at the designated offset. */
17+
readInt16LE(offset?: i32): i16;
18+
/** Reads a signed 16-bit integer, stored in Big Endian format at the designated offset. */
19+
readInt16BE(offset?: i32): i16;
20+
/** Reads an unsigned 16-bit integer, stored in Little Endian format at the designated offset. */
21+
readUInt16LE(offset?: i32): u16;
22+
/** Reads an unsigned 16-bit integer, stored in Big Endian format at the designated offset. */
23+
readUInt16BE(offset?: i32): u16;
24+
/** Writes an inputted 16-bit integer at the designated offset, stored in Little Endian format */
25+
writeInt16LE(value: i16, offset?: i32): i32;
26+
/** Writes an inputted 16-bit integer at the designated offset, stored in Big Endian format */
27+
writeInt16BE(value: i16, offset?: i32): i32;
28+
/** Writes an inputted unsigned 16-bit integer at the designated offset, stored in Little Endian format */
29+
writeUInt16LE(value: u16, offset?: i32): i32;
30+
/** Writes an inputted unsigned 16-bit integer at the designated offset, stored in Big Endian format */
31+
writeUInt16BE(value: u16, offset?: i32): i32;
1632
}

‎tests/buffer.spec.ts‎

Lines changed: 131 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@
1111
*/
1212
import { BLOCK_MAXSIZE } from "rt/common";
1313

14+
// Helper function to quickly create a Buffer from an array.
15+
//@ts-ignore
16+
function create<T>(values: valueof<T>[]): T {
17+
let result = instantiate<T>(values.length);
18+
//@ts-ignore
19+
for (let i = 0; i < values.length; i++) result[i] = values[i];
20+
return result;
21+
}
22+
1423
describe("buffer", () => {
1524
test("#constructor", () => {
1625
expect<Buffer>(new Buffer(0)).toBeTruthy();
@@ -58,50 +67,150 @@ describe("buffer", () => {
5867
expect<bool>(Buffer.isBuffer<Buffer | null>(null)).toBeFalsy();
5968
});
6069

70+
test("#readInt8", () => {
71+
let buff = create<Buffer>([0x5,0x0,0x0,0x0,0xFF]);
72+
expect<i8>(buff.readInt8()).toBe(5);
73+
// Testing offset, and casting between u8 and i8.
74+
expect<i8>(buff.readInt8(4)).toBe(-1);
75+
// TODO:
76+
// expectFn(() => {
77+
// let newBuff = new Buffer(1);
78+
// newBuff.readInt8(5);
79+
// }).toThrow();
80+
});
81+
6182
test("#readUInt8", () => {
62-
let buff = new Buffer(10);
63-
buff[0] = -2;
64-
buff[9] = 47;
83+
let buff = create<Buffer>([0xFE,0x0,0x0,0x0,0x2F]);
6584
// Testing casting between u8 and i8.
66-
expect<u8>(buff.readUInt8(0)).toBe(254);
6785
expect<u8>(buff.readUInt8()).toBe(254);
6886
// Testing offset
69-
expect<u8>(buff.readUInt8(9)).toBe(47);
87+
expect<u8>(buff.readUInt8(4)).toBe(47);
7088
// TODO:
7189
// expectFn(() => {
7290
// let newBuff = new Buffer(1);
7391
// newBuff.readUInt8(5);
7492
// }).toThrow();
7593
});
7694

95+
test("#writeInt8", () => {
96+
let buff = new Buffer(5);
97+
expect<i32>(buff.writeInt8(9)).toBe(1);
98+
expect<i32>(buff.writeInt8(-3,4)).toBe(5);
99+
let result = create<Buffer>([0x09, 0x0, 0x0, 0x0, 0xFD]);
100+
expect<Buffer>(buff).toStrictEqual(result);
101+
// TODO:
102+
// expectFn(() => {
103+
// let newBuff = new Buffer(1);
104+
// newBuff.writeInt8(5,10);
105+
// }).toThrow();
106+
});
107+
77108
test("#writeUInt8", () => {
78109
let buff = new Buffer(5);
79110
expect<i32>(buff.writeUInt8(4)).toBe(1);
80111
expect<i32>(buff.writeUInt8(252,4)).toBe(5);
81-
expect<u8>(buff[0]).toBe(4);
82-
expect<u8>(buff[4]).toBe(252);
112+
let result = create<Buffer>([0x04, 0x0, 0x0, 0x0, 0xFC]);
113+
expect<Buffer>(buff).toStrictEqual(result);
114+
// TODO:
115+
// expectFn(() => {
116+
// let newBuff = new Buffer(1);
117+
// newBuff.writeUInt8(5,10);
118+
// }).toThrow();
119+
});
120+
121+
test("#readInt16LE", () => {
122+
let buff = create<Buffer>([0x0,0x05,0x0]);
123+
expect<i16>(buff.readInt16LE()).toBe(1280);
124+
expect<i16>(buff.readInt16LE(1)).toBe(5);
125+
// TODO:
126+
// expectFn(() => {
127+
// let newBuff = new Buffer(1);
128+
// newBuff.readInt16LE(0);
129+
// }).toThrow();
83130
});
84131

85-
test("#writeInt8", () => {
86-
let buff = new Buffer(5);
87-
expect<i32>(buff.writeInt8(9)).toBe(1);
88-
expect<i32>(buff.writeInt8(-3,4)).toBe(5);
89-
expect<i8>(buff[0]).toBe(9);
90-
expect<i8>(buff[4]).toBe(-3);
132+
test("#readInt16BE", () => {
133+
let buff = create<Buffer>([0x0,0x05,0x0]);
134+
expect<i16>(buff.readInt16BE()).toBe(5);
135+
expect<i16>(buff.readInt16BE(1)).toBe(1280);
136+
// TODO:
137+
// expectFn(() => {
138+
// let newBuff = new Buffer(1);
139+
// newBuff.readInt16BE(0);
140+
// }).toThrow();
91141
});
92142

93-
test("#readInt8", () => {
94-
let buff = new Buffer(10);
95-
buff[0] = 5;
96-
buff[9] = 255;
97-
expect<i8>(buff.readInt8(0)).toBe(5);
98-
expect<i8>(buff.readInt8()).toBe(5);
99-
// Testing offset, and casting between u8 and i8.
100-
expect<i8>(buff.readInt8(9)).toBe(-1);
143+
test("#readUInt16LE", () => {
144+
let buff = create<Buffer>([0x0,0x05,0x0]);
145+
expect<u16>(buff.readUInt16LE()).toBe(1280);
146+
expect<u16>(buff.readUInt16LE(1)).toBe(5);
101147
// TODO:
102148
// expectFn(() => {
103149
// let newBuff = new Buffer(1);
104-
// newBuff.readInt8(5);
150+
// newBuff.readUInt16LE(0);
151+
// }).toThrow();
152+
});
153+
154+
test("#readUInt16BE", () => {
155+
let buff = create<Buffer>([0x0,0x05,0x0]);
156+
expect<i16>(buff.readUInt16BE()).toBe(5);
157+
expect<i16>(buff.readUInt16BE(1)).toBe(1280);
158+
// TODO:
159+
// expectFn(() => {
160+
// let newBuff = new Buffer(1);
161+
// newBuff.readUInt16BE(0);
162+
// }).toThrow();
163+
});
164+
165+
test("#writeInt16LE", () => {
166+
let buff = new Buffer(4);
167+
expect<i32>(buff.writeInt16LE(5)).toBe(2);
168+
expect<i32>(buff.writeInt16LE(1280,2)).toBe(4);
169+
let result = create<Buffer>([0x05, 0x0, 0x0, 0x5]);
170+
expect<Buffer>(buff).toStrictEqual(result);
171+
// TODO:
172+
// expectFn(() => {
173+
// let newBuff = new Buffer(1);
174+
// newBuff.writeInt16LE(0);
175+
// }).toThrow();
176+
});
177+
178+
test("#writeInt16BE", () => {
179+
let buff = new Buffer(4);
180+
expect<i32>(buff.writeInt16BE(1280)).toBe(2);
181+
expect<i32>(buff.writeInt16BE(5,2)).toBe(4);
182+
let result = create<Buffer>([0x05, 0x0, 0x0, 0x5]);
183+
expect<Buffer>(buff).toStrictEqual(result);
184+
// TODO:
185+
// expectFn(() => {
186+
// let newBuff = new Buffer(1);
187+
// newBuff.writeInt16BE(0);
188+
// }).toThrow();
189+
});
190+
191+
test("#writeUInt16LE", () => {
192+
let buff = new Buffer(4);
193+
expect<i32>(buff.writeUInt16LE(5)).toBe(2);
194+
expect<i32>(buff.writeUInt16LE(1280,2)).toBe(4);
195+
let result = create<Buffer>([0x05, 0x0, 0x0, 0x5]);
196+
expect<Buffer>(buff).toStrictEqual(result);
197+
// TODO:
198+
// expectFn(() => {
199+
// let newBuff = new Buffer(1);
200+
// newBuff.writeUInt16LE(0);
201+
// }).toThrow();
202+
});
203+
204+
test("#writeUInt16BE", () => {
205+
let buff = new Buffer(4);
206+
expect<i32>(buff.writeUInt16BE(1280)).toBe(2);
207+
expect<i32>(buff.writeUInt16BE(5,2)).toBe(4);
208+
let result = create<Buffer>([0x05, 0x0, 0x0, 0x5]);
209+
expect<Buffer>(buff).toStrictEqual(result);
210+
// TODO:
211+
// expectFn(() => {
212+
// let newBuff = new Buffer(1);
213+
// newBuff.writeUInt16BE(0);
105214
// }).toThrow();
106215
});
107216
});

0 commit comments

Comments
 (0)