forked from BigfootDev/flatbuffers
74 lines
2.5 KiB
TypeScript
74 lines
2.5 KiB
TypeScript
import {fromByteWidth, paddingSize, uwidth} from './bit-width-util.js';
|
|
import {BitWidth} from './bit-width.js';
|
|
import {Builder} from './builder.js';
|
|
import {isInline, packedType} from './value-type-util.js';
|
|
import {ValueType} from './value-type.js';
|
|
|
|
export class StackValue {
|
|
constructor(
|
|
private builder: Builder,
|
|
public type: ValueType,
|
|
public width: number,
|
|
public value: number | boolean | null = null,
|
|
public offset: number = 0,
|
|
) {}
|
|
|
|
elementWidth(size: number, index: number): BitWidth {
|
|
if (isInline(this.type)) return this.width;
|
|
for (let i = 0; i < 4; i++) {
|
|
const width = 1 << i;
|
|
const offsetLoc = size + paddingSize(size, width) + index * width;
|
|
const offset = offsetLoc - this.offset;
|
|
const bitWidth = uwidth(offset);
|
|
if (1 << bitWidth === width) {
|
|
return bitWidth;
|
|
}
|
|
}
|
|
throw `Element is unknown. Size: ${size} at index: ${index}. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new`;
|
|
}
|
|
|
|
writeToBuffer(byteWidth: number): void {
|
|
const newOffset = this.builder.computeOffset(byteWidth);
|
|
if (this.type === ValueType.FLOAT) {
|
|
if (this.width === BitWidth.WIDTH32) {
|
|
this.builder.view.setFloat32(
|
|
this.builder.offset,
|
|
this.value as number,
|
|
true,
|
|
);
|
|
} else {
|
|
this.builder.view.setFloat64(
|
|
this.builder.offset,
|
|
this.value as number,
|
|
true,
|
|
);
|
|
}
|
|
} else if (this.type === ValueType.INT) {
|
|
const bitWidth = fromByteWidth(byteWidth);
|
|
this.builder.pushInt(this.value as number, bitWidth);
|
|
} else if (this.type === ValueType.UINT) {
|
|
const bitWidth = fromByteWidth(byteWidth);
|
|
this.builder.pushUInt(this.value as number, bitWidth);
|
|
} else if (this.type === ValueType.NULL) {
|
|
this.builder.pushInt(0, this.width);
|
|
} else if (this.type === ValueType.BOOL) {
|
|
this.builder.pushInt(this.value ? 1 : 0, this.width);
|
|
} else {
|
|
throw `Unexpected type: ${this.type}. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new`;
|
|
}
|
|
this.offset = newOffset;
|
|
}
|
|
|
|
storedWidth(width = BitWidth.WIDTH8): BitWidth {
|
|
return isInline(this.type) ? Math.max(width, this.width) : this.width;
|
|
}
|
|
|
|
storedPackedType(width = BitWidth.WIDTH8): ValueType {
|
|
return packedType(this.type, this.storedWidth(width));
|
|
}
|
|
|
|
isOffset(): boolean {
|
|
return !isInline(this.type);
|
|
}
|
|
}
|