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

namespace Apache.Arrow.Flatbuf
{

using global::System;
using global::FlatBuffers;

/// ----------------------------------------------------------------------
/// Data structures for describing a table row batch (a collection of
/// equal-length Arrow arrays)
/// Metadata about a field at some level of a nested type tree (but not
/// its children).
///
/// For example, a List<Int16> with values [[1, 2, 3], null, [4], [5, 6], null]
/// would have {length: 5, null_count: 2} for its List node, and {length: 6,
/// null_count: 0} for its Int16 node, as separate FieldNode structs
internal struct FieldNode : IFlatbufferObject
{
  private Struct __p;
  public ByteBuffer ByteBuffer { get { return __p.bb; } }
  public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
  public FieldNode __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }

  /// The number of value slots in the Arrow array at this level of a nested
  /// tree
  public long Length { get { return __p.bb.GetLong(__p.bb_pos + 0); } }
  /// The number of observed nulls. Fields with null_count == 0 may choose not
  /// to write their physical validity bitmap out as a materialized buffer,
  /// instead setting the length of the bitmap buffer to 0.
  public long NullCount { get { return __p.bb.GetLong(__p.bb_pos + 8); } }

  public static Offset<FieldNode> CreateFieldNode(FlatBufferBuilder builder, long Length, long NullCount) {
    builder.Prep(8, 16);
    builder.PutLong(NullCount);
    builder.PutLong(Length);
    return new Offset<FieldNode>(builder.Offset);
  }
};


}
