import { bs } from "../../../lib/as-bs"; import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../custom/chars"; import { serializeFloat32Unsafe, serializeFloat64Unsafe } from "./float"; import { serializeIntegerUnsafe } from "./integer"; function maxIntegerBytes(): u32 { if (sizeof() == 1) return isSigned() ? 8 : 6; if (sizeof() == 2) return isSigned() ? 12 : 10; if (sizeof() == 4) return isSigned() ? 22 : 20; return isSigned() ? 42 : 40; } function reserveTypedArray>(len: i32): void { if (len <= 0) return; if (isFloat>()) { bs.proposeSize(4 + len * (sizeof>() == 4 ? 34 : 66)); } else { bs.proposeSize(4 + len * (maxIntegerBytes>() + 2)); } } function serializeTypedArrayElement>( src: T, index: i32, ): void { if (isFloat>()) { if (sizeof>() == 4) serializeFloat32Unsafe(unchecked(src[index])); else serializeFloat64Unsafe(unchecked(src[index])); } else { serializeIntegerUnsafe>(unchecked(src[index])); } } export function serializeTypedArray>(src: T): void { const len = src.length; const end = len - 1; if (end == -1) { bs.proposeSize(4); store(bs.offset, 6094939); bs.offset += 4; return; } reserveTypedArray(len); store(bs.offset, BRACKET_LEFT); bs.offset += 2; for (let i = 0; i < end; i++) { serializeTypedArrayElement(src, i); store(bs.offset, COMMA); bs.offset += 2; } serializeTypedArrayElement(src, end); store(bs.offset, BRACKET_RIGHT); bs.offset += 2; } export function serializeArrayBufferUnsafe( srcStart: usize, byteLength: i32, ): void { const end = byteLength - 1; if (end == -1) { bs.proposeSize(4); store(bs.offset, 6094939); bs.offset += 4; return; } bs.proposeSize(4 + byteLength * 8); store(bs.offset, BRACKET_LEFT); bs.offset += 2; for (let i = 0; i < end; i++) { serializeIntegerUnsafe(load(srcStart + i)); store(bs.offset, COMMA); bs.offset += 2; } serializeIntegerUnsafe(load(srcStart + end)); store(bs.offset, BRACKET_RIGHT); bs.offset += 2; }