import { COMMA, BRACKET_RIGHT } from "../../custom/chars"; import { deserializeFloat_NAIVE } from "./float"; import { atoi, isSpace } from "../../util"; function countTypedArrayElements(srcStart: usize, srcEnd: usize): i32 { let count = 0; while (srcStart < srcEnd) { const code = load(srcStart); if (code - 48 <= 9 || code == 45) { count++; srcStart += 2; while (srcStart < srcEnd) { const code = load(srcStart); if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) break; srcStart += 2; } } srcStart += 2; } return count; } export function deserializeTypedArray_NAIVE>( srcStart: usize, srcEnd: usize, dst: usize = 0, ): T { const count = countTypedArrayElements(srcStart, srcEnd); let out = changetype(dst || changetype(instantiate(count))); if (out.length != count) { out = changetype(instantiate(count)); } let index = 0; while (srcStart < srcEnd) { const code = load(srcStart); if (code - 48 <= 9 || code == 45) { const lastIndex = srcStart; srcStart += 2; while (srcStart < srcEnd) { const code = load(srcStart); if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) { if (isFloat>()) { unchecked( (out[index++] = deserializeFloat_NAIVE>( lastIndex, srcStart, )), ); } else { unchecked((out[index++] = atoi>(lastIndex, srcStart))); } break; } srcStart += 2; } } srcStart += 2; } return out; } export function deserializeArrayBuffer_NAIVE( srcStart: usize, srcEnd: usize, dst: usize = 0, ): ArrayBuffer { const count = countTypedArrayElements(srcStart, srcEnd); let out = dst ? changetype(dst) : new ArrayBuffer(count); if (out.byteLength != count) { out = new ArrayBuffer(count); } const outStart = changetype(out); let index: usize = 0; while (srcStart < srcEnd) { const code = load(srcStart); if (code - 48 <= 9 || code == 45) { const lastIndex = srcStart; srcStart += 2; while (srcStart < srcEnd) { const code = load(srcStart); if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) { store(outStart + index++, atoi(lastIndex, srcStart)); break; } srcStart += 2; } } srcStart += 2; } return out; }