// <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_24_3_6(); }
  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 static bool VerifyScalarStuff(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer("NULL", false, ScalarStuffVerify.Verify); }
  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();
  }
}


static public class ScalarStuffVerify
{
  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)
  {
    return verifier.VerifyTableStart(tablePos)
      && verifier.VerifyField(tablePos, 4 /*JustI8*/, 1 /*sbyte*/, 1, false)
      && verifier.VerifyField(tablePos, 6 /*MaybeI8*/, 1 /*sbyte*/, 1, false)
      && verifier.VerifyField(tablePos, 8 /*DefaultI8*/, 1 /*sbyte*/, 1, false)
      && verifier.VerifyField(tablePos, 10 /*JustU8*/, 1 /*byte*/, 1, false)
      && verifier.VerifyField(tablePos, 12 /*MaybeU8*/, 1 /*byte*/, 1, false)
      && verifier.VerifyField(tablePos, 14 /*DefaultU8*/, 1 /*byte*/, 1, false)
      && verifier.VerifyField(tablePos, 16 /*JustI16*/, 2 /*short*/, 2, false)
      && verifier.VerifyField(tablePos, 18 /*MaybeI16*/, 2 /*short*/, 2, false)
      && verifier.VerifyField(tablePos, 20 /*DefaultI16*/, 2 /*short*/, 2, false)
      && verifier.VerifyField(tablePos, 22 /*JustU16*/, 2 /*ushort*/, 2, false)
      && verifier.VerifyField(tablePos, 24 /*MaybeU16*/, 2 /*ushort*/, 2, false)
      && verifier.VerifyField(tablePos, 26 /*DefaultU16*/, 2 /*ushort*/, 2, false)
      && verifier.VerifyField(tablePos, 28 /*JustI32*/, 4 /*int*/, 4, false)
      && verifier.VerifyField(tablePos, 30 /*MaybeI32*/, 4 /*int*/, 4, false)
      && verifier.VerifyField(tablePos, 32 /*DefaultI32*/, 4 /*int*/, 4, false)
      && verifier.VerifyField(tablePos, 34 /*JustU32*/, 4 /*uint*/, 4, false)
      && verifier.VerifyField(tablePos, 36 /*MaybeU32*/, 4 /*uint*/, 4, false)
      && verifier.VerifyField(tablePos, 38 /*DefaultU32*/, 4 /*uint*/, 4, false)
      && verifier.VerifyField(tablePos, 40 /*JustI64*/, 8 /*long*/, 8, false)
      && verifier.VerifyField(tablePos, 42 /*MaybeI64*/, 8 /*long*/, 8, false)
      && verifier.VerifyField(tablePos, 44 /*DefaultI64*/, 8 /*long*/, 8, false)
      && verifier.VerifyField(tablePos, 46 /*JustU64*/, 8 /*ulong*/, 8, false)
      && verifier.VerifyField(tablePos, 48 /*MaybeU64*/, 8 /*ulong*/, 8, false)
      && verifier.VerifyField(tablePos, 50 /*DefaultU64*/, 8 /*ulong*/, 8, false)
      && verifier.VerifyField(tablePos, 52 /*JustF32*/, 4 /*float*/, 4, false)
      && verifier.VerifyField(tablePos, 54 /*MaybeF32*/, 4 /*float*/, 4, false)
      && verifier.VerifyField(tablePos, 56 /*DefaultF32*/, 4 /*float*/, 4, false)
      && verifier.VerifyField(tablePos, 58 /*JustF64*/, 8 /*double*/, 8, false)
      && verifier.VerifyField(tablePos, 60 /*MaybeF64*/, 8 /*double*/, 8, false)
      && verifier.VerifyField(tablePos, 62 /*DefaultF64*/, 8 /*double*/, 8, false)
      && verifier.VerifyField(tablePos, 64 /*JustBool*/, 1 /*bool*/, 1, false)
      && verifier.VerifyField(tablePos, 66 /*MaybeBool*/, 1 /*bool*/, 1, false)
      && verifier.VerifyField(tablePos, 68 /*DefaultBool*/, 1 /*bool*/, 1, false)
      && verifier.VerifyField(tablePos, 70 /*JustEnum*/, 1 /*optional_scalars.OptionalByte*/, 1, false)
      && verifier.VerifyField(tablePos, 72 /*MaybeEnum*/, 1 /*optional_scalars.OptionalByte*/, 1, false)
      && verifier.VerifyField(tablePos, 74 /*DefaultEnum*/, 1 /*optional_scalars.OptionalByte*/, 1, false)
      && verifier.VerifyTableEnd(tablePos);
  }
}

}
