in javascript/packages/fury/lib/gen/map.ts [350:419]
private readStmtSpecificType(accessor: (expr: string) => string, refState: RefState) {
const count = this.scope.uniqueName("count");
const result = this.scope.uniqueName("result");
return `
let ${count} = ${this.builder.reader.varInt32()};
const ${result} = new Map();
if (${refState.toConditionExpr()}) {
${this.builder.referenceResolver.reference(result)}
}
while (${count} > 0) {
const header = ${this.builder.reader.uint16()};
const keyHeader = header >> 12;
const valueHeader = (header >> 8) & 0b00001111;
const chunkSize = header & 0b11111111;
${this.builder.reader.skip(4)};
const keyIncludeNone = keyHeader & ${MapFlags.HAS_NULL};
const keyTrackingRef = keyHeader & ${MapFlags.TRACKING_REF};
const valueIncludeNone = valueHeader & ${MapFlags.HAS_NULL};
const valueTrackingRef = valueHeader & ${MapFlags.TRACKING_REF};
for (let index = 0; index < chunkSize; index++) {
let key;
let value;
let flag = 0;
if (keyTrackingRef || keyIncludeNone) {
flag = ${this.builder.reader.uint8()};
}
switch (flag) {
case ${RefFlags.RefValueFlag}:
${this.keyGenerator.toReadEmbed(x => `key = ${x}`, true, RefState.fromTrue())}
break;
case ${RefFlags.RefFlag}:
key = ${this.builder.referenceResolver.getReadObject(this.builder.reader.varInt32())}
break;
case ${RefFlags.NullFlag}:
key = null;
break;
case ${RefFlags.NotNullValueFlag}:
${this.keyGenerator.toReadEmbed(x => `key = ${x}`, true, RefState.fromFalse())}
break;
}
flag = 0;
if (valueTrackingRef || valueIncludeNone) {
flag = ${this.builder.reader.uint8()};
}
switch (flag) {
case ${RefFlags.RefValueFlag}:
${this.valueGenerator.toReadEmbed(x => `value = ${x}`, true, RefState.fromTrue())}
break;
case ${RefFlags.RefFlag}:
value = ${this.builder.referenceResolver.getReadObject(this.builder.reader.varInt32())}
break;
case ${RefFlags.NullFlag}:
value = null;
break;
case ${RefFlags.NotNullValueFlag}:
${this.valueGenerator.toReadEmbed(x => `value = ${x}`, true, RefState.fromFalse())}
break;
}
${result}.set(
key,
value
);
${count}--;
}
}
${accessor(result)}
`;
}