import { OBJECT, TOTAL_OVERHEAD } from "rt/common"; import { JSON } from "../.."; import { deserializeArbitraryArray } from "./array/arbitrary"; import { deserializeArrayArray } from "./array/array"; import { deserializeBooleanArray } from "./array/bool"; import { deserializeBoxArray } from "./array/box"; import { deserializeFloatArray_NAIVE } from "./array/float"; import { deserializeIntegerArray_NAIVE } from "./array/integer"; import { deserializeMapArray } from "./array/map"; import { deserializeObjectArray } from "./array/object"; import { deserializeRawArray } from "./array/raw"; import { deserializeStructArray } from "./array/struct"; import { deserializeStringArray_NAIVE } from "./array/string"; import { deserializeStaticArrayBoolean } from "./staticarray/bool"; import { deserializeStaticArrayFloat } from "./staticarray/float"; import { deserializeStaticArrayInteger } from "./staticarray/integer"; import { deserializeStaticArrayString } from "./staticarray/string"; import { scanValueEnd } from "../../util/scanValueEnd"; function materializeStaticArray>( src: valueof[], dst: usize, ): T { const byteLength = src.length * sizeof>(); let out = dst; if (!out) { out = __new(byteLength, idof()); } else if (changetype(out - TOTAL_OVERHEAD).rtSize != byteLength) { out = __renew(out, byteLength); } const typed = changetype(out); for (let i = 0; i < src.length; i++) { unchecked((typed[i] = unchecked(src[i]))); } return typed; } export function deserializeStaticArray>( srcStart: usize, srcEnd: usize, dst: usize, ): T { if (isString>()) { return changetype(deserializeStaticArrayString(srcStart, srcEnd, dst)); } else if (isBoolean>()) { return deserializeStaticArrayBoolean(srcStart, srcEnd, dst); } else if (isInteger>()) { return deserializeStaticArrayInteger(srcStart, srcEnd, dst); } else if (isFloat>()) { return deserializeStaticArrayFloat(srcStart, srcEnd, dst); } else if (isArray>()) { return materializeStaticArray( deserializeArrayArray[]>(srcStart, srcEnd, 0), dst, ); } else if (isManaged>() || isReference>()) { const type = changetype>>(0); if (type instanceof StaticArray) { return materializeStaticArray( deserializeArrayArray[]>(srcStart, srcEnd, 0), dst, ); } else if (type instanceof JSON.Value) { return materializeStaticArray( changetype[]>( deserializeArbitraryArray(srcStart, srcEnd, 0), ), dst, ); } else if (type instanceof JSON.Box) { return materializeStaticArray( changetype[]>( deserializeBoxArray[]>(srcStart, srcEnd, 0), ), dst, ); } else if (type instanceof JSON.Obj) { return materializeStaticArray( deserializeObjectArray[]>(srcStart, srcEnd, 0), dst, ); } else if (type instanceof JSON.Raw) { return materializeStaticArray( changetype[]>(deserializeRawArray(srcStart, srcEnd, 0)), dst, ); } else if (type instanceof Map) { return materializeStaticArray( deserializeMapArray[]>(srcStart, srcEnd, 0), dst, ); // @ts-ignore: supplied by transform } else if (isDefined(type.__DESERIALIZE_CUSTOM)) { return materializeStaticArray( deserializeStructArray[]>(srcStart, srcEnd, 0), dst, ); // @ts-ignore: supplied by transform } else if ( isDefined(type.__DESERIALIZE_SLOW) || isDefined(type.__DESERIALIZE_FAST) ) { return materializeStaticArray( deserializeStructArray[]>(srcStart, srcEnd, 0), dst, ); } } throw new Error("Could not parse static array of type " + nameof() + "!"); } export function deserializeStaticArrayField>( srcStart: usize, srcEnd: usize, dstObj: usize, dstOffset: usize = 0, ): usize { const valueEnd = scanValueEnd(srcStart, srcEnd); if (!valueEnd) throw new Error("Failed to parse JSON!"); const fieldPtr = dstObj + dstOffset; const out = deserializeStaticArray( srcStart, valueEnd, load(fieldPtr), ); store(fieldPtr, out); return valueEnd; }