You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

110 lines
3.0 KiB

/*
* This is a AssemblyScript port of the original Java version, which was written by
* Gil Tene as described in
* https://github.com/HdrHistogram/HdrHistogram
* and released to the public domain, as explained at
* http://creativecommons.org/publicdomain/zero/1.0/
*/
/**
* Mimic Java's ByteBufffer with big endian order
*/
class ByteBuffer {
position: i32;
data: Uint8Array;
int64ArrayForConvert: Uint64Array;
int32ArrayForConvert: Uint32Array;
int8ArrayForConvertInt32: Uint8Array;
int8ArrayForConvertInt64: Uint8Array;
static allocate(size: i32 = 16): ByteBuffer {
return new ByteBuffer(new Uint8Array(size));
}
constructor(data: Uint8Array) {
this.position = 0;
this.data = data;
this.int64ArrayForConvert = new Uint64Array(1);
this.int32ArrayForConvert = new Uint32Array(1);
this.int8ArrayForConvertInt32 = Uint8Array.wrap(
this.int32ArrayForConvert.buffer
);
this.int8ArrayForConvertInt64 = Uint8Array.wrap(
this.int64ArrayForConvert.buffer
);
}
put(value: u8): void {
if (this.position === this.data.length) {
const oldArray = this.data;
this.data = new Uint8Array(this.data.length << 1);
this.data.set(oldArray);
}
unchecked((this.data[this.position] = value));
this.position++;
}
putInt32(value: u32): void {
if (this.data.length - this.position < 4) {
const oldArray = this.data;
this.data = new Uint8Array((this.data.length << 1) + 4);
this.data.set(oldArray);
}
unchecked((this.int32ArrayForConvert[0] = value));
this.data.set(this.int8ArrayForConvertInt32.reverse(), this.position);
this.position += 4;
}
putInt64(value: u64): void {
if (this.data.length - this.position < 8) {
const oldArray = this.data;
this.data = new Uint8Array((this.data.length << 1) + 8);
this.data.set(oldArray);
}
unchecked((this.int64ArrayForConvert[0] = value));
this.data.set(this.int8ArrayForConvertInt64.reverse(), this.position);
this.position += 8;
}
putArray(array: Uint8Array): void {
if (this.data.length - this.position < array.byteLength) {
const oldArray = this.data;
this.data = new Uint8Array(this.position + array.byteLength);
this.data.set(oldArray);
}
this.data.set(array, this.position);
this.position += array.byteLength;
}
get(): u8 {
const value = unchecked(this.data[this.position]);
this.position++;
return value;
}
getInt32(): u32 {
this.int8ArrayForConvertInt32.set(
this.data.slice(this.position, this.position + 4).reverse()
);
const value = unchecked(this.int32ArrayForConvert[0]);
this.position += 4;
return value;
}
getInt64(): u64 {
this.int8ArrayForConvertInt64.set(
this.data.slice(this.position, this.position + 8).reverse()
);
const value = unchecked(this.int64ArrayForConvert[0]);
this.position += 8;
return value;
}
resetPosition(): void {
this.position = 0;
}
}
export default ByteBuffer;