| 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); |
| } |
| } |