private readStmtSpecificType()

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)}
    `;
  }