1+ import DataReader from "./data_reader.ts" ;
2+
13/**
24 * This class represents a binary reader. It is similar to DataView but has an internal pointer to
35 * automatically pop the bytes that have been already read.
46 */
5- export default class BinaryReader {
6- private bufferView : DataView ;
7- private pointer : number = 0 ;
8-
7+ export default class BinaryReader extends DataReader {
8+ private readonly bufferView : DataViewConstructor ;
9+
910 /**
1011 * @param buffer The buffer to read from
1112 */
12- constructor ( buffer : ArrayBufferLike ) {
13- this . bufferView = new DataView ( buffer ) ;
14- }
15-
16- /**
17- * This instance function reads `n` bytes and pushes the pointer accordingly.
18- *
19- * @param readFunction The function that should be used for reading `n` bytes
20- * @param bytes How many bytes to read
21- * @returns The value read by `readFunction`.
22- */
23- private read < ReadFunction > ( readFunction : ( ) => ReadFunction , bytes : number ) : ReadFunction {
24- const value = readFunction ( ) ;
25- this . pointer += bytes ;
26- return value ;
27- }
28-
29- /**
30- * This getter returns the entire buffer.
31- *
32- * @returns The entire buffer.
33- */
34- public get buffer ( ) : ArrayBufferLike {
35- return this . bufferView . buffer ;
36- }
37-
38- /**
39- * This getter returns the buffer that is left to read.
40- *
41- * @returns The buffer that is left.
42- */
43- public get bufferLeft ( ) : ArrayBufferLike {
44- return this . bufferView . buffer . slice ( this . pointer ) ;
13+ constructor ( buffer : ArrayBuffer ) {
14+ super ( buffer ) ;
15+ this . bufferView = DataView
4516 }
4617
4718 /**
@@ -50,96 +21,96 @@ export default class BinaryReader {
5021 * @returns The `Int8` read.
5122 */
5223 public readInt8 ( ) : number {
53- return this . read ( ( ) => this . bufferView . getInt8 ( this . pointer ) , 1 ) ;
24+ return new this . bufferView ( this . read ( 1 ) ) . getInt8 ( 0 )
5425 }
5526
5627 /**
5728 * This instance function reads a `Uint8`.
5829 *
5930 * @returns The `Uint8` read.
6031 */
61- public readUint8 ( ) : number {
62- return this . read ( ( ) => this . bufferView . getUint8 ( this . pointer ) , 1 ) ;
32+ public readUint8 ( ) : number {
33+ return new this . bufferView ( this . read ( 1 ) ) . getUint8 ( 0 )
6334 }
6435
6536 /**
6637 * This instance function reads a `Int16` (2 bytes).
6738 *
6839 * @returns The `Int16` read.
6940 */
70- public readInt16 ( littleEndian : boolean = true ) : number {
71- return this . read ( ( ) => this . bufferView . getInt16 ( this . pointer , littleEndian ) , 2 ) ;
41+ public readInt16 ( littleEndian ? : boolean ) : number {
42+ return new this . bufferView ( this . read ( 2 ) ) . getInt16 ( 0 , littleEndian )
7243 }
7344
7445 /**
7546 * This instance function reads a `Uint16` (2 bytes).
7647 *
7748 * @returns The `Uint16` read.
7849 */
79- public readUint16 ( littleEndian : boolean = true ) : number {
80- return this . read ( ( ) => this . bufferView . getUint16 ( this . pointer , littleEndian ) , 2 ) ;
50+ public readUint16 ( littleEndian ? : boolean ) : number {
51+ return new this . bufferView ( this . read ( 2 ) ) . getUint16 ( 0 , littleEndian ) ;
8152 }
8253
8354 /**
8455 * This instance function reads a `Int32` (4 bytes).
8556 *
8657 * @returns The `Int32` read.
8758 */
88- public readInt32 ( littleEndian : boolean = true ) : number {
89- return this . read ( ( ) => this . bufferView . getInt32 ( this . pointer , littleEndian ) , 4 ) ;
59+ public readInt32 ( littleEndian ? : boolean ) : number {
60+ return new this . bufferView ( this . read ( 4 ) ) . getInt32 ( 0 , littleEndian ) ;
9061 }
9162
9263 /**
9364 * This instance function reads a `Uint32` (4 bytes).
9465 *
9566 * @returns The `Uint32` read.
9667 */
97- public readUint32 ( littleEndian : boolean = true ) : number {
98- return this . read ( ( ) => this . bufferView . getUint32 ( this . pointer , littleEndian ) , 4 ) ;
68+ public readUint32 ( littleEndian ? : boolean ) : number {
69+ return new this . bufferView ( this . read ( 4 ) ) . getUint32 ( 0 , littleEndian ) ;
9970 }
10071
10172 /**
10273 * This instance function reads a `Int64` (8 bytes).
10374 *
10475 * @returns The `Int64` read.
10576 */
106- public readInt64 ( littleEndian : boolean = true ) : bigint {
107- return this . read ( ( ) => this . bufferView . getBigInt64 ( this . pointer , littleEndian ) , 8 ) ;
77+ public readInt64 ( littleEndian ? : boolean ) : bigint {
78+ return new this . bufferView ( this . read ( 8 ) ) . getBigInt64 ( 0 , littleEndian ) ;
10879 }
10980
11081 /**
11182 * This instance function reads a `Uint64` (8 bytes).
11283 *
11384 * @returns The `Uint64` read.
11485 */
115- public readUint64 ( littleEndian : boolean = true ) : bigint {
116- return this . read ( ( ) => this . bufferView . getBigUint64 ( this . pointer , littleEndian ) , 8 ) ;
86+ public readUint64 ( littleEndian ? : boolean ) : bigint {
87+ return new this . bufferView ( this . read ( 8 ) ) . getBigUint64 ( 0 , littleEndian ) ;
11788 }
11889
11990 /**
12091 * This instance function reads a `Float16` (2 bytes).
12192 *
12293 * @returns The `Float16` read.
12394 */
124- public readFloat16 ( littleEndian : boolean = true ) : number {
125- return this . read ( ( ) => this . bufferView . getFloat16 ( this . pointer , littleEndian ) , 2 ) ;
95+ public readFloat16 ( littleEndian ? : boolean ) : number {
96+ return new this . bufferView ( this . read ( 2 ) ) . getFloat16 ( 0 , littleEndian ) ;
12697 }
12798
12899 /**
129100 * This instance function reads a `Float32` (4 bytes).
130101 *
131102 * @returns The `Float32` read.
132103 */
133- public readFloat32 ( littleEndian : boolean = true ) : number {
134- return this . read ( ( ) => this . bufferView . getFloat32 ( this . pointer , littleEndian ) , 4 ) ;
104+ public readFloat32 ( littleEndian ? : boolean ) : number {
105+ return new this . bufferView ( this . read ( 4 ) ) . getFloat32 ( 0 , littleEndian ) ;
135106 }
136107
137108 /**
138109 * This instance function reads a `Float64` (8 bytes).
139110 *
140111 * @returns The `Float54` read.
141112 */
142- public readFloat64 ( littleEndian : boolean = true ) : number {
143- return this . read ( ( ) => this . bufferView . getFloat64 ( this . pointer , littleEndian ) , 8 ) ;
113+ public readFloat64 ( littleEndian ? : boolean ) : number {
114+ return new this . bufferView ( this . read ( 8 ) ) . getFloat64 ( 0 , littleEndian ) ;
144115 }
145116}
0 commit comments