import { JSON } from "../.."; import { deserializeArbitraryArrayField } from "./array/arbitrary"; import { deserializeArrayArrayField } from "./array/array"; import { deserializeBooleanArrayField } from "./array/bool"; import { deserializeBoxArrayField } from "./array/box"; import { deserializeFloatArrayField } from "./array/float"; import { deserializeGenericArrayField } from "./array/generic"; import { deserializeIntegerArrayField } from "./array/integer"; import { deserializeMapArrayField } from "./array/map"; import { deserializeObjectArrayField } from "./array/object"; import { deserializeRawArrayField } from "./array/raw"; import { deserializeStringArrayField } from "./array/string"; import { deserializeStructArrayField } from "./array/struct"; export { deserializeArrayField as deserializeArrayField_SWAR }; export function deserializeArrayField( srcStart: usize, srcEnd: usize, dstObj: usize, dstOffset: usize = 0, ): usize { const fieldPtr = dstObj + dstOffset; if (isString>()) { return deserializeStringArrayField(srcStart, srcEnd, fieldPtr); } else if (isBoolean>()) { return deserializeBooleanArrayField(srcStart, srcEnd, fieldPtr); } else if (isInteger>()) { return deserializeIntegerArrayField(srcStart, srcEnd, fieldPtr); } else if (isFloat>()) { return deserializeFloatArrayField(srcStart, srcEnd, fieldPtr); } else if (isArray>()) { return deserializeArrayArrayField(srcStart, srcEnd, fieldPtr); } else if (isManaged>() || isReference>()) { const type = changetype>>(0); if (type instanceof JSON.Value) { return deserializeArbitraryArrayField(srcStart, srcEnd, fieldPtr); } else if (type instanceof JSON.Box) { return deserializeBoxArrayField(srcStart, srcEnd, fieldPtr); } else if (type instanceof JSON.Obj) { return deserializeObjectArrayField(srcStart, srcEnd, fieldPtr); } else if (type instanceof JSON.Raw) { return deserializeRawArrayField(srcStart, srcEnd, fieldPtr); } else if (type instanceof Date) { return deserializeGenericArrayField(srcStart, srcEnd, fieldPtr); } else if (type instanceof Set) { return deserializeGenericArrayField(srcStart, srcEnd, fieldPtr); } else if (type instanceof Map) { return deserializeMapArrayField(srcStart, srcEnd, fieldPtr); // @ts-ignore: defined by transform } else if (isDefined(type.__DESERIALIZE_CUSTOM)) { return deserializeStructArrayField(srcStart, srcEnd, fieldPtr); // @ts-ignore: defined by transform } else if ( isDefined(type.__DESERIALIZE_SLOW) || isDefined(type.__DESERIALIZE_FAST) ) { return deserializeStructArrayField(srcStart, srcEnd, fieldPtr); } throw new Error("Could not parse array field of type " + nameof() + "!"); } else { throw new Error("Could not parse array field of type " + nameof() + "!"); } }