// automatically generated by the FlatBuffers compiler, do not modify
import { Ability } from '../../my-game/example/ability';
import { Test } from '../../my-game/example/test';
export class StructOfStructs {
    constructor() {
        this.bb = null;
        this.bb_pos = 0;
    }
    __init(i, bb) {
        this.bb_pos = i;
        this.bb = bb;
        return this;
    }
    a(obj) {
        return (obj || new Ability()).__init(this.bb_pos, this.bb);
    }
    b(obj) {
        return (obj || new Test()).__init(this.bb_pos + 8, this.bb);
    }
    c(obj) {
        return (obj || new Ability()).__init(this.bb_pos + 12, this.bb);
    }
    static getFullyQualifiedName() {
        return 'MyGame.Example.StructOfStructs';
    }
    static sizeOf() {
        return 20;
    }
    static createStructOfStructs(builder, a_id, a_distance, b_a, b_b, c_id, c_distance) {
        builder.prep(4, 20);
        builder.prep(4, 8);
        builder.writeInt32(c_distance);
        builder.writeInt32(c_id);
        builder.prep(2, 4);
        builder.pad(1);
        builder.writeInt8(b_b);
        builder.writeInt16(b_a);
        builder.prep(4, 8);
        builder.writeInt32(a_distance);
        builder.writeInt32(a_id);
        return builder.offset();
    }
    unpack() {
        return new StructOfStructsT((this.a() !== null ? this.a().unpack() : null), (this.b() !== null ? this.b().unpack() : null), (this.c() !== null ? this.c().unpack() : null));
    }
    unpackTo(_o) {
        _o.a = (this.a() !== null ? this.a().unpack() : null);
        _o.b = (this.b() !== null ? this.b().unpack() : null);
        _o.c = (this.c() !== null ? this.c().unpack() : null);
    }
}
export class StructOfStructsT {
    constructor(a = null, b = null, c = null) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
    pack(builder) {
        return StructOfStructs.createStructOfStructs(builder, (this.a === null ? 0 : this.a.id), (this.a === null ? 0 : this.a.distance), (this.b === null ? 0 : this.b.a), (this.b === null ? 0 : this.b.b), (this.c === null ? 0 : this.c.id), (this.c === null ? 0 : this.c.distance));
    }
}
