import { bs } from "../../../lib/as-bs"; import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars"; import { JSON } from "../.."; import { serializeBoolUnsafe } from "./bool"; import { serializeFloat32Unsafe, serializeFloat64Unsafe } from "./float"; import { serializeIntegerUnsafe } from "./integer"; import { serializeString } from "../index/string"; 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 reservePrimitiveSet(len: i32): void { if (len <= 0) return; if (isBoolean()) { bs.proposeSize(4 + len * 12); } else if (isInteger()) { bs.proposeSize(4 + len * (maxIntegerBytes() + 2)); } else if (isFloat()) { bs.proposeSize(4 + len * (sizeof() == 4 ? 34 : 66)); } else { bs.proposeSize(4 + (len - 1) * 2); } } export function serializeSet>(src: T): void { const srcSize = src.size; if (srcSize == 0) { bs.proposeSize(4); store(bs.offset, 6094939); // [] bs.offset += 4; return; } if ( isBoolean>() || isInteger>() || isFloat>() || isString>() ) { reservePrimitiveSet>(srcSize); } else { bs.proposeSize(4 + (srcSize - 1) * 2); } const values = src.values(); store(bs.offset, BRACKET_LEFT); bs.offset += 2; const end = srcSize - 1; for (let i = 0; i < end; i++) { const block = unchecked(values[i]); if (isString>()) { serializeString(block as string); } else if (isBoolean>()) { serializeBoolUnsafe(block); } else if (isInteger>()) { serializeIntegerUnsafe>(block); } else if (isFloat>()) { if (sizeof>() == 4) serializeFloat32Unsafe(block); else serializeFloat64Unsafe(block); } else { // @ts-ignore: type JSON.__serialize>(block); } store(bs.offset, COMMA); bs.offset += 2; } const lastBlock = unchecked(values[end]); if (isString>()) { serializeString(lastBlock as string); } else if (isBoolean>()) { serializeBoolUnsafe(lastBlock); } else if (isInteger>()) { serializeIntegerUnsafe>(lastBlock); } else if (isFloat>()) { if (sizeof>() == 4) serializeFloat32Unsafe(lastBlock); else serializeFloat64Unsafe(lastBlock); } else { // @ts-ignore: type JSON.__serialize>(lastBlock); } store(bs.offset, BRACKET_RIGHT); bs.offset += 2; }