// automatically generated by the FlatBuffers compiler, do not modify

package MyGame.Example;

import com.google.flatbuffers.BaseVector;
import com.google.flatbuffers.BooleanVector;
import com.google.flatbuffers.ByteVector;
import com.google.flatbuffers.Constants;
import com.google.flatbuffers.DoubleVector;
import com.google.flatbuffers.FlatBufferBuilder;
import com.google.flatbuffers.FloatVector;
import com.google.flatbuffers.IntVector;
import com.google.flatbuffers.LongVector;
import com.google.flatbuffers.ShortVector;
import com.google.flatbuffers.StringVector;
import com.google.flatbuffers.Struct;
import com.google.flatbuffers.UnionVector;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class LargeArrayStructT {
  private int[] d;
  private float[] e;
  private boolean[] f;
  private MyGame.Example.NestedStructT[] g;
  private byte[] h;

  public int[] getD() { return d; }

  public void setD(int[] d) { if (d != null && d.length == 64) this.d = d; }

  public float[] getE() { return e; }

  public void setE(float[] e) { if (e != null && e.length == 64) this.e = e; }

  public boolean[] getF() { return f; }

  public void setF(boolean[] f) { if (f != null && f.length == 64) this.f = f; }

  public MyGame.Example.NestedStructT[] getG() { return g; }

  public void setG(MyGame.Example.NestedStructT[] g) { if (g != null && g.length == 64) this.g = g; }

  public byte[] getH() { return h; }

  public void setH(byte[] h) { if (h != null && h.length == 64) this.h = h; }


  public LargeArrayStructT() {
    this.d = new int[64];
    this.e = new float[64];
    this.f = new boolean[64];
    this.g = new MyGame.Example.NestedStructT[64];
    this.h = new byte[64];
  }
}

