// <auto-generated>
//  automatically generated by the FlatBuffers compiler, do not modify
// </auto-generated>

namespace Apache.Arrow.Flatbuf
{

using global::System;
using global::System.Collections.Generic;
using global::Google.FlatBuffers;

internal struct FixedSizeList : IFlatbufferObject
{
  private Table __p;
  public ByteBuffer ByteBuffer { get { return __p.bb; } }
  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_9(); }
  public static FixedSizeList GetRootAsFixedSizeList(ByteBuffer _bb) { return GetRootAsFixedSizeList(_bb, new FixedSizeList()); }
  public static FixedSizeList GetRootAsFixedSizeList(ByteBuffer _bb, FixedSizeList obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
  public FixedSizeList __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }

  /// Number of list items per value
  public int ListSize { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }

  public static Offset<FixedSizeList> CreateFixedSizeList(FlatBufferBuilder builder,
      int listSize = 0) {
    builder.StartTable(1);
    FixedSizeList.AddListSize(builder, listSize);
    return FixedSizeList.EndFixedSizeList(builder);
  }

  public static void StartFixedSizeList(FlatBufferBuilder builder) { builder.StartTable(1); }
  public static void AddListSize(FlatBufferBuilder builder, int listSize) { builder.AddInt(0, listSize, 0); }
  public static Offset<FixedSizeList> EndFixedSizeList(FlatBufferBuilder builder) {
    int o = builder.EndTable();
    return new Offset<FixedSizeList>(o);
  }
}


static internal class FixedSizeListVerify
{
  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)
  {
    return verifier.VerifyTableStart(tablePos)
      && verifier.VerifyField(tablePos, 4 /*ListSize*/, 4 /*int*/, 4, false)
      && verifier.VerifyTableEnd(tablePos);
  }
}

}
