import { HEADER_SIZE } from "./internal/arraybuffer"; export class DataView { constructor( readonly buffer: ArrayBuffer, readonly byteOffset: i32 = 0, readonly byteLength: i32 = i32.MIN_VALUE, ) { if (byteLength === i32.MIN_VALUE) byteLength = buffer.byteLength - byteOffset; if (byteOffset < 0) throw new RangeError("byteOffset cannot be negative"); if (byteLength < 0) throw new RangeError("byteLength cannot be negative"); if (byteOffset + byteLength > buffer.byteLength) throw new RangeError("Length out of range of buffer"); } @inline getFloat32(byteOffset: i32, littleEndian: boolean = false): f32 { var result: u32 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); return reinterpret(littleEndian ? result : bswap(result)); } @inline getFloat64(byteOffset: i32, littleEndian: boolean = false): f64 { var result: u64 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); return reinterpret(littleEndian ? result : bswap(result)); } @inline getInt8(byteOffset: i32): i8 { return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); } @inline getInt16(byteOffset: i32, littleEndian: boolean = false): i16 { var result: i16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); return littleEndian ? result : bswap(result); } @inline getInt32(byteOffset: i32, littleEndian: boolean = false): i32 { var result: i32 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); return littleEndian ? result : bswap(result); } @inline getUint8(byteOffset: i32): u8 { return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); } @inline getUint16(byteOffset: i32, littleEndian: boolean = false): u16 { var result: u16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); return littleEndian ? result : bswap(result); } @inline getUint32(byteOffset: i32, littleEndian: boolean = false): u32 { var result: u32 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); return littleEndian ? result : bswap(result); } @inline setFloat32(byteOffset: i32, value: f32, littleEndian: boolean = false): void { var input: f32 = littleEndian ? value : reinterpret(bswap(reinterpret(value))); store(changetype(this.buffer) + this.byteOffset + byteOffset, input, HEADER_SIZE); } @inline setFloat64(byteOffset: i32, value: f64, littleEndian: boolean = false): void { var input: f64 = littleEndian ? value : reinterpret(bswap(reinterpret(value))); store(changetype(this.buffer) + this.byteOffset + byteOffset, input, HEADER_SIZE); } @inline setInt8(byteOffset: i32, value: i8): void { store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE); } @inline setInt16(byteOffset: i32, value: i16, littleEndian: boolean = false): void { store(changetype(this.buffer) + this.byteOffset + byteOffset, littleEndian ? value : bswap(value), HEADER_SIZE); } @inline setInt32(byteOffset: i32, value: i32, littleEndian: boolean = false): void { store(changetype(this.buffer) + this.byteOffset + byteOffset, littleEndian ? value : bswap(value), HEADER_SIZE); } @inline setUint8(byteOffset: i32, value: u8): void { store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE); } @inline setUint16(byteOffset: i32, value: u16, littleEndian: boolean = false): void { store(changetype(this.buffer) + this.byteOffset + byteOffset, littleEndian ? value : bswap(value), HEADER_SIZE); } @inline setUint32(byteOffset: i32, value: u32, littleEndian: boolean = false): void { store(changetype(this.buffer) + this.byteOffset + byteOffset, littleEndian ? value : bswap(value), HEADER_SIZE); } /** * Non-standard additions that makes sense in WebAssembly, but won't work in JS */ @inline getInt64(byteOffset: i32, littleEndian: boolean = false): i64 { var result: i64 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); return littleEndian ? result : bswap(result); } @inline getUint64(byteOffset: i32, littleEndian: boolean = false): u64 { var result: u64 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE); return littleEndian ? result : bswap(result); } @inline setInt64(byteOffset: i32, value: i64, littleEndian: boolean = false): void { store(changetype(this.buffer) + this.byteOffset + byteOffset, littleEndian ? value : bswap(value), HEADER_SIZE); } @inline setUint64(byteOffset: i32, value: u64, littleEndian: boolean = false): void { store(changetype(this.buffer) + this.byteOffset + byteOffset, littleEndian ? value : bswap(value), HEADER_SIZE); } }