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

namespace optional_scalars
{

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

public struct ScalarStuff : IFlatbufferObject
{
  private Table __p;
  public ByteBuffer ByteBuffer { get { return __p.bb; } }
  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_1_21(); }
  public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb) { return GetRootAsScalarStuff(_bb, new ScalarStuff()); }
  public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb, ScalarStuff obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
  public static bool ScalarStuffBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "NULL"); }
  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
  public ScalarStuff __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }

  public sbyte JustI8 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
  public sbyte? MaybeI8 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte?)null; } }
  public sbyte DefaultI8 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)42; } }
  public byte JustU8 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
  public byte? MaybeU8 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte?)null; } }
  public byte DefaultU8 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)42; } }
  public short JustI16 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)0; } }
  public short? MaybeI16 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short?)null; } }
  public short DefaultI16 { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)42; } }
  public ushort JustU16 { get { int o = __p.__offset(22); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)0; } }
  public ushort? MaybeU16 { get { int o = __p.__offset(24); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort?)null; } }
  public ushort DefaultU16 { get { int o = __p.__offset(26); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)42; } }
  public int JustI32 { get { int o = __p.__offset(28); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
  public int? MaybeI32 { get { int o = __p.__offset(30); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int?)null; } }
  public int DefaultI32 { get { int o = __p.__offset(32); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)42; } }
  public uint JustU32 { get { int o = __p.__offset(34); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
  public uint? MaybeU32 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint?)null; } }
  public uint DefaultU32 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)42; } }
  public long JustI64 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }
  public long? MaybeI64 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long?)null; } }
  public long DefaultI64 { get { int o = __p.__offset(44); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)42; } }
  public ulong JustU64 { get { int o = __p.__offset(46); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }
  public ulong? MaybeU64 { get { int o = __p.__offset(48); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong?)null; } }
  public ulong DefaultU64 { get { int o = __p.__offset(50); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)42; } }
  public float JustF32 { get { int o = __p.__offset(52); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
  public float? MaybeF32 { get { int o = __p.__offset(54); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float?)null; } }
  public float DefaultF32 { get { int o = __p.__offset(56); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)42.0f; } }
  public double JustF64 { get { int o = __p.__offset(58); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)0.0; } }
  public double? MaybeF64 { get { int o = __p.__offset(60); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double?)null; } }
  public double DefaultF64 { get { int o = __p.__offset(62); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)42.0; } }
  public bool JustBool { get { int o = __p.__offset(64); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)false; } }
  public bool? MaybeBool { get { int o = __p.__offset(66); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool?)null; } }
  public bool DefaultBool { get { int o = __p.__offset(68); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)true; } }
  public optional_scalars.OptionalByte JustEnum { get { int o = __p.__offset(70); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.None; } }
  public optional_scalars.OptionalByte? MaybeEnum { get { int o = __p.__offset(72); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : (optional_scalars.OptionalByte?)null; } }
  public optional_scalars.OptionalByte DefaultEnum { get { int o = __p.__offset(74); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.One; } }

  public static Offset<optional_scalars.ScalarStuff> CreateScalarStuff(FlatBufferBuilder builder,
      sbyte just_i8 = 0,
      sbyte? maybe_i8 = null,
      sbyte default_i8 = 42,
      byte just_u8 = 0,
      byte? maybe_u8 = null,
      byte default_u8 = 42,
      short just_i16 = 0,
      short? maybe_i16 = null,
      short default_i16 = 42,
      ushort just_u16 = 0,
      ushort? maybe_u16 = null,
      ushort default_u16 = 42,
      int just_i32 = 0,
      int? maybe_i32 = null,
      int default_i32 = 42,
      uint just_u32 = 0,
      uint? maybe_u32 = null,
      uint default_u32 = 42,
      long just_i64 = 0,
      long? maybe_i64 = null,
      long default_i64 = 42,
      ulong just_u64 = 0,
      ulong? maybe_u64 = null,
      ulong default_u64 = 42,
      float just_f32 = 0.0f,
      float? maybe_f32 = null,
      float default_f32 = 42.0f,
      double just_f64 = 0.0,
      double? maybe_f64 = null,
      double default_f64 = 42.0,
      bool just_bool = false,
      bool? maybe_bool = null,
      bool default_bool = true,
      optional_scalars.OptionalByte just_enum = optional_scalars.OptionalByte.None,
      optional_scalars.OptionalByte? maybe_enum = null,
      optional_scalars.OptionalByte default_enum = optional_scalars.OptionalByte.One) {
    builder.StartTable(36);
    ScalarStuff.AddDefaultF64(builder, default_f64);
    ScalarStuff.AddMaybeF64(builder, maybe_f64);
    ScalarStuff.AddJustF64(builder, just_f64);
    ScalarStuff.AddDefaultU64(builder, default_u64);
    ScalarStuff.AddMaybeU64(builder, maybe_u64);
    ScalarStuff.AddJustU64(builder, just_u64);
    ScalarStuff.AddDefaultI64(builder, default_i64);
    ScalarStuff.AddMaybeI64(builder, maybe_i64);
    ScalarStuff.AddJustI64(builder, just_i64);
    ScalarStuff.AddDefaultF32(builder, default_f32);
    ScalarStuff.AddMaybeF32(builder, maybe_f32);
    ScalarStuff.AddJustF32(builder, just_f32);
    ScalarStuff.AddDefaultU32(builder, default_u32);
    ScalarStuff.AddMaybeU32(builder, maybe_u32);
    ScalarStuff.AddJustU32(builder, just_u32);
    ScalarStuff.AddDefaultI32(builder, default_i32);
    ScalarStuff.AddMaybeI32(builder, maybe_i32);
    ScalarStuff.AddJustI32(builder, just_i32);
    ScalarStuff.AddDefaultU16(builder, default_u16);
    ScalarStuff.AddMaybeU16(builder, maybe_u16);
    ScalarStuff.AddJustU16(builder, just_u16);
    ScalarStuff.AddDefaultI16(builder, default_i16);
    ScalarStuff.AddMaybeI16(builder, maybe_i16);
    ScalarStuff.AddJustI16(builder, just_i16);
    ScalarStuff.AddDefaultEnum(builder, default_enum);
    ScalarStuff.AddMaybeEnum(builder, maybe_enum);
    ScalarStuff.AddJustEnum(builder, just_enum);
    ScalarStuff.AddDefaultBool(builder, default_bool);
    ScalarStuff.AddMaybeBool(builder, maybe_bool);
    ScalarStuff.AddJustBool(builder, just_bool);
    ScalarStuff.AddDefaultU8(builder, default_u8);
    ScalarStuff.AddMaybeU8(builder, maybe_u8);
    ScalarStuff.AddJustU8(builder, just_u8);
    ScalarStuff.AddDefaultI8(builder, default_i8);
    ScalarStuff.AddMaybeI8(builder, maybe_i8);
    ScalarStuff.AddJustI8(builder, just_i8);
    return ScalarStuff.EndScalarStuff(builder);
  }

  public static void StartScalarStuff(FlatBufferBuilder builder) { builder.StartTable(36); }
  public static void AddJustI8(FlatBufferBuilder builder, sbyte justI8) { builder.AddSbyte(0, justI8, 0); }
  public static void AddMaybeI8(FlatBufferBuilder builder, sbyte? maybeI8) { builder.AddSbyte(1, maybeI8); }
  public static void AddDefaultI8(FlatBufferBuilder builder, sbyte defaultI8) { builder.AddSbyte(2, defaultI8, 42); }
  public static void AddJustU8(FlatBufferBuilder builder, byte justU8) { builder.AddByte(3, justU8, 0); }
  public static void AddMaybeU8(FlatBufferBuilder builder, byte? maybeU8) { builder.AddByte(4, maybeU8); }
  public static void AddDefaultU8(FlatBufferBuilder builder, byte defaultU8) { builder.AddByte(5, defaultU8, 42); }
  public static void AddJustI16(FlatBufferBuilder builder, short justI16) { builder.AddShort(6, justI16, 0); }
  public static void AddMaybeI16(FlatBufferBuilder builder, short? maybeI16) { builder.AddShort(7, maybeI16); }
  public static void AddDefaultI16(FlatBufferBuilder builder, short defaultI16) { builder.AddShort(8, defaultI16, 42); }
  public static void AddJustU16(FlatBufferBuilder builder, ushort justU16) { builder.AddUshort(9, justU16, 0); }
  public static void AddMaybeU16(FlatBufferBuilder builder, ushort? maybeU16) { builder.AddUshort(10, maybeU16); }
  public static void AddDefaultU16(FlatBufferBuilder builder, ushort defaultU16) { builder.AddUshort(11, defaultU16, 42); }
  public static void AddJustI32(FlatBufferBuilder builder, int justI32) { builder.AddInt(12, justI32, 0); }
  public static void AddMaybeI32(FlatBufferBuilder builder, int? maybeI32) { builder.AddInt(13, maybeI32); }
  public static void AddDefaultI32(FlatBufferBuilder builder, int defaultI32) { builder.AddInt(14, defaultI32, 42); }
  public static void AddJustU32(FlatBufferBuilder builder, uint justU32) { builder.AddUint(15, justU32, 0); }
  public static void AddMaybeU32(FlatBufferBuilder builder, uint? maybeU32) { builder.AddUint(16, maybeU32); }
  public static void AddDefaultU32(FlatBufferBuilder builder, uint defaultU32) { builder.AddUint(17, defaultU32, 42); }
  public static void AddJustI64(FlatBufferBuilder builder, long justI64) { builder.AddLong(18, justI64, 0); }
  public static void AddMaybeI64(FlatBufferBuilder builder, long? maybeI64) { builder.AddLong(19, maybeI64); }
  public static void AddDefaultI64(FlatBufferBuilder builder, long defaultI64) { builder.AddLong(20, defaultI64, 42); }
  public static void AddJustU64(FlatBufferBuilder builder, ulong justU64) { builder.AddUlong(21, justU64, 0); }
  public static void AddMaybeU64(FlatBufferBuilder builder, ulong? maybeU64) { builder.AddUlong(22, maybeU64); }
  public static void AddDefaultU64(FlatBufferBuilder builder, ulong defaultU64) { builder.AddUlong(23, defaultU64, 42); }
  public static void AddJustF32(FlatBufferBuilder builder, float justF32) { builder.AddFloat(24, justF32, 0.0f); }
  public static void AddMaybeF32(FlatBufferBuilder builder, float? maybeF32) { builder.AddFloat(25, maybeF32); }
  public static void AddDefaultF32(FlatBufferBuilder builder, float defaultF32) { builder.AddFloat(26, defaultF32, 42.0f); }
  public static void AddJustF64(FlatBufferBuilder builder, double justF64) { builder.AddDouble(27, justF64, 0.0); }
  public static void AddMaybeF64(FlatBufferBuilder builder, double? maybeF64) { builder.AddDouble(28, maybeF64); }
  public static void AddDefaultF64(FlatBufferBuilder builder, double defaultF64) { builder.AddDouble(29, defaultF64, 42.0); }
  public static void AddJustBool(FlatBufferBuilder builder, bool justBool) { builder.AddBool(30, justBool, false); }
  public static void AddMaybeBool(FlatBufferBuilder builder, bool? maybeBool) { builder.AddBool(31, maybeBool); }
  public static void AddDefaultBool(FlatBufferBuilder builder, bool defaultBool) { builder.AddBool(32, defaultBool, true); }
  public static void AddJustEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte justEnum) { builder.AddSbyte(33, (sbyte)justEnum, 0); }
  public static void AddMaybeEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte? maybeEnum) { builder.AddSbyte(34, (sbyte?)maybeEnum); }
  public static void AddDefaultEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte defaultEnum) { builder.AddSbyte(35, (sbyte)defaultEnum, 1); }
  public static Offset<optional_scalars.ScalarStuff> EndScalarStuff(FlatBufferBuilder builder) {
    int o = builder.EndTable();
    return new Offset<optional_scalars.ScalarStuff>(o);
  }
  public static void FinishScalarStuffBuffer(FlatBufferBuilder builder, Offset<optional_scalars.ScalarStuff> offset) { builder.Finish(offset.Value, "NULL"); }
  public static void FinishSizePrefixedScalarStuffBuffer(FlatBufferBuilder builder, Offset<optional_scalars.ScalarStuff> offset) { builder.FinishSizePrefixed(offset.Value, "NULL"); }
  public ScalarStuffT UnPack() {
    var _o = new ScalarStuffT();
    this.UnPackTo(_o);
    return _o;
  }
  public void UnPackTo(ScalarStuffT _o) {
    _o.JustI8 = this.JustI8;
    _o.MaybeI8 = this.MaybeI8;
    _o.DefaultI8 = this.DefaultI8;
    _o.JustU8 = this.JustU8;
    _o.MaybeU8 = this.MaybeU8;
    _o.DefaultU8 = this.DefaultU8;
    _o.JustI16 = this.JustI16;
    _o.MaybeI16 = this.MaybeI16;
    _o.DefaultI16 = this.DefaultI16;
    _o.JustU16 = this.JustU16;
    _o.MaybeU16 = this.MaybeU16;
    _o.DefaultU16 = this.DefaultU16;
    _o.JustI32 = this.JustI32;
    _o.MaybeI32 = this.MaybeI32;
    _o.DefaultI32 = this.DefaultI32;
    _o.JustU32 = this.JustU32;
    _o.MaybeU32 = this.MaybeU32;
    _o.DefaultU32 = this.DefaultU32;
    _o.JustI64 = this.JustI64;
    _o.MaybeI64 = this.MaybeI64;
    _o.DefaultI64 = this.DefaultI64;
    _o.JustU64 = this.JustU64;
    _o.MaybeU64 = this.MaybeU64;
    _o.DefaultU64 = this.DefaultU64;
    _o.JustF32 = this.JustF32;
    _o.MaybeF32 = this.MaybeF32;
    _o.DefaultF32 = this.DefaultF32;
    _o.JustF64 = this.JustF64;
    _o.MaybeF64 = this.MaybeF64;
    _o.DefaultF64 = this.DefaultF64;
    _o.JustBool = this.JustBool;
    _o.MaybeBool = this.MaybeBool;
    _o.DefaultBool = this.DefaultBool;
    _o.JustEnum = this.JustEnum;
    _o.MaybeEnum = this.MaybeEnum;
    _o.DefaultEnum = this.DefaultEnum;
  }
  public static Offset<optional_scalars.ScalarStuff> Pack(FlatBufferBuilder builder, ScalarStuffT _o) {
    if (_o == null) return default(Offset<optional_scalars.ScalarStuff>);
    return CreateScalarStuff(
      builder,
      _o.JustI8,
      _o.MaybeI8,
      _o.DefaultI8,
      _o.JustU8,
      _o.MaybeU8,
      _o.DefaultU8,
      _o.JustI16,
      _o.MaybeI16,
      _o.DefaultI16,
      _o.JustU16,
      _o.MaybeU16,
      _o.DefaultU16,
      _o.JustI32,
      _o.MaybeI32,
      _o.DefaultI32,
      _o.JustU32,
      _o.MaybeU32,
      _o.DefaultU32,
      _o.JustI64,
      _o.MaybeI64,
      _o.DefaultI64,
      _o.JustU64,
      _o.MaybeU64,
      _o.DefaultU64,
      _o.JustF32,
      _o.MaybeF32,
      _o.DefaultF32,
      _o.JustF64,
      _o.MaybeF64,
      _o.DefaultF64,
      _o.JustBool,
      _o.MaybeBool,
      _o.DefaultBool,
      _o.JustEnum,
      _o.MaybeEnum,
      _o.DefaultEnum);
  }
}

public class ScalarStuffT
{
  public sbyte JustI8 { get; set; }
  public sbyte? MaybeI8 { get; set; }
  public sbyte DefaultI8 { get; set; }
  public byte JustU8 { get; set; }
  public byte? MaybeU8 { get; set; }
  public byte DefaultU8 { get; set; }
  public short JustI16 { get; set; }
  public short? MaybeI16 { get; set; }
  public short DefaultI16 { get; set; }
  public ushort JustU16 { get; set; }
  public ushort? MaybeU16 { get; set; }
  public ushort DefaultU16 { get; set; }
  public int JustI32 { get; set; }
  public int? MaybeI32 { get; set; }
  public int DefaultI32 { get; set; }
  public uint JustU32 { get; set; }
  public uint? MaybeU32 { get; set; }
  public uint DefaultU32 { get; set; }
  public long JustI64 { get; set; }
  public long? MaybeI64 { get; set; }
  public long DefaultI64 { get; set; }
  public ulong JustU64 { get; set; }
  public ulong? MaybeU64 { get; set; }
  public ulong DefaultU64 { get; set; }
  public float JustF32 { get; set; }
  public float? MaybeF32 { get; set; }
  public float DefaultF32 { get; set; }
  public double JustF64 { get; set; }
  public double? MaybeF64 { get; set; }
  public double DefaultF64 { get; set; }
  public bool JustBool { get; set; }
  public bool? MaybeBool { get; set; }
  public bool DefaultBool { get; set; }
  public optional_scalars.OptionalByte JustEnum { get; set; }
  public optional_scalars.OptionalByte? MaybeEnum { get; set; }
  public optional_scalars.OptionalByte DefaultEnum { get; set; }

  public ScalarStuffT() {
    this.JustI8 = 0;
    this.MaybeI8 = null;
    this.DefaultI8 = 42;
    this.JustU8 = 0;
    this.MaybeU8 = null;
    this.DefaultU8 = 42;
    this.JustI16 = 0;
    this.MaybeI16 = null;
    this.DefaultI16 = 42;
    this.JustU16 = 0;
    this.MaybeU16 = null;
    this.DefaultU16 = 42;
    this.JustI32 = 0;
    this.MaybeI32 = null;
    this.DefaultI32 = 42;
    this.JustU32 = 0;
    this.MaybeU32 = null;
    this.DefaultU32 = 42;
    this.JustI64 = 0;
    this.MaybeI64 = null;
    this.DefaultI64 = 42;
    this.JustU64 = 0;
    this.MaybeU64 = null;
    this.DefaultU64 = 42;
    this.JustF32 = 0.0f;
    this.MaybeF32 = null;
    this.DefaultF32 = 42.0f;
    this.JustF64 = 0.0;
    this.MaybeF64 = null;
    this.DefaultF64 = 42.0;
    this.JustBool = false;
    this.MaybeBool = null;
    this.DefaultBool = true;
    this.JustEnum = optional_scalars.OptionalByte.None;
    this.MaybeEnum = null;
    this.DefaultEnum = optional_scalars.OptionalByte.One;
  }
  public static ScalarStuffT DeserializeFromBinary(byte[] fbBuffer) {
    return ScalarStuff.GetRootAsScalarStuff(new ByteBuffer(fbBuffer)).UnPack();
  }
  public byte[] SerializeToBinary() {
    var fbb = new FlatBufferBuilder(0x10000);
    ScalarStuff.FinishScalarStuffBuffer(fbb, ScalarStuff.Pack(fbb, this));
    return fbb.DataBuffer.ToSizedArray();
  }
}


}
