// <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 Block : IFlatbufferObject
{
  private Struct __p;
  public ByteBuffer ByteBuffer { get { return __p.bb; } }
  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }
  public Block __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }

  /// Index to the start of the RecordBlock (note this is past the Message header)
  public long Offset { get { return __p.bb.GetLong(__p.bb_pos + 0); } }
  /// Length of the metadata
  public int MetaDataLength { get { return __p.bb.GetInt(__p.bb_pos + 8); } }
  /// Length of the data (this is aligned so there can be a gap between this and
  /// the metadata).
  public long BodyLength { get { return __p.bb.GetLong(__p.bb_pos + 16); } }

  public static Offset<Block> CreateBlock(FlatBufferBuilder builder, long Offset, int MetaDataLength, long BodyLength) {
    builder.Prep(8, 24);
    builder.PutLong(BodyLength);
    builder.Pad(4);
    builder.PutInt(MetaDataLength);
    builder.PutLong(Offset);
    return new Offset<Block>(builder.Offset);
  }
}


}
