// automatically generated by the FlatBuffers compiler, do not modify
/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,
 * @typescript-eslint/no-non-null-assertion */
import * as flatbuffers from 'flatbuffers';

import {TableB} from './my-game/other-name-space/table-b.js';

export class TableA {
  constructor() {
    this.bb = null;
    this.bb_pos = 0;
  }
  __init(i, bb) {
    this.bb_pos = i;
    this.bb = bb;
    return this;
  }
  static getRootAsTableA(bb, obj) {
    return (obj || new TableA())
        .__init(bb.readInt32(bb.position()) + bb.position(), bb);
  }
  static getSizePrefixedRootAsTableA(bb, obj) {
    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
    return (obj || new TableA())
        .__init(bb.readInt32(bb.position()) + bb.position(), bb);
  }
  b(obj) {
    const offset = this.bb.__offset(this.bb_pos, 4);
    return offset ?
        (obj || new TableB())
            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :
        null;
  }
  static getFullyQualifiedName() {
    return 'TableA';
  }
  static startTableA(builder) {
    builder.startObject(1);
  }
  static addB(builder, bOffset) {
    builder.addFieldOffset(0, bOffset, 0);
  }
  static endTableA(builder) {
    const offset = builder.endObject();
    return offset;
  }
  static createTableA(builder, bOffset) {
    TableA.startTableA(builder);
    TableA.addB(builder, bOffset);
    return TableA.endTableA(builder);
  }
  serialize() {
    return this.bb.bytes();
  }
  static deserialize(buffer) {
    return TableA.getRootAsTableA(new flatbuffers.ByteBuffer(buffer));
  }
  unpack() {
    return new TableAT((this.b() !== null ? this.b().unpack() : null));
  }
  unpackTo(_o) {
    _o.b = (this.b() !== null ? this.b().unpack() : null);
  }
}
export class TableAT {
  constructor(b = null) {
    this.b = b;
  }
  pack(builder) {
    const b = (this.b !== null ? this.b.pack(builder) : 0);
    return TableA.createTableA(builder, b);
  }
}
