// automatically generated by the FlatBuffers compiler, do not modify
// swiftlint:disable all
// swiftformat:disable all

import FlatBuffers

///  Composite components of Monster color.
public enum MyGame_Example_Color: UInt8, Enum, Verifiable {
  public typealias T = UInt8
  public static var byteSize: Int { return MemoryLayout<UInt8>.size }
  public var value: UInt8 { return self.rawValue }
  case red = 1
  ///  \brief color Green
  ///  Green is bit_flag with value (1u << 1)
  case green = 2
  ///  \brief color Blue (1u << 3)
  case blue = 8

  public static var max: MyGame_Example_Color { return .blue }
  public static var min: MyGame_Example_Color { return .red }
}

extension MyGame_Example_Color: Encodable {
  public func encode(to encoder: Encoder) throws {
    var container = encoder.singleValueContainer()
    switch self {
    case .red: try container.encode("Red")
    case .green: try container.encode("Green")
    case .blue: try container.encode("Blue")
    }
  }
}

public enum MyGame_Example_Race: Int8, Enum, Verifiable {
  public typealias T = Int8
  public static var byteSize: Int { return MemoryLayout<Int8>.size }
  public var value: Int8 { return self.rawValue }
  case none_ = -1
  case human = 0
  case dwarf = 1
  case elf = 2

  public static var max: MyGame_Example_Race { return .elf }
  public static var min: MyGame_Example_Race { return .none_ }
}

extension MyGame_Example_Race: Encodable {
  public func encode(to encoder: Encoder) throws {
    var container = encoder.singleValueContainer()
    switch self {
    case .none_: try container.encode("None")
    case .human: try container.encode("Human")
    case .dwarf: try container.encode("Dwarf")
    case .elf: try container.encode("Elf")
    }
  }
}

public enum MyGame_Example_LongEnum: UInt64, Enum, Verifiable {
  public typealias T = UInt64
  public static var byteSize: Int { return MemoryLayout<UInt64>.size }
  public var value: UInt64 { return self.rawValue }
  case longone = 2
  case longtwo = 4
  case longbig = 1099511627776

  public static var max: MyGame_Example_LongEnum { return .longbig }
  public static var min: MyGame_Example_LongEnum { return .longone }
}

extension MyGame_Example_LongEnum: Encodable {
  public func encode(to encoder: Encoder) throws {
    var container = encoder.singleValueContainer()
    switch self {
    case .longone: try container.encode("LongOne")
    case .longtwo: try container.encode("LongTwo")
    case .longbig: try container.encode("LongBig")
    }
  }
}

public enum MyGame_Example_Any_: UInt8, UnionEnum {
  public typealias T = UInt8

  public init?(value: T) {
    self.init(rawValue: value)
  }

  public static var byteSize: Int { return MemoryLayout<UInt8>.size }
  public var value: UInt8 { return self.rawValue }
  case none_ = 0
  case monster = 1
  case testsimpletablewithenum = 2
  case mygameExample2Monster = 3

  public static var max: MyGame_Example_Any_ { return .mygameExample2Monster }
  public static var min: MyGame_Example_Any_ { return .none_ }
}

extension MyGame_Example_Any_: Encodable {
  public func encode(to encoder: Encoder) throws {
    var container = encoder.singleValueContainer()
    switch self {
    case .none_: try container.encode("NONE")
    case .monster: try container.encode("Monster")
    case .testsimpletablewithenum: try container.encode("TestSimpleTableWithEnum")
    case .mygameExample2Monster: try container.encode("MyGame_Example2_Monster")
    }
  }
}

public struct MyGame_Example_Any_Union {
  public var type: MyGame_Example_Any_
  public var value: NativeObject?
  public init(_ v: NativeObject?, type: MyGame_Example_Any_) {
    self.type = type
    self.value = v
  }
  public func pack(builder: inout FlatBufferBuilder) -> Offset {
    switch type {
    case .monster:
      var __obj = value as? MyGame_Example_MonsterT
      return MyGame_Example_Monster.pack(&builder, obj: &__obj)
    case .testsimpletablewithenum:
      var __obj = value as? MyGame_Example_TestSimpleTableWithEnumT
      return MyGame_Example_TestSimpleTableWithEnum.pack(&builder, obj: &__obj)
    case .mygameExample2Monster:
      var __obj = value as? MyGame_Example2_MonsterT
      return MyGame_Example2_Monster.pack(&builder, obj: &__obj)
    default: return Offset()
    }
  }
}
public enum MyGame_Example_AnyUniqueAliases: UInt8, UnionEnum {
  public typealias T = UInt8

  public init?(value: T) {
    self.init(rawValue: value)
  }

  public static var byteSize: Int { return MemoryLayout<UInt8>.size }
  public var value: UInt8 { return self.rawValue }
  case none_ = 0
  case m = 1
  case ts = 2
  case m2 = 3

  public static var max: MyGame_Example_AnyUniqueAliases { return .m2 }
  public static var min: MyGame_Example_AnyUniqueAliases { return .none_ }
}

extension MyGame_Example_AnyUniqueAliases: Encodable {
  public func encode(to encoder: Encoder) throws {
    var container = encoder.singleValueContainer()
    switch self {
    case .none_: try container.encode("NONE")
    case .m: try container.encode("M")
    case .ts: try container.encode("TS")
    case .m2: try container.encode("M2")
    }
  }
}

public struct MyGame_Example_AnyUniqueAliasesUnion {
  public var type: MyGame_Example_AnyUniqueAliases
  public var value: NativeObject?
  public init(_ v: NativeObject?, type: MyGame_Example_AnyUniqueAliases) {
    self.type = type
    self.value = v
  }
  public func pack(builder: inout FlatBufferBuilder) -> Offset {
    switch type {
    case .m:
      var __obj = value as? MyGame_Example_MonsterT
      return MyGame_Example_Monster.pack(&builder, obj: &__obj)
    case .ts:
      var __obj = value as? MyGame_Example_TestSimpleTableWithEnumT
      return MyGame_Example_TestSimpleTableWithEnum.pack(&builder, obj: &__obj)
    case .m2:
      var __obj = value as? MyGame_Example2_MonsterT
      return MyGame_Example2_Monster.pack(&builder, obj: &__obj)
    default: return Offset()
    }
  }
}
public enum MyGame_Example_AnyAmbiguousAliases: UInt8, UnionEnum {
  public typealias T = UInt8

  public init?(value: T) {
    self.init(rawValue: value)
  }

  public static var byteSize: Int { return MemoryLayout<UInt8>.size }
  public var value: UInt8 { return self.rawValue }
  case none_ = 0
  case m1 = 1
  case m2 = 2
  case m3 = 3

  public static var max: MyGame_Example_AnyAmbiguousAliases { return .m3 }
  public static var min: MyGame_Example_AnyAmbiguousAliases { return .none_ }
}

extension MyGame_Example_AnyAmbiguousAliases: Encodable {
  public func encode(to encoder: Encoder) throws {
    var container = encoder.singleValueContainer()
    switch self {
    case .none_: try container.encode("NONE")
    case .m1: try container.encode("M1")
    case .m2: try container.encode("M2")
    case .m3: try container.encode("M3")
    }
  }
}

public struct MyGame_Example_AnyAmbiguousAliasesUnion {
  public var type: MyGame_Example_AnyAmbiguousAliases
  public var value: NativeObject?
  public init(_ v: NativeObject?, type: MyGame_Example_AnyAmbiguousAliases) {
    self.type = type
    self.value = v
  }
  public func pack(builder: inout FlatBufferBuilder) -> Offset {
    switch type {
    case .m1:
      var __obj = value as? MyGame_Example_MonsterT
      return MyGame_Example_Monster.pack(&builder, obj: &__obj)
    case .m2:
      var __obj = value as? MyGame_Example_MonsterT
      return MyGame_Example_Monster.pack(&builder, obj: &__obj)
    case .m3:
      var __obj = value as? MyGame_Example_MonsterT
      return MyGame_Example_Monster.pack(&builder, obj: &__obj)
    default: return Offset()
    }
  }
}
public struct MyGame_Example_Test: NativeStruct, Verifiable, FlatbuffersInitializable, NativeObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }

  private var _a: Int16
  private var _b: Int8
  private let padding0__: UInt8 = 0

  public init(_ bb: ByteBuffer, o: Int32) {
    let _accessor = Struct(bb: bb, position: o)
    _a = _accessor.readBuffer(of: Int16.self, at: 0)
    _b = _accessor.readBuffer(of: Int8.self, at: 2)
  }

  public init(a: Int16, b: Int8) {
    _a = a
    _b = b
  }

  public init() {
    _a = 0
    _b = 0
  }

  public init(_ _t: inout MyGame_Example_Test_Mutable) {
    _a = _t.a
    _b = _t.b
  }

  public var a: Int16 { _a }
  public var b: Int8 { _b }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    try verifier.inBuffer(position: position, of: MyGame_Example_Test.self)
  }
}

extension MyGame_Example_Test: Encodable {

  enum CodingKeys: String, CodingKey {
    case a = "a"
    case b = "b"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    if a != 0 {
      try container.encodeIfPresent(a, forKey: .a)
    }
    if b != 0 {
      try container.encodeIfPresent(b, forKey: .b)
    }
  }
}

public struct MyGame_Example_Test_Mutable: FlatBufferObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Struct

  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }

  public var a: Int16 { return _accessor.readBuffer(of: Int16.self, at: 0) }
  @discardableResult public func mutate(a: Int16) -> Bool { return _accessor.mutate(a, index: 0) }
  public var b: Int8 { return _accessor.readBuffer(of: Int8.self, at: 2) }
  @discardableResult public func mutate(b: Int8) -> Bool { return _accessor.mutate(b, index: 2) }
  

  public mutating func unpack() -> MyGame_Example_Test {
    return MyGame_Example_Test(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Test?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Test) -> Offset {
    return builder.create(struct: obj)
  }
}

public struct MyGame_Example_Vec3: NativeStruct, Verifiable, FlatbuffersInitializable, NativeObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }

  private var _x: Float32
  private var _y: Float32
  private var _z: Float32
  private let padding0__: UInt32 = 0
  private var _test1: Double
  private var _test2: UInt8
  private let padding1__: UInt8 = 0
  private var _test3: MyGame_Example_Test
  private let padding2__: UInt16 = 0

  public init(_ bb: ByteBuffer, o: Int32) {
    let _accessor = Struct(bb: bb, position: o)
    _x = _accessor.readBuffer(of: Float32.self, at: 0)
    _y = _accessor.readBuffer(of: Float32.self, at: 4)
    _z = _accessor.readBuffer(of: Float32.self, at: 8)
    _test1 = _accessor.readBuffer(of: Double.self, at: 16)
    _test2 = _accessor.readBuffer(of: UInt8.self, at: 24)
    _test3 = MyGame_Example_Test(_accessor.bb, o: _accessor.postion + 26)
  }

  public init(x: Float32, y: Float32, z: Float32, test1: Double, test2: MyGame_Example_Color, test3: MyGame_Example_Test) {
    _x = x
    _y = y
    _z = z
    _test1 = test1
    _test2 = test2.value
    _test3 = test3
  }

  public init() {
    _x = 0.0
    _y = 0.0
    _z = 0.0
    _test1 = 0.0
    _test2 = 0
    _test3 = MyGame_Example_Test()
  }

  public init(_ _t: inout MyGame_Example_Vec3_Mutable) {
    _x = _t.x
    _y = _t.y
    _z = _t.z
    _test1 = _t.test1
    _test2 = _t.test2.value
    var _vtest3 = _t.test3
    _test3 = _vtest3.unpack()
  }

  public var x: Float32 { _x }
  public var y: Float32 { _y }
  public var z: Float32 { _z }
  public var test1: Double { _test1 }
  public var test2: MyGame_Example_Color { MyGame_Example_Color(rawValue: _test2)! }
  public var test3: MyGame_Example_Test { _test3 }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    try verifier.inBuffer(position: position, of: MyGame_Example_Vec3.self)
  }
}

extension MyGame_Example_Vec3: Encodable {

  enum CodingKeys: String, CodingKey {
    case x = "x"
    case y = "y"
    case z = "z"
    case test1 = "test1"
    case test2 = "test2"
    case test3 = "test3"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    if x != 0.0 {
      try container.encodeIfPresent(x, forKey: .x)
    }
    if y != 0.0 {
      try container.encodeIfPresent(y, forKey: .y)
    }
    if z != 0.0 {
      try container.encodeIfPresent(z, forKey: .z)
    }
    if test1 != 0.0 {
      try container.encodeIfPresent(test1, forKey: .test1)
    }
    if test2 != .red {
      try container.encodeIfPresent(test2, forKey: .test2)
    }
    try container.encodeIfPresent(test3, forKey: .test3)
  }
}

public struct MyGame_Example_Vec3_Mutable: FlatBufferObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Struct

  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }

  public var x: Float32 { return _accessor.readBuffer(of: Float32.self, at: 0) }
  @discardableResult public func mutate(x: Float32) -> Bool { return _accessor.mutate(x, index: 0) }
  public var y: Float32 { return _accessor.readBuffer(of: Float32.self, at: 4) }
  @discardableResult public func mutate(y: Float32) -> Bool { return _accessor.mutate(y, index: 4) }
  public var z: Float32 { return _accessor.readBuffer(of: Float32.self, at: 8) }
  @discardableResult public func mutate(z: Float32) -> Bool { return _accessor.mutate(z, index: 8) }
  public var test1: Double { return _accessor.readBuffer(of: Double.self, at: 16) }
  @discardableResult public func mutate(test1: Double) -> Bool { return _accessor.mutate(test1, index: 16) }
  public var test2: MyGame_Example_Color { return MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: 24)) ?? .red }
  @discardableResult public func mutate(test2: MyGame_Example_Color) -> Bool { return _accessor.mutate(test2.rawValue, index: 24) }
  public var test3: MyGame_Example_Test_Mutable { return MyGame_Example_Test_Mutable(_accessor.bb, o: _accessor.postion + 26) }
  

  public mutating func unpack() -> MyGame_Example_Vec3 {
    return MyGame_Example_Vec3(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Vec3?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Vec3) -> Offset {
    return builder.create(struct: obj)
  }
}

public struct MyGame_Example_Ability: NativeStruct, Verifiable, FlatbuffersInitializable, NativeObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }

  private var _id: UInt32
  private var _distance: UInt32

  public init(_ bb: ByteBuffer, o: Int32) {
    let _accessor = Struct(bb: bb, position: o)
    _id = _accessor.readBuffer(of: UInt32.self, at: 0)
    _distance = _accessor.readBuffer(of: UInt32.self, at: 4)
  }

  public init(id: UInt32, distance: UInt32) {
    _id = id
    _distance = distance
  }

  public init() {
    _id = 0
    _distance = 0
  }

  public init(_ _t: inout MyGame_Example_Ability_Mutable) {
    _id = _t.id
    _distance = _t.distance
  }

  public var id: UInt32 { _id }
  public var distance: UInt32 { _distance }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    try verifier.inBuffer(position: position, of: MyGame_Example_Ability.self)
  }
}

extension MyGame_Example_Ability: Encodable {

  enum CodingKeys: String, CodingKey {
    case id = "id"
    case distance = "distance"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    if id != 0 {
      try container.encodeIfPresent(id, forKey: .id)
    }
    if distance != 0 {
      try container.encodeIfPresent(distance, forKey: .distance)
    }
  }
}

public struct MyGame_Example_Ability_Mutable: FlatBufferObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Struct

  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }

  public var id: UInt32 { return _accessor.readBuffer(of: UInt32.self, at: 0) }
  @discardableResult public func mutate(id: UInt32) -> Bool { return _accessor.mutate(id, index: 0) }
  public var distance: UInt32 { return _accessor.readBuffer(of: UInt32.self, at: 4) }
  @discardableResult public func mutate(distance: UInt32) -> Bool { return _accessor.mutate(distance, index: 4) }
  

  public mutating func unpack() -> MyGame_Example_Ability {
    return MyGame_Example_Ability(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Ability?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Ability) -> Offset {
    return builder.create(struct: obj)
  }
}

public struct MyGame_Example_StructOfStructs: NativeStruct, Verifiable, FlatbuffersInitializable, NativeObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }

  private var _a: MyGame_Example_Ability
  private var _b: MyGame_Example_Test
  private var _c: MyGame_Example_Ability

  public init(_ bb: ByteBuffer, o: Int32) {
    let _accessor = Struct(bb: bb, position: o)
    _a = MyGame_Example_Ability(_accessor.bb, o: _accessor.postion + 0)
    _b = MyGame_Example_Test(_accessor.bb, o: _accessor.postion + 8)
    _c = MyGame_Example_Ability(_accessor.bb, o: _accessor.postion + 12)
  }

  public init(a: MyGame_Example_Ability, b: MyGame_Example_Test, c: MyGame_Example_Ability) {
    _a = a
    _b = b
    _c = c
  }

  public init() {
    _a = MyGame_Example_Ability()
    _b = MyGame_Example_Test()
    _c = MyGame_Example_Ability()
  }

  public init(_ _t: inout MyGame_Example_StructOfStructs_Mutable) {
    var _va = _t.a
    _a = _va.unpack()
    var _vb = _t.b
    _b = _vb.unpack()
    var _vc = _t.c
    _c = _vc.unpack()
  }

  public var a: MyGame_Example_Ability { _a }
  public var b: MyGame_Example_Test { _b }
  public var c: MyGame_Example_Ability { _c }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    try verifier.inBuffer(position: position, of: MyGame_Example_StructOfStructs.self)
  }
}

extension MyGame_Example_StructOfStructs: Encodable {

  enum CodingKeys: String, CodingKey {
    case a = "a"
    case b = "b"
    case c = "c"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encodeIfPresent(a, forKey: .a)
    try container.encodeIfPresent(b, forKey: .b)
    try container.encodeIfPresent(c, forKey: .c)
  }
}

public struct MyGame_Example_StructOfStructs_Mutable: FlatBufferObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Struct

  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }

  public var a: MyGame_Example_Ability_Mutable { return MyGame_Example_Ability_Mutable(_accessor.bb, o: _accessor.postion + 0) }
  public var b: MyGame_Example_Test_Mutable { return MyGame_Example_Test_Mutable(_accessor.bb, o: _accessor.postion + 8) }
  public var c: MyGame_Example_Ability_Mutable { return MyGame_Example_Ability_Mutable(_accessor.bb, o: _accessor.postion + 12) }
  

  public mutating func unpack() -> MyGame_Example_StructOfStructs {
    return MyGame_Example_StructOfStructs(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructs?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructs) -> Offset {
    return builder.create(struct: obj)
  }
}

public struct MyGame_Example_StructOfStructsOfStructs: NativeStruct, Verifiable, FlatbuffersInitializable, NativeObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }

  private var _a: MyGame_Example_StructOfStructs

  public init(_ bb: ByteBuffer, o: Int32) {
    let _accessor = Struct(bb: bb, position: o)
    _a = MyGame_Example_StructOfStructs(_accessor.bb, o: _accessor.postion + 0)
  }

  public init(a: MyGame_Example_StructOfStructs) {
    _a = a
  }

  public init() {
    _a = MyGame_Example_StructOfStructs()
  }

  public init(_ _t: inout MyGame_Example_StructOfStructsOfStructs_Mutable) {
    var _va = _t.a
    _a = _va.unpack()
  }

  public var a: MyGame_Example_StructOfStructs { _a }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    try verifier.inBuffer(position: position, of: MyGame_Example_StructOfStructsOfStructs.self)
  }
}

extension MyGame_Example_StructOfStructsOfStructs: Encodable {

  enum CodingKeys: String, CodingKey {
    case a = "a"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encodeIfPresent(a, forKey: .a)
  }
}

public struct MyGame_Example_StructOfStructsOfStructs_Mutable: FlatBufferObject {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Struct

  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }

  public var a: MyGame_Example_StructOfStructs_Mutable { return MyGame_Example_StructOfStructs_Mutable(_accessor.bb, o: _accessor.postion + 0) }
  

  public mutating func unpack() -> MyGame_Example_StructOfStructsOfStructs {
    return MyGame_Example_StructOfStructsOfStructs(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructsOfStructs?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructsOfStructs) -> Offset {
    return builder.create(struct: obj)
  }
}

public struct MyGame_InParentNamespace: FlatBufferObject, Verifiable, ObjectAPIPacker {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Table

  public static var id: String { "MONS" } 
  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_InParentNamespace.id, addPrefix: prefix) }
  private init(_ t: Table) { _accessor = t }
  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }

  public static func startInParentNamespace(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 0) }
  public static func endInParentNamespace(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
  

  public mutating func unpack() -> MyGame_InParentNamespaceT {
    return MyGame_InParentNamespaceT(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_InParentNamespaceT?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_InParentNamespaceT) -> Offset {
    let __root = MyGame_InParentNamespace.startInParentNamespace(&builder)
    return MyGame_InParentNamespace.endInParentNamespace(&builder, start: __root)
  }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    var _v = try verifier.visitTable(at: position)
    _v.finish()
  }
}

extension MyGame_InParentNamespace: Encodable {

  public func encode(to encoder: Encoder) throws {
  }
}

public class MyGame_InParentNamespaceT: NativeObject {


  public init(_ _t: inout MyGame_InParentNamespace) {
  }

  public init() {
  }

  public func serialize() -> ByteBuffer { return serialize(type: MyGame_InParentNamespace.self) }

}
public struct MyGame_Example2_Monster: FlatBufferObject, Verifiable, ObjectAPIPacker {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Table

  public static var id: String { "MONS" } 
  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example2_Monster.id, addPrefix: prefix) }
  private init(_ t: Table) { _accessor = t }
  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }

  public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 0) }
  public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
  

  public mutating func unpack() -> MyGame_Example2_MonsterT {
    return MyGame_Example2_MonsterT(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example2_MonsterT?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example2_MonsterT) -> Offset {
    let __root = MyGame_Example2_Monster.startMonster(&builder)
    return MyGame_Example2_Monster.endMonster(&builder, start: __root)
  }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    var _v = try verifier.visitTable(at: position)
    _v.finish()
  }
}

extension MyGame_Example2_Monster: Encodable {

  public func encode(to encoder: Encoder) throws {
  }
}

public class MyGame_Example2_MonsterT: NativeObject {


  public init(_ _t: inout MyGame_Example2_Monster) {
  }

  public init() {
  }

  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example2_Monster.self) }

}
internal struct MyGame_Example_TestSimpleTableWithEnum: FlatBufferObject, Verifiable, ObjectAPIPacker {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  internal var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Table

  internal static var id: String { "MONS" } 
  internal static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_TestSimpleTableWithEnum.id, addPrefix: prefix) }
  private init(_ t: Table) { _accessor = t }
  internal init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }

  private enum VTOFFSET: VOffset {
    case color = 4
    var v: Int32 { Int32(self.rawValue) }
    var p: VOffset { self.rawValue }
  }

  internal var color: MyGame_Example_Color { let o = _accessor.offset(VTOFFSET.color.v); return o == 0 ? .green : MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .green }
  @discardableResult internal func mutate(color: MyGame_Example_Color) -> Bool {let o = _accessor.offset(VTOFFSET.color.v);  return _accessor.mutate(color.rawValue, index: o) }
  internal static func startTestSimpleTableWithEnum(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
  internal static func add(color: MyGame_Example_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 2, at: VTOFFSET.color.p) }
  internal static func endTestSimpleTableWithEnum(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
  internal static func createTestSimpleTableWithEnum(
    _ fbb: inout FlatBufferBuilder,
    color: MyGame_Example_Color = .green
  ) -> Offset {
    let __start = MyGame_Example_TestSimpleTableWithEnum.startTestSimpleTableWithEnum(&fbb)
    MyGame_Example_TestSimpleTableWithEnum.add(color: color, &fbb)
    return MyGame_Example_TestSimpleTableWithEnum.endTestSimpleTableWithEnum(&fbb, start: __start)
  }
  

  internal mutating func unpack() -> MyGame_Example_TestSimpleTableWithEnumT {
    return MyGame_Example_TestSimpleTableWithEnumT(&self)
  }
  internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestSimpleTableWithEnumT?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestSimpleTableWithEnumT) -> Offset {
    let __root = MyGame_Example_TestSimpleTableWithEnum.startTestSimpleTableWithEnum(&builder)
    MyGame_Example_TestSimpleTableWithEnum.add(color: obj.color, &builder)
    return MyGame_Example_TestSimpleTableWithEnum.endTestSimpleTableWithEnum(&builder, start: __root)
  }

  internal static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    var _v = try verifier.visitTable(at: position)
    try _v.visit(field: VTOFFSET.color.p, fieldName: "color", required: false, type: MyGame_Example_Color.self)
    _v.finish()
  }
}

extension MyGame_Example_TestSimpleTableWithEnum: Encodable {

  enum CodingKeys: String, CodingKey {
    case color = "color"
  }
  internal func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    if color != .green {
      try container.encodeIfPresent(color, forKey: .color)
    }
  }
}

internal class MyGame_Example_TestSimpleTableWithEnumT: NativeObject {

  internal var color: MyGame_Example_Color

  internal init(_ _t: inout MyGame_Example_TestSimpleTableWithEnum) {
    color = _t.color
  }

  internal init() {
    color = .green
  }

  internal func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_TestSimpleTableWithEnum.self) }

}
public struct MyGame_Example_Stat: FlatBufferObject, Verifiable, ObjectAPIPacker {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Table

  public static var id: String { "MONS" } 
  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Stat.id, addPrefix: prefix) }
  private init(_ t: Table) { _accessor = t }
  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }

  private enum VTOFFSET: VOffset {
    case id = 4
    case val = 6
    case count = 8
    var v: Int32 { Int32(self.rawValue) }
    var p: VOffset { self.rawValue }
  }

  public var id: String? { let o = _accessor.offset(VTOFFSET.id.v); return o == 0 ? nil : _accessor.string(at: o) }
  public var idSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.id.v) }
  public var val: Int64 { let o = _accessor.offset(VTOFFSET.val.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
  @discardableResult public func mutate(val: Int64) -> Bool {let o = _accessor.offset(VTOFFSET.val.v);  return _accessor.mutate(val, index: o) }
  public var count: UInt16 { let o = _accessor.offset(VTOFFSET.count.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }
  @discardableResult public func mutate(count: UInt16) -> Bool {let o = _accessor.offset(VTOFFSET.count.v);  return _accessor.mutate(count, index: o) }
  public static func startStat(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 3) }
  public static func add(id: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: id, at: VTOFFSET.id.p) }
  public static func add(val: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: val, def: 0, at: VTOFFSET.val.p) }
  public static func add(count: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: count, def: 0, at: VTOFFSET.count.p) }
  public static func endStat(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
  public static func createStat(
    _ fbb: inout FlatBufferBuilder,
    idOffset id: Offset = Offset(),
    val: Int64 = 0,
    count: UInt16 = 0
  ) -> Offset {
    let __start = MyGame_Example_Stat.startStat(&fbb)
    MyGame_Example_Stat.add(id: id, &fbb)
    MyGame_Example_Stat.add(val: val, &fbb)
    MyGame_Example_Stat.add(count: count, &fbb)
    return MyGame_Example_Stat.endStat(&fbb, start: __start)
  }
  public static func sortVectorOfStat(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {
    var off = offsets
    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 8, fbb: fbb.buffer), Table.offset(Int32($0.o), vOffset: 8, fbb: fbb.buffer), fbb: fbb.buffer) < 0 } 
    return fbb.createVector(ofOffsets: off)
  }
  fileprivate static func lookupByKey(vector: Int32, key: UInt16, fbb: ByteBuffer) -> MyGame_Example_Stat? {
    var span = fbb.read(def: Int32.self, position: Int(vector - 4))
    var start: Int32 = 0
    while span != 0 {
      var middle = span / 2
      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)
      let comp = fbb.read(def: UInt16.self, position: Int(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 8, fbb: fbb)))
      if comp > 0 {
        span = middle
      } else if comp < 0 {
        middle += 1
        start += middle
        span -= middle
      } else {
        return MyGame_Example_Stat(fbb, o: tableOffset)
      }
    }
    return nil
  }
  

  public mutating func unpack() -> MyGame_Example_StatT {
    return MyGame_Example_StatT(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StatT?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StatT) -> Offset {
    let __id: Offset
    if let s = obj.id {
      __id = builder.create(string: s)
    } else {
      __id = Offset()
    }

    let __root = MyGame_Example_Stat.startStat(&builder)
    MyGame_Example_Stat.add(id: __id, &builder)
    MyGame_Example_Stat.add(val: obj.val, &builder)
    MyGame_Example_Stat.add(count: obj.count, &builder)
    return MyGame_Example_Stat.endStat(&builder, start: __root)
  }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    var _v = try verifier.visitTable(at: position)
    try _v.visit(field: VTOFFSET.id.p, fieldName: "id", required: false, type: ForwardOffset<String>.self)
    try _v.visit(field: VTOFFSET.val.p, fieldName: "val", required: false, type: Int64.self)
    try _v.visit(field: VTOFFSET.count.p, fieldName: "count", required: false, type: UInt16.self)
    _v.finish()
  }
}

extension MyGame_Example_Stat: Encodable {

  enum CodingKeys: String, CodingKey {
    case id = "id"
    case val = "val"
    case count = "count"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encodeIfPresent(id, forKey: .id)
    if val != 0 {
      try container.encodeIfPresent(val, forKey: .val)
    }
    if count != 0 {
      try container.encodeIfPresent(count, forKey: .count)
    }
  }
}

public class MyGame_Example_StatT: NativeObject {

  public var id: String?
  public var val: Int64
  public var count: UInt16

  public init(_ _t: inout MyGame_Example_Stat) {
    id = _t.id
    val = _t.val
    count = _t.count
  }

  public init() {
    val = 0
    count = 0
  }

  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Stat.self) }

}
public struct MyGame_Example_Referrable: FlatBufferObject, Verifiable, ObjectAPIPacker {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Table

  public static var id: String { "MONS" } 
  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Referrable.id, addPrefix: prefix) }
  private init(_ t: Table) { _accessor = t }
  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }

  private enum VTOFFSET: VOffset {
    case id = 4
    var v: Int32 { Int32(self.rawValue) }
    var p: VOffset { self.rawValue }
  }

  public var id: UInt64 { let o = _accessor.offset(VTOFFSET.id.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
  @discardableResult public func mutate(id: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.id.v);  return _accessor.mutate(id, index: o) }
  public static func startReferrable(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
  public static func add(id: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: id, def: 0, at: VTOFFSET.id.p) }
  public static func endReferrable(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
  public static func createReferrable(
    _ fbb: inout FlatBufferBuilder,
    id: UInt64 = 0
  ) -> Offset {
    let __start = MyGame_Example_Referrable.startReferrable(&fbb)
    MyGame_Example_Referrable.add(id: id, &fbb)
    return MyGame_Example_Referrable.endReferrable(&fbb, start: __start)
  }
  public static func sortVectorOfReferrable(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {
    var off = offsets
    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 4, fbb: fbb.buffer), Table.offset(Int32($0.o), vOffset: 4, fbb: fbb.buffer), fbb: fbb.buffer) < 0 } 
    return fbb.createVector(ofOffsets: off)
  }
  fileprivate static func lookupByKey(vector: Int32, key: UInt64, fbb: ByteBuffer) -> MyGame_Example_Referrable? {
    var span = fbb.read(def: Int32.self, position: Int(vector - 4))
    var start: Int32 = 0
    while span != 0 {
      var middle = span / 2
      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)
      let comp = fbb.read(def: UInt64.self, position: Int(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 4, fbb: fbb)))
      if comp > 0 {
        span = middle
      } else if comp < 0 {
        middle += 1
        start += middle
        span -= middle
      } else {
        return MyGame_Example_Referrable(fbb, o: tableOffset)
      }
    }
    return nil
  }
  

  public mutating func unpack() -> MyGame_Example_ReferrableT {
    return MyGame_Example_ReferrableT(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ReferrableT?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ReferrableT) -> Offset {
    let __root = MyGame_Example_Referrable.startReferrable(&builder)
    MyGame_Example_Referrable.add(id: obj.id, &builder)
    return MyGame_Example_Referrable.endReferrable(&builder, start: __root)
  }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    var _v = try verifier.visitTable(at: position)
    try _v.visit(field: VTOFFSET.id.p, fieldName: "id", required: false, type: UInt64.self)
    _v.finish()
  }
}

extension MyGame_Example_Referrable: Encodable {

  enum CodingKeys: String, CodingKey {
    case id = "id"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    if id != 0 {
      try container.encodeIfPresent(id, forKey: .id)
    }
  }
}

public class MyGame_Example_ReferrableT: NativeObject {

  public var id: UInt64

  public init(_ _t: inout MyGame_Example_Referrable) {
    id = _t.id
  }

  public init() {
    id = 0
  }

  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Referrable.self) }

}
///  an example documentation comment: "monster object"
public struct MyGame_Example_Monster: FlatBufferObject, Verifiable, ObjectAPIPacker {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Table

  public static var id: String { "MONS" } 
  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Monster.id, addPrefix: prefix) }
  private init(_ t: Table) { _accessor = t }
  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }

  private enum VTOFFSET: VOffset {
    case pos = 4
    case mana = 6
    case hp = 8
    case name = 10
    case inventory = 14
    case color = 16
    case testType = 18
    case test = 20
    case test4 = 22
    case testarrayofstring = 24
    case testarrayoftables = 26
    case enemy = 28
    case testnestedflatbuffer = 30
    case testempty = 32
    case testbool = 34
    case testhashs32Fnv1 = 36
    case testhashu32Fnv1 = 38
    case testhashs64Fnv1 = 40
    case testhashu64Fnv1 = 42
    case testhashs32Fnv1a = 44
    case testhashu32Fnv1a = 46
    case testhashs64Fnv1a = 48
    case testhashu64Fnv1a = 50
    case testarrayofbools = 52
    case testf = 54
    case testf2 = 56
    case testf3 = 58
    case testarrayofstring2 = 60
    case testarrayofsortedstruct = 62
    case flex = 64
    case test5 = 66
    case vectorOfLongs = 68
    case vectorOfDoubles = 70
    case parentNamespaceTest = 72
    case vectorOfReferrables = 74
    case singleWeakReference = 76
    case vectorOfWeakReferences = 78
    case vectorOfStrongReferrables = 80
    case coOwningReference = 82
    case vectorOfCoOwningReferences = 84
    case nonOwningReference = 86
    case vectorOfNonOwningReferences = 88
    case anyUniqueType = 90
    case anyUnique = 92
    case anyAmbiguousType = 94
    case anyAmbiguous = 96
    case vectorOfEnums = 98
    case signedEnum = 100
    case testrequirednestedflatbuffer = 102
    case scalarKeySortedTables = 104
    case nativeInline = 106
    case longEnumNonEnumDefault = 108
    case longEnumNormalDefault = 110
    case nanDefault = 112
    case infDefault = 114
    case positiveInfDefault = 116
    case infinityDefault = 118
    case positiveInfinityDefault = 120
    case negativeInfDefault = 122
    case negativeInfinityDefault = 124
    case doubleInfDefault = 126
    var v: Int32 { Int32(self.rawValue) }
    var p: VOffset { self.rawValue }
  }

  public var pos: MyGame_Example_Vec3? { let o = _accessor.offset(VTOFFSET.pos.v); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Example_Vec3.self, at: o) }
  public var mutablePos: MyGame_Example_Vec3_Mutable? { let o = _accessor.offset(VTOFFSET.pos.v); return o == 0 ? nil : MyGame_Example_Vec3_Mutable(_accessor.bb, o: o + _accessor.postion) }
  public var mana: Int16 { let o = _accessor.offset(VTOFFSET.mana.v); return o == 0 ? 150 : _accessor.readBuffer(of: Int16.self, at: o) }
  @discardableResult public func mutate(mana: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.mana.v);  return _accessor.mutate(mana, index: o) }
  public var hp: Int16 { let o = _accessor.offset(VTOFFSET.hp.v); return o == 0 ? 100 : _accessor.readBuffer(of: Int16.self, at: o) }
  @discardableResult public func mutate(hp: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.hp.v);  return _accessor.mutate(hp, index: o) }
  public var name: String! { let o = _accessor.offset(VTOFFSET.name.v); return _accessor.string(at: o) }
  public var nameSegmentArray: [UInt8]! { return _accessor.getVector(at: VTOFFSET.name.v) }
  public var hasInventory: Bool { let o = _accessor.offset(VTOFFSET.inventory.v); return o == 0 ? false : true }
  public var inventoryCount: Int32 { let o = _accessor.offset(VTOFFSET.inventory.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func inventory(at index: Int32) -> UInt8 { let o = _accessor.offset(VTOFFSET.inventory.v); return o == 0 ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1) }
  public var inventory: [UInt8] { return _accessor.getVector(at: VTOFFSET.inventory.v) ?? [] }
  public func mutate(inventory: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.inventory.v); return _accessor.directMutate(inventory, index: _accessor.vector(at: o) + index * 1) }
  public var color: MyGame_Example_Color { let o = _accessor.offset(VTOFFSET.color.v); return o == 0 ? .blue : MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .blue }
  @discardableResult public func mutate(color: MyGame_Example_Color) -> Bool {let o = _accessor.offset(VTOFFSET.color.v);  return _accessor.mutate(color.rawValue, index: o) }
  public var testType: MyGame_Example_Any_ { let o = _accessor.offset(VTOFFSET.testType.v); return o == 0 ? .none_ : MyGame_Example_Any_(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }
  public func test<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.test.v); return o == 0 ? nil : _accessor.union(o) }
  public var hasTest4: Bool { let o = _accessor.offset(VTOFFSET.test4.v); return o == 0 ? false : true }
  public var test4Count: Int32 { let o = _accessor.offset(VTOFFSET.test4.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func test4(at index: Int32) -> MyGame_Example_Test? { let o = _accessor.offset(VTOFFSET.test4.v); return o == 0 ? nil : _accessor.directRead(of: MyGame_Example_Test.self, offset: _accessor.vector(at: o) + index * 4) }
  public func mutableTest4(at index: Int32) -> MyGame_Example_Test_Mutable? { let o = _accessor.offset(VTOFFSET.test4.v); return o == 0 ? nil : MyGame_Example_Test_Mutable(_accessor.bb, o: _accessor.vector(at: o) + index * 4) }
  public var hasTestarrayofstring: Bool { let o = _accessor.offset(VTOFFSET.testarrayofstring.v); return o == 0 ? false : true }
  public var testarrayofstringCount: Int32 { let o = _accessor.offset(VTOFFSET.testarrayofstring.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func testarrayofstring(at index: Int32) -> String? { let o = _accessor.offset(VTOFFSET.testarrayofstring.v); return o == 0 ? nil : _accessor.directString(at: _accessor.vector(at: o) + index * 4) }
  ///  an example documentation comment: this will end up in the generated code
  ///  multiline too
  public var hasTestarrayoftables: Bool { let o = _accessor.offset(VTOFFSET.testarrayoftables.v); return o == 0 ? false : true }
  public var testarrayoftablesCount: Int32 { let o = _accessor.offset(VTOFFSET.testarrayoftables.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func testarrayoftables(at index: Int32) -> MyGame_Example_Monster? { let o = _accessor.offset(VTOFFSET.testarrayoftables.v); return o == 0 ? nil : MyGame_Example_Monster(_accessor.bb, o: _accessor.indirect(_accessor.vector(at: o) + index * 4)) }
  public func testarrayoftablesBy(key: String) -> MyGame_Example_Monster? { let o = _accessor.offset(VTOFFSET.testarrayoftables.v); return o == 0 ? nil : MyGame_Example_Monster.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }
  public var enemy: MyGame_Example_Monster? { let o = _accessor.offset(VTOFFSET.enemy.v); return o == 0 ? nil : MyGame_Example_Monster(_accessor.bb, o: _accessor.indirect(o + _accessor.postion)) }
  public var hasTestnestedflatbuffer: Bool { let o = _accessor.offset(VTOFFSET.testnestedflatbuffer.v); return o == 0 ? false : true }
  public var testnestedflatbufferCount: Int32 { let o = _accessor.offset(VTOFFSET.testnestedflatbuffer.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func testnestedflatbuffer(at index: Int32) -> UInt8 { let o = _accessor.offset(VTOFFSET.testnestedflatbuffer.v); return o == 0 ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1) }
  public var testnestedflatbuffer: [UInt8] { return _accessor.getVector(at: VTOFFSET.testnestedflatbuffer.v) ?? [] }
  public func mutate(testnestedflatbuffer: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.testnestedflatbuffer.v); return _accessor.directMutate(testnestedflatbuffer, index: _accessor.vector(at: o) + index * 1) }
  public var testempty: MyGame_Example_Stat? { let o = _accessor.offset(VTOFFSET.testempty.v); return o == 0 ? nil : MyGame_Example_Stat(_accessor.bb, o: _accessor.indirect(o + _accessor.postion)) }
  public var testbool: Bool { let o = _accessor.offset(VTOFFSET.testbool.v); return o == 0 ? false : _accessor.readBuffer(of: Bool.self, at: o) }
  @discardableResult public func mutate(testbool: Bool) -> Bool {let o = _accessor.offset(VTOFFSET.testbool.v);  return _accessor.mutate(testbool, index: o) }
  public var testhashs32Fnv1: Int32 { let o = _accessor.offset(VTOFFSET.testhashs32Fnv1.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
  @discardableResult public func mutate(testhashs32Fnv1: Int32) -> Bool {let o = _accessor.offset(VTOFFSET.testhashs32Fnv1.v);  return _accessor.mutate(testhashs32Fnv1, index: o) }
  public var testhashu32Fnv1: UInt32 { let o = _accessor.offset(VTOFFSET.testhashu32Fnv1.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }
  @discardableResult public func mutate(testhashu32Fnv1: UInt32) -> Bool {let o = _accessor.offset(VTOFFSET.testhashu32Fnv1.v);  return _accessor.mutate(testhashu32Fnv1, index: o) }
  public var testhashs64Fnv1: Int64 { let o = _accessor.offset(VTOFFSET.testhashs64Fnv1.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
  @discardableResult public func mutate(testhashs64Fnv1: Int64) -> Bool {let o = _accessor.offset(VTOFFSET.testhashs64Fnv1.v);  return _accessor.mutate(testhashs64Fnv1, index: o) }
  public var testhashu64Fnv1: UInt64 { let o = _accessor.offset(VTOFFSET.testhashu64Fnv1.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
  @discardableResult public func mutate(testhashu64Fnv1: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.testhashu64Fnv1.v);  return _accessor.mutate(testhashu64Fnv1, index: o) }
  public var testhashs32Fnv1a: Int32 { let o = _accessor.offset(VTOFFSET.testhashs32Fnv1a.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
  @discardableResult public func mutate(testhashs32Fnv1a: Int32) -> Bool {let o = _accessor.offset(VTOFFSET.testhashs32Fnv1a.v);  return _accessor.mutate(testhashs32Fnv1a, index: o) }
  public var testhashu32Fnv1a: UInt32 { let o = _accessor.offset(VTOFFSET.testhashu32Fnv1a.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }
  @discardableResult public func mutate(testhashu32Fnv1a: UInt32) -> Bool {let o = _accessor.offset(VTOFFSET.testhashu32Fnv1a.v);  return _accessor.mutate(testhashu32Fnv1a, index: o) }
  public var testhashs64Fnv1a: Int64 { let o = _accessor.offset(VTOFFSET.testhashs64Fnv1a.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
  @discardableResult public func mutate(testhashs64Fnv1a: Int64) -> Bool {let o = _accessor.offset(VTOFFSET.testhashs64Fnv1a.v);  return _accessor.mutate(testhashs64Fnv1a, index: o) }
  public var testhashu64Fnv1a: UInt64 { let o = _accessor.offset(VTOFFSET.testhashu64Fnv1a.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
  @discardableResult public func mutate(testhashu64Fnv1a: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.testhashu64Fnv1a.v);  return _accessor.mutate(testhashu64Fnv1a, index: o) }
  public var hasTestarrayofbools: Bool { let o = _accessor.offset(VTOFFSET.testarrayofbools.v); return o == 0 ? false : true }
  public var testarrayofboolsCount: Int32 { let o = _accessor.offset(VTOFFSET.testarrayofbools.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func testarrayofbools(at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.testarrayofbools.v); return o == 0 ? true : _accessor.directRead(of: Bool.self, offset: _accessor.vector(at: o) + index * 1) }
  public var testarrayofbools: [Bool] { return _accessor.getVector(at: VTOFFSET.testarrayofbools.v) ?? [] }
  public func mutate(testarrayofbools: Bool, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.testarrayofbools.v); return _accessor.directMutate(testarrayofbools, index: _accessor.vector(at: o) + index * 1) }
  public var testf: Float32 { let o = _accessor.offset(VTOFFSET.testf.v); return o == 0 ? 3.14159 : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(testf: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.testf.v);  return _accessor.mutate(testf, index: o) }
  public var testf2: Float32 { let o = _accessor.offset(VTOFFSET.testf2.v); return o == 0 ? 3.0 : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(testf2: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.testf2.v);  return _accessor.mutate(testf2, index: o) }
  public var testf3: Float32 { let o = _accessor.offset(VTOFFSET.testf3.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(testf3: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.testf3.v);  return _accessor.mutate(testf3, index: o) }
  public var hasTestarrayofstring2: Bool { let o = _accessor.offset(VTOFFSET.testarrayofstring2.v); return o == 0 ? false : true }
  public var testarrayofstring2Count: Int32 { let o = _accessor.offset(VTOFFSET.testarrayofstring2.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func testarrayofstring2(at index: Int32) -> String? { let o = _accessor.offset(VTOFFSET.testarrayofstring2.v); return o == 0 ? nil : _accessor.directString(at: _accessor.vector(at: o) + index * 4) }
  public var hasTestarrayofsortedstruct: Bool { let o = _accessor.offset(VTOFFSET.testarrayofsortedstruct.v); return o == 0 ? false : true }
  public var testarrayofsortedstructCount: Int32 { let o = _accessor.offset(VTOFFSET.testarrayofsortedstruct.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func testarrayofsortedstruct(at index: Int32) -> MyGame_Example_Ability? { let o = _accessor.offset(VTOFFSET.testarrayofsortedstruct.v); return o == 0 ? nil : _accessor.directRead(of: MyGame_Example_Ability.self, offset: _accessor.vector(at: o) + index * 8) }
  public func mutableTestarrayofsortedstruct(at index: Int32) -> MyGame_Example_Ability_Mutable? { let o = _accessor.offset(VTOFFSET.testarrayofsortedstruct.v); return o == 0 ? nil : MyGame_Example_Ability_Mutable(_accessor.bb, o: _accessor.vector(at: o) + index * 8) }
  public var hasFlex: Bool { let o = _accessor.offset(VTOFFSET.flex.v); return o == 0 ? false : true }
  public var flexCount: Int32 { let o = _accessor.offset(VTOFFSET.flex.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func flex(at index: Int32) -> UInt8 { let o = _accessor.offset(VTOFFSET.flex.v); return o == 0 ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1) }
  public var flex: [UInt8] { return _accessor.getVector(at: VTOFFSET.flex.v) ?? [] }
  public func mutate(flex: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.flex.v); return _accessor.directMutate(flex, index: _accessor.vector(at: o) + index * 1) }
  public var hasTest5: Bool { let o = _accessor.offset(VTOFFSET.test5.v); return o == 0 ? false : true }
  public var test5Count: Int32 { let o = _accessor.offset(VTOFFSET.test5.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func test5(at index: Int32) -> MyGame_Example_Test? { let o = _accessor.offset(VTOFFSET.test5.v); return o == 0 ? nil : _accessor.directRead(of: MyGame_Example_Test.self, offset: _accessor.vector(at: o) + index * 4) }
  public func mutableTest5(at index: Int32) -> MyGame_Example_Test_Mutable? { let o = _accessor.offset(VTOFFSET.test5.v); return o == 0 ? nil : MyGame_Example_Test_Mutable(_accessor.bb, o: _accessor.vector(at: o) + index * 4) }
  public var hasVectorOfLongs: Bool { let o = _accessor.offset(VTOFFSET.vectorOfLongs.v); return o == 0 ? false : true }
  public var vectorOfLongsCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfLongs.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vectorOfLongs(at index: Int32) -> Int64 { let o = _accessor.offset(VTOFFSET.vectorOfLongs.v); return o == 0 ? 0 : _accessor.directRead(of: Int64.self, offset: _accessor.vector(at: o) + index * 8) }
  public var vectorOfLongs: [Int64] { return _accessor.getVector(at: VTOFFSET.vectorOfLongs.v) ?? [] }
  public func mutate(vectorOfLongs: Int64, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfLongs.v); return _accessor.directMutate(vectorOfLongs, index: _accessor.vector(at: o) + index * 8) }
  public var hasVectorOfDoubles: Bool { let o = _accessor.offset(VTOFFSET.vectorOfDoubles.v); return o == 0 ? false : true }
  public var vectorOfDoublesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfDoubles.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vectorOfDoubles(at index: Int32) -> Double { let o = _accessor.offset(VTOFFSET.vectorOfDoubles.v); return o == 0 ? 0 : _accessor.directRead(of: Double.self, offset: _accessor.vector(at: o) + index * 8) }
  public var vectorOfDoubles: [Double] { return _accessor.getVector(at: VTOFFSET.vectorOfDoubles.v) ?? [] }
  public func mutate(vectorOfDoubles: Double, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfDoubles.v); return _accessor.directMutate(vectorOfDoubles, index: _accessor.vector(at: o) + index * 8) }
  public var parentNamespaceTest: MyGame_InParentNamespace? { let o = _accessor.offset(VTOFFSET.parentNamespaceTest.v); return o == 0 ? nil : MyGame_InParentNamespace(_accessor.bb, o: _accessor.indirect(o + _accessor.postion)) }
  public var hasVectorOfReferrables: Bool { let o = _accessor.offset(VTOFFSET.vectorOfReferrables.v); return o == 0 ? false : true }
  public var vectorOfReferrablesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfReferrables.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vectorOfReferrables(at index: Int32) -> MyGame_Example_Referrable? { let o = _accessor.offset(VTOFFSET.vectorOfReferrables.v); return o == 0 ? nil : MyGame_Example_Referrable(_accessor.bb, o: _accessor.indirect(_accessor.vector(at: o) + index * 4)) }
  public func vectorOfReferrablesBy(key: UInt64) -> MyGame_Example_Referrable? { let o = _accessor.offset(VTOFFSET.vectorOfReferrables.v); return o == 0 ? nil : MyGame_Example_Referrable.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }
  public var singleWeakReference: UInt64 { let o = _accessor.offset(VTOFFSET.singleWeakReference.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
  @discardableResult public func mutate(singleWeakReference: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.singleWeakReference.v);  return _accessor.mutate(singleWeakReference, index: o) }
  public var hasVectorOfWeakReferences: Bool { let o = _accessor.offset(VTOFFSET.vectorOfWeakReferences.v); return o == 0 ? false : true }
  public var vectorOfWeakReferencesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfWeakReferences.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vectorOfWeakReferences(at index: Int32) -> UInt64 { let o = _accessor.offset(VTOFFSET.vectorOfWeakReferences.v); return o == 0 ? 0 : _accessor.directRead(of: UInt64.self, offset: _accessor.vector(at: o) + index * 8) }
  public var vectorOfWeakReferences: [UInt64] { return _accessor.getVector(at: VTOFFSET.vectorOfWeakReferences.v) ?? [] }
  public func mutate(vectorOfWeakReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfWeakReferences.v); return _accessor.directMutate(vectorOfWeakReferences, index: _accessor.vector(at: o) + index * 8) }
  public var hasVectorOfStrongReferrables: Bool { let o = _accessor.offset(VTOFFSET.vectorOfStrongReferrables.v); return o == 0 ? false : true }
  public var vectorOfStrongReferrablesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfStrongReferrables.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vectorOfStrongReferrables(at index: Int32) -> MyGame_Example_Referrable? { let o = _accessor.offset(VTOFFSET.vectorOfStrongReferrables.v); return o == 0 ? nil : MyGame_Example_Referrable(_accessor.bb, o: _accessor.indirect(_accessor.vector(at: o) + index * 4)) }
  public func vectorOfStrongReferrablesBy(key: UInt64) -> MyGame_Example_Referrable? { let o = _accessor.offset(VTOFFSET.vectorOfStrongReferrables.v); return o == 0 ? nil : MyGame_Example_Referrable.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }
  public var coOwningReference: UInt64 { let o = _accessor.offset(VTOFFSET.coOwningReference.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
  @discardableResult public func mutate(coOwningReference: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.coOwningReference.v);  return _accessor.mutate(coOwningReference, index: o) }
  public var hasVectorOfCoOwningReferences: Bool { let o = _accessor.offset(VTOFFSET.vectorOfCoOwningReferences.v); return o == 0 ? false : true }
  public var vectorOfCoOwningReferencesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfCoOwningReferences.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vectorOfCoOwningReferences(at index: Int32) -> UInt64 { let o = _accessor.offset(VTOFFSET.vectorOfCoOwningReferences.v); return o == 0 ? 0 : _accessor.directRead(of: UInt64.self, offset: _accessor.vector(at: o) + index * 8) }
  public var vectorOfCoOwningReferences: [UInt64] { return _accessor.getVector(at: VTOFFSET.vectorOfCoOwningReferences.v) ?? [] }
  public func mutate(vectorOfCoOwningReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfCoOwningReferences.v); return _accessor.directMutate(vectorOfCoOwningReferences, index: _accessor.vector(at: o) + index * 8) }
  public var nonOwningReference: UInt64 { let o = _accessor.offset(VTOFFSET.nonOwningReference.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
  @discardableResult public func mutate(nonOwningReference: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.nonOwningReference.v);  return _accessor.mutate(nonOwningReference, index: o) }
  public var hasVectorOfNonOwningReferences: Bool { let o = _accessor.offset(VTOFFSET.vectorOfNonOwningReferences.v); return o == 0 ? false : true }
  public var vectorOfNonOwningReferencesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfNonOwningReferences.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vectorOfNonOwningReferences(at index: Int32) -> UInt64 { let o = _accessor.offset(VTOFFSET.vectorOfNonOwningReferences.v); return o == 0 ? 0 : _accessor.directRead(of: UInt64.self, offset: _accessor.vector(at: o) + index * 8) }
  public var vectorOfNonOwningReferences: [UInt64] { return _accessor.getVector(at: VTOFFSET.vectorOfNonOwningReferences.v) ?? [] }
  public func mutate(vectorOfNonOwningReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfNonOwningReferences.v); return _accessor.directMutate(vectorOfNonOwningReferences, index: _accessor.vector(at: o) + index * 8) }
  public var anyUniqueType: MyGame_Example_AnyUniqueAliases { let o = _accessor.offset(VTOFFSET.anyUniqueType.v); return o == 0 ? .none_ : MyGame_Example_AnyUniqueAliases(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }
  public func anyUnique<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.anyUnique.v); return o == 0 ? nil : _accessor.union(o) }
  public var anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases { let o = _accessor.offset(VTOFFSET.anyAmbiguousType.v); return o == 0 ? .none_ : MyGame_Example_AnyAmbiguousAliases(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }
  public func anyAmbiguous<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.anyAmbiguous.v); return o == 0 ? nil : _accessor.union(o) }
  public var hasVectorOfEnums: Bool { let o = _accessor.offset(VTOFFSET.vectorOfEnums.v); return o == 0 ? false : true }
  public var vectorOfEnumsCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfEnums.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vectorOfEnums(at index: Int32) -> MyGame_Example_Color? { let o = _accessor.offset(VTOFFSET.vectorOfEnums.v); return o == 0 ? MyGame_Example_Color.red : MyGame_Example_Color(rawValue: _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1)) }
  public var signedEnum: MyGame_Example_Race { let o = _accessor.offset(VTOFFSET.signedEnum.v); return o == 0 ? .none_ : MyGame_Example_Race(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .none_ }
  @discardableResult public func mutate(signedEnum: MyGame_Example_Race) -> Bool {let o = _accessor.offset(VTOFFSET.signedEnum.v);  return _accessor.mutate(signedEnum.rawValue, index: o) }
  public var hasTestrequirednestedflatbuffer: Bool { let o = _accessor.offset(VTOFFSET.testrequirednestedflatbuffer.v); return o == 0 ? false : true }
  public var testrequirednestedflatbufferCount: Int32 { let o = _accessor.offset(VTOFFSET.testrequirednestedflatbuffer.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func testrequirednestedflatbuffer(at index: Int32) -> UInt8 { let o = _accessor.offset(VTOFFSET.testrequirednestedflatbuffer.v); return o == 0 ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1) }
  public var testrequirednestedflatbuffer: [UInt8] { return _accessor.getVector(at: VTOFFSET.testrequirednestedflatbuffer.v) ?? [] }
  public func mutate(testrequirednestedflatbuffer: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.testrequirednestedflatbuffer.v); return _accessor.directMutate(testrequirednestedflatbuffer, index: _accessor.vector(at: o) + index * 1) }
  public var hasScalarKeySortedTables: Bool { let o = _accessor.offset(VTOFFSET.scalarKeySortedTables.v); return o == 0 ? false : true }
  public var scalarKeySortedTablesCount: Int32 { let o = _accessor.offset(VTOFFSET.scalarKeySortedTables.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func scalarKeySortedTables(at index: Int32) -> MyGame_Example_Stat? { let o = _accessor.offset(VTOFFSET.scalarKeySortedTables.v); return o == 0 ? nil : MyGame_Example_Stat(_accessor.bb, o: _accessor.indirect(_accessor.vector(at: o) + index * 4)) }
  public func scalarKeySortedTablesBy(key: UInt16) -> MyGame_Example_Stat? { let o = _accessor.offset(VTOFFSET.scalarKeySortedTables.v); return o == 0 ? nil : MyGame_Example_Stat.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }
  public var nativeInline: MyGame_Example_Test? { let o = _accessor.offset(VTOFFSET.nativeInline.v); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Example_Test.self, at: o) }
  public var mutableNativeInline: MyGame_Example_Test_Mutable? { let o = _accessor.offset(VTOFFSET.nativeInline.v); return o == 0 ? nil : MyGame_Example_Test_Mutable(_accessor.bb, o: o + _accessor.postion) }
  public var longEnumNonEnumDefault: MyGame_Example_LongEnum { let o = _accessor.offset(VTOFFSET.longEnumNonEnumDefault.v); return o == 0 ? .longone : MyGame_Example_LongEnum(rawValue: _accessor.readBuffer(of: UInt64.self, at: o)) ?? .longone }
  @discardableResult public func mutate(longEnumNonEnumDefault: MyGame_Example_LongEnum) -> Bool {let o = _accessor.offset(VTOFFSET.longEnumNonEnumDefault.v);  return _accessor.mutate(longEnumNonEnumDefault.rawValue, index: o) }
  public var longEnumNormalDefault: MyGame_Example_LongEnum { let o = _accessor.offset(VTOFFSET.longEnumNormalDefault.v); return o == 0 ? .longone : MyGame_Example_LongEnum(rawValue: _accessor.readBuffer(of: UInt64.self, at: o)) ?? .longone }
  @discardableResult public func mutate(longEnumNormalDefault: MyGame_Example_LongEnum) -> Bool {let o = _accessor.offset(VTOFFSET.longEnumNormalDefault.v);  return _accessor.mutate(longEnumNormalDefault.rawValue, index: o) }
  public var nanDefault: Float32 { let o = _accessor.offset(VTOFFSET.nanDefault.v); return o == 0 ? .nan : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(nanDefault: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.nanDefault.v);  return _accessor.mutate(nanDefault, index: o) }
  public var infDefault: Float32 { let o = _accessor.offset(VTOFFSET.infDefault.v); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(infDefault: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.infDefault.v);  return _accessor.mutate(infDefault, index: o) }
  public var positiveInfDefault: Float32 { let o = _accessor.offset(VTOFFSET.positiveInfDefault.v); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(positiveInfDefault: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.positiveInfDefault.v);  return _accessor.mutate(positiveInfDefault, index: o) }
  public var infinityDefault: Float32 { let o = _accessor.offset(VTOFFSET.infinityDefault.v); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(infinityDefault: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.infinityDefault.v);  return _accessor.mutate(infinityDefault, index: o) }
  public var positiveInfinityDefault: Float32 { let o = _accessor.offset(VTOFFSET.positiveInfinityDefault.v); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(positiveInfinityDefault: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.positiveInfinityDefault.v);  return _accessor.mutate(positiveInfinityDefault, index: o) }
  public var negativeInfDefault: Float32 { let o = _accessor.offset(VTOFFSET.negativeInfDefault.v); return o == 0 ? -.infinity : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(negativeInfDefault: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.negativeInfDefault.v);  return _accessor.mutate(negativeInfDefault, index: o) }
  public var negativeInfinityDefault: Float32 { let o = _accessor.offset(VTOFFSET.negativeInfinityDefault.v); return o == 0 ? -.infinity : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(negativeInfinityDefault: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.negativeInfinityDefault.v);  return _accessor.mutate(negativeInfinityDefault, index: o) }
  public var doubleInfDefault: Double { let o = _accessor.offset(VTOFFSET.doubleInfDefault.v); return o == 0 ? .infinity : _accessor.readBuffer(of: Double.self, at: o) }
  @discardableResult public func mutate(doubleInfDefault: Double) -> Bool {let o = _accessor.offset(VTOFFSET.doubleInfDefault.v);  return _accessor.mutate(doubleInfDefault, index: o) }
  public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 62) }
  public static func add(pos: MyGame_Example_Vec3?, _ fbb: inout FlatBufferBuilder) { guard let pos = pos else { return }; fbb.create(struct: pos, position: VTOFFSET.pos.p) }
  public static func add(mana: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mana, def: 150, at: VTOFFSET.mana.p) }
  public static func add(hp: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: hp, def: 100, at: VTOFFSET.hp.p) }
  public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
  public static func addVectorOf(inventory: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: inventory, at: VTOFFSET.inventory.p) }
  public static func add(color: MyGame_Example_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 8, at: VTOFFSET.color.p) }
  public static func add(testType: MyGame_Example_Any_, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testType.rawValue, def: 0, at: VTOFFSET.testType.p) }
  public static func add(test: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test, at: VTOFFSET.test.p) }
  public static func addVectorOf(test4: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test4, at: VTOFFSET.test4.p) }
  public static func startVectorOfTest4(_ size: Int, in builder: inout FlatBufferBuilder) {
    builder.startVector(size * MemoryLayout<MyGame_Example_Test>.size, elementSize: MemoryLayout<MyGame_Example_Test>.alignment)
  }
  public static func addVectorOf(testarrayofstring: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofstring, at: VTOFFSET.testarrayofstring.p) }
  public static func addVectorOf(testarrayoftables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayoftables, at: VTOFFSET.testarrayoftables.p) }
  public static func add(enemy: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: enemy, at: VTOFFSET.enemy.p) }
  public static func addVectorOf(testnestedflatbuffer: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testnestedflatbuffer, at: VTOFFSET.testnestedflatbuffer.p) }
  public static func add(testempty: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testempty, at: VTOFFSET.testempty.p) }
  public static func add(testbool: Bool, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testbool, def: false,
   at: VTOFFSET.testbool.p) }
  public static func add(testhashs32Fnv1: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs32Fnv1, def: 0, at: VTOFFSET.testhashs32Fnv1.p) }
  public static func add(testhashu32Fnv1: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu32Fnv1, def: 0, at: VTOFFSET.testhashu32Fnv1.p) }
  public static func add(testhashs64Fnv1: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs64Fnv1, def: 0, at: VTOFFSET.testhashs64Fnv1.p) }
  public static func add(testhashu64Fnv1: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu64Fnv1, def: 0, at: VTOFFSET.testhashu64Fnv1.p) }
  public static func add(testhashs32Fnv1a: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs32Fnv1a, def: 0, at: VTOFFSET.testhashs32Fnv1a.p) }
  public static func add(testhashu32Fnv1a: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu32Fnv1a, def: 0, at: VTOFFSET.testhashu32Fnv1a.p) }
  public static func add(testhashs64Fnv1a: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs64Fnv1a, def: 0, at: VTOFFSET.testhashs64Fnv1a.p) }
  public static func add(testhashu64Fnv1a: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu64Fnv1a, def: 0, at: VTOFFSET.testhashu64Fnv1a.p) }
  public static func addVectorOf(testarrayofbools: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofbools, at: VTOFFSET.testarrayofbools.p) }
  public static func add(testf: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf, def: 3.14159, at: VTOFFSET.testf.p) }
  public static func add(testf2: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf2, def: 3.0, at: VTOFFSET.testf2.p) }
  public static func add(testf3: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf3, def: 0.0, at: VTOFFSET.testf3.p) }
  public static func addVectorOf(testarrayofstring2: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofstring2, at: VTOFFSET.testarrayofstring2.p) }
  public static func addVectorOf(testarrayofsortedstruct: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofsortedstruct, at: VTOFFSET.testarrayofsortedstruct.p) }
  public static func startVectorOfTestarrayofsortedstruct(_ size: Int, in builder: inout FlatBufferBuilder) {
    builder.startVector(size * MemoryLayout<MyGame_Example_Ability>.size, elementSize: MemoryLayout<MyGame_Example_Ability>.alignment)
  }
  public static func addVectorOf(flex: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: flex, at: VTOFFSET.flex.p) }
  public static func addVectorOf(test5: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test5, at: VTOFFSET.test5.p) }
  public static func startVectorOfTest5(_ size: Int, in builder: inout FlatBufferBuilder) {
    builder.startVector(size * MemoryLayout<MyGame_Example_Test>.size, elementSize: MemoryLayout<MyGame_Example_Test>.alignment)
  }
  public static func addVectorOf(vectorOfLongs: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfLongs, at: VTOFFSET.vectorOfLongs.p) }
  public static func addVectorOf(vectorOfDoubles: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfDoubles, at: VTOFFSET.vectorOfDoubles.p) }
  public static func add(parentNamespaceTest: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: parentNamespaceTest, at: VTOFFSET.parentNamespaceTest.p) }
  public static func addVectorOf(vectorOfReferrables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfReferrables, at: VTOFFSET.vectorOfReferrables.p) }
  public static func add(singleWeakReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: singleWeakReference, def: 0, at: VTOFFSET.singleWeakReference.p) }
  public static func addVectorOf(vectorOfWeakReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfWeakReferences, at: VTOFFSET.vectorOfWeakReferences.p) }
  public static func addVectorOf(vectorOfStrongReferrables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfStrongReferrables, at: VTOFFSET.vectorOfStrongReferrables.p) }
  public static func add(coOwningReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: coOwningReference, def: 0, at: VTOFFSET.coOwningReference.p) }
  public static func addVectorOf(vectorOfCoOwningReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfCoOwningReferences, at: VTOFFSET.vectorOfCoOwningReferences.p) }
  public static func add(nonOwningReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: nonOwningReference, def: 0, at: VTOFFSET.nonOwningReference.p) }
  public static func addVectorOf(vectorOfNonOwningReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfNonOwningReferences, at: VTOFFSET.vectorOfNonOwningReferences.p) }
  public static func add(anyUniqueType: MyGame_Example_AnyUniqueAliases, _ fbb: inout FlatBufferBuilder) { fbb.add(element: anyUniqueType.rawValue, def: 0, at: VTOFFSET.anyUniqueType.p) }
  public static func add(anyUnique: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: anyUnique, at: VTOFFSET.anyUnique.p) }
  public static func add(anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases, _ fbb: inout FlatBufferBuilder) { fbb.add(element: anyAmbiguousType.rawValue, def: 0, at: VTOFFSET.anyAmbiguousType.p) }
  public static func add(anyAmbiguous: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: anyAmbiguous, at: VTOFFSET.anyAmbiguous.p) }
  public static func addVectorOf(vectorOfEnums: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfEnums, at: VTOFFSET.vectorOfEnums.p) }
  public static func add(signedEnum: MyGame_Example_Race, _ fbb: inout FlatBufferBuilder) { fbb.add(element: signedEnum.rawValue, def: -1, at: VTOFFSET.signedEnum.p) }
  public static func addVectorOf(testrequirednestedflatbuffer: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testrequirednestedflatbuffer, at: VTOFFSET.testrequirednestedflatbuffer.p) }
  public static func addVectorOf(scalarKeySortedTables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: scalarKeySortedTables, at: VTOFFSET.scalarKeySortedTables.p) }
  public static func add(nativeInline: MyGame_Example_Test?, _ fbb: inout FlatBufferBuilder) { guard let nativeInline = nativeInline else { return }; fbb.create(struct: nativeInline, position: VTOFFSET.nativeInline.p) }
  public static func add(longEnumNonEnumDefault: MyGame_Example_LongEnum, _ fbb: inout FlatBufferBuilder) { fbb.add(element: longEnumNonEnumDefault.rawValue, def: 0, at: VTOFFSET.longEnumNonEnumDefault.p) }
  public static func add(longEnumNormalDefault: MyGame_Example_LongEnum, _ fbb: inout FlatBufferBuilder) { fbb.add(element: longEnumNormalDefault.rawValue, def: 2, at: VTOFFSET.longEnumNormalDefault.p) }
  public static func add(nanDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: nanDefault, def: .nan, at: VTOFFSET.nanDefault.p) }
  public static func add(infDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: infDefault, def: .infinity, at: VTOFFSET.infDefault.p) }
  public static func add(positiveInfDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: positiveInfDefault, def: .infinity, at: VTOFFSET.positiveInfDefault.p) }
  public static func add(infinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: infinityDefault, def: .infinity, at: VTOFFSET.infinityDefault.p) }
  public static func add(positiveInfinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: positiveInfinityDefault, def: .infinity, at: VTOFFSET.positiveInfinityDefault.p) }
  public static func add(negativeInfDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: negativeInfDefault, def: -.infinity, at: VTOFFSET.negativeInfDefault.p) }
  public static func add(negativeInfinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: negativeInfinityDefault, def: -.infinity, at: VTOFFSET.negativeInfinityDefault.p) }
  public static func add(doubleInfDefault: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: doubleInfDefault, def: .infinity, at: VTOFFSET.doubleInfDefault.p) }
  public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); fbb.require(table: end, fields: [10]); return end }
  public static func createMonster(
    _ fbb: inout FlatBufferBuilder,
    pos: MyGame_Example_Vec3? = nil,
    mana: Int16 = 150,
    hp: Int16 = 100,
    nameOffset name: Offset,
    inventoryVectorOffset inventory: Offset = Offset(),
    color: MyGame_Example_Color = .blue,
    testType: MyGame_Example_Any_ = .none_,
    testOffset test: Offset = Offset(),
    test4VectorOffset test4: Offset = Offset(),
    testarrayofstringVectorOffset testarrayofstring: Offset = Offset(),
    testarrayoftablesVectorOffset testarrayoftables: Offset = Offset(),
    enemyOffset enemy: Offset = Offset(),
    testnestedflatbufferVectorOffset testnestedflatbuffer: Offset = Offset(),
    testemptyOffset testempty: Offset = Offset(),
    testbool: Bool = false,
    testhashs32Fnv1: Int32 = 0,
    testhashu32Fnv1: UInt32 = 0,
    testhashs64Fnv1: Int64 = 0,
    testhashu64Fnv1: UInt64 = 0,
    testhashs32Fnv1a: Int32 = 0,
    testhashu32Fnv1a: UInt32 = 0,
    testhashs64Fnv1a: Int64 = 0,
    testhashu64Fnv1a: UInt64 = 0,
    testarrayofboolsVectorOffset testarrayofbools: Offset = Offset(),
    testf: Float32 = 3.14159,
    testf2: Float32 = 3.0,
    testf3: Float32 = 0.0,
    testarrayofstring2VectorOffset testarrayofstring2: Offset = Offset(),
    testarrayofsortedstructVectorOffset testarrayofsortedstruct: Offset = Offset(),
    flexVectorOffset flex: Offset = Offset(),
    test5VectorOffset test5: Offset = Offset(),
    vectorOfLongsVectorOffset vectorOfLongs: Offset = Offset(),
    vectorOfDoublesVectorOffset vectorOfDoubles: Offset = Offset(),
    parentNamespaceTestOffset parentNamespaceTest: Offset = Offset(),
    vectorOfReferrablesVectorOffset vectorOfReferrables: Offset = Offset(),
    singleWeakReference: UInt64 = 0,
    vectorOfWeakReferencesVectorOffset vectorOfWeakReferences: Offset = Offset(),
    vectorOfStrongReferrablesVectorOffset vectorOfStrongReferrables: Offset = Offset(),
    coOwningReference: UInt64 = 0,
    vectorOfCoOwningReferencesVectorOffset vectorOfCoOwningReferences: Offset = Offset(),
    nonOwningReference: UInt64 = 0,
    vectorOfNonOwningReferencesVectorOffset vectorOfNonOwningReferences: Offset = Offset(),
    anyUniqueType: MyGame_Example_AnyUniqueAliases = .none_,
    anyUniqueOffset anyUnique: Offset = Offset(),
    anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases = .none_,
    anyAmbiguousOffset anyAmbiguous: Offset = Offset(),
    vectorOfEnumsVectorOffset vectorOfEnums: Offset = Offset(),
    signedEnum: MyGame_Example_Race = .none_,
    testrequirednestedflatbufferVectorOffset testrequirednestedflatbuffer: Offset = Offset(),
    scalarKeySortedTablesVectorOffset scalarKeySortedTables: Offset = Offset(),
    nativeInline: MyGame_Example_Test? = nil,
    longEnumNonEnumDefault: MyGame_Example_LongEnum = .longone,
    longEnumNormalDefault: MyGame_Example_LongEnum = .longone,
    nanDefault: Float32 = .nan,
    infDefault: Float32 = .infinity,
    positiveInfDefault: Float32 = .infinity,
    infinityDefault: Float32 = .infinity,
    positiveInfinityDefault: Float32 = .infinity,
    negativeInfDefault: Float32 = -.infinity,
    negativeInfinityDefault: Float32 = -.infinity,
    doubleInfDefault: Double = .infinity
  ) -> Offset {
    let __start = MyGame_Example_Monster.startMonster(&fbb)
    MyGame_Example_Monster.add(pos: pos, &fbb)
    MyGame_Example_Monster.add(mana: mana, &fbb)
    MyGame_Example_Monster.add(hp: hp, &fbb)
    MyGame_Example_Monster.add(name: name, &fbb)
    MyGame_Example_Monster.addVectorOf(inventory: inventory, &fbb)
    MyGame_Example_Monster.add(color: color, &fbb)
    MyGame_Example_Monster.add(testType: testType, &fbb)
    MyGame_Example_Monster.add(test: test, &fbb)
    MyGame_Example_Monster.addVectorOf(test4: test4, &fbb)
    MyGame_Example_Monster.addVectorOf(testarrayofstring: testarrayofstring, &fbb)
    MyGame_Example_Monster.addVectorOf(testarrayoftables: testarrayoftables, &fbb)
    MyGame_Example_Monster.add(enemy: enemy, &fbb)
    MyGame_Example_Monster.addVectorOf(testnestedflatbuffer: testnestedflatbuffer, &fbb)
    MyGame_Example_Monster.add(testempty: testempty, &fbb)
    MyGame_Example_Monster.add(testbool: testbool, &fbb)
    MyGame_Example_Monster.add(testhashs32Fnv1: testhashs32Fnv1, &fbb)
    MyGame_Example_Monster.add(testhashu32Fnv1: testhashu32Fnv1, &fbb)
    MyGame_Example_Monster.add(testhashs64Fnv1: testhashs64Fnv1, &fbb)
    MyGame_Example_Monster.add(testhashu64Fnv1: testhashu64Fnv1, &fbb)
    MyGame_Example_Monster.add(testhashs32Fnv1a: testhashs32Fnv1a, &fbb)
    MyGame_Example_Monster.add(testhashu32Fnv1a: testhashu32Fnv1a, &fbb)
    MyGame_Example_Monster.add(testhashs64Fnv1a: testhashs64Fnv1a, &fbb)
    MyGame_Example_Monster.add(testhashu64Fnv1a: testhashu64Fnv1a, &fbb)
    MyGame_Example_Monster.addVectorOf(testarrayofbools: testarrayofbools, &fbb)
    MyGame_Example_Monster.add(testf: testf, &fbb)
    MyGame_Example_Monster.add(testf2: testf2, &fbb)
    MyGame_Example_Monster.add(testf3: testf3, &fbb)
    MyGame_Example_Monster.addVectorOf(testarrayofstring2: testarrayofstring2, &fbb)
    MyGame_Example_Monster.addVectorOf(testarrayofsortedstruct: testarrayofsortedstruct, &fbb)
    MyGame_Example_Monster.addVectorOf(flex: flex, &fbb)
    MyGame_Example_Monster.addVectorOf(test5: test5, &fbb)
    MyGame_Example_Monster.addVectorOf(vectorOfLongs: vectorOfLongs, &fbb)
    MyGame_Example_Monster.addVectorOf(vectorOfDoubles: vectorOfDoubles, &fbb)
    MyGame_Example_Monster.add(parentNamespaceTest: parentNamespaceTest, &fbb)
    MyGame_Example_Monster.addVectorOf(vectorOfReferrables: vectorOfReferrables, &fbb)
    MyGame_Example_Monster.add(singleWeakReference: singleWeakReference, &fbb)
    MyGame_Example_Monster.addVectorOf(vectorOfWeakReferences: vectorOfWeakReferences, &fbb)
    MyGame_Example_Monster.addVectorOf(vectorOfStrongReferrables: vectorOfStrongReferrables, &fbb)
    MyGame_Example_Monster.add(coOwningReference: coOwningReference, &fbb)
    MyGame_Example_Monster.addVectorOf(vectorOfCoOwningReferences: vectorOfCoOwningReferences, &fbb)
    MyGame_Example_Monster.add(nonOwningReference: nonOwningReference, &fbb)
    MyGame_Example_Monster.addVectorOf(vectorOfNonOwningReferences: vectorOfNonOwningReferences, &fbb)
    MyGame_Example_Monster.add(anyUniqueType: anyUniqueType, &fbb)
    MyGame_Example_Monster.add(anyUnique: anyUnique, &fbb)
    MyGame_Example_Monster.add(anyAmbiguousType: anyAmbiguousType, &fbb)
    MyGame_Example_Monster.add(anyAmbiguous: anyAmbiguous, &fbb)
    MyGame_Example_Monster.addVectorOf(vectorOfEnums: vectorOfEnums, &fbb)
    MyGame_Example_Monster.add(signedEnum: signedEnum, &fbb)
    MyGame_Example_Monster.addVectorOf(testrequirednestedflatbuffer: testrequirednestedflatbuffer, &fbb)
    MyGame_Example_Monster.addVectorOf(scalarKeySortedTables: scalarKeySortedTables, &fbb)
    MyGame_Example_Monster.add(nativeInline: nativeInline, &fbb)
    MyGame_Example_Monster.add(longEnumNonEnumDefault: longEnumNonEnumDefault, &fbb)
    MyGame_Example_Monster.add(longEnumNormalDefault: longEnumNormalDefault, &fbb)
    MyGame_Example_Monster.add(nanDefault: nanDefault, &fbb)
    MyGame_Example_Monster.add(infDefault: infDefault, &fbb)
    MyGame_Example_Monster.add(positiveInfDefault: positiveInfDefault, &fbb)
    MyGame_Example_Monster.add(infinityDefault: infinityDefault, &fbb)
    MyGame_Example_Monster.add(positiveInfinityDefault: positiveInfinityDefault, &fbb)
    MyGame_Example_Monster.add(negativeInfDefault: negativeInfDefault, &fbb)
    MyGame_Example_Monster.add(negativeInfinityDefault: negativeInfinityDefault, &fbb)
    MyGame_Example_Monster.add(doubleInfDefault: doubleInfDefault, &fbb)
    return MyGame_Example_Monster.endMonster(&fbb, start: __start)
  }
  public static func sortVectorOfMonster(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {
    var off = offsets
    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 10, fbb: fbb.buffer), Table.offset(Int32($0.o), vOffset: 10, fbb: fbb.buffer), fbb: fbb.buffer) < 0 } 
    return fbb.createVector(ofOffsets: off)
  }
  fileprivate static func lookupByKey(vector: Int32, key: String, fbb: ByteBuffer) -> MyGame_Example_Monster? {
    let key = key.utf8.map { $0 }
    var span = fbb.read(def: Int32.self, position: Int(vector - 4))
    var start: Int32 = 0
    while span != 0 {
      var middle = span / 2
      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)
      let comp = Table.compare(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 10, fbb: fbb), key, fbb: fbb)
      if comp > 0 {
        span = middle
      } else if comp < 0 {
        middle += 1
        start += middle
        span -= middle
      } else {
        return MyGame_Example_Monster(fbb, o: tableOffset)
      }
    }
    return nil
  }
  

  public mutating func unpack() -> MyGame_Example_MonsterT {
    return MyGame_Example_MonsterT(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_MonsterT?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_MonsterT) -> Offset {
    let __name = builder.create(string: obj.name)
    let __inventory = builder.createVector(obj.inventory)
    let __test = obj.test?.pack(builder: &builder) ?? Offset()
    MyGame_Example_Monster.startVectorOfTest4(obj.test4.count, in: &builder)
    for i in obj.test4 {
      guard let _o = i else { continue }
      builder.create(struct: _o)
    }
    let __test4 = builder.endVector(len: obj.test4.count)
    let __testarrayofstring = builder.createVector(ofStrings: obj.testarrayofstring.compactMap({ $0 }) )
    var __testarrayoftables__: [Offset] = []
    for var i in obj.testarrayoftables {
      __testarrayoftables__.append(MyGame_Example_Monster.pack(&builder, obj: &i))
    }
    let __testarrayoftables = builder.createVector(ofOffsets: __testarrayoftables__)
    let __enemy = MyGame_Example_Monster.pack(&builder, obj: &obj.enemy)
    let __testnestedflatbuffer = builder.createVector(obj.testnestedflatbuffer)
    let __testempty = MyGame_Example_Stat.pack(&builder, obj: &obj.testempty)
    let __testarrayofbools = builder.createVector(obj.testarrayofbools)
    let __testarrayofstring2 = builder.createVector(ofStrings: obj.testarrayofstring2.compactMap({ $0 }) )
    MyGame_Example_Monster.startVectorOfTestarrayofsortedstruct(obj.testarrayofsortedstruct.count, in: &builder)
    for i in obj.testarrayofsortedstruct {
      guard let _o = i else { continue }
      builder.create(struct: _o)
    }
    let __testarrayofsortedstruct = builder.endVector(len: obj.testarrayofsortedstruct.count)
    let __flex = builder.createVector(obj.flex)
    MyGame_Example_Monster.startVectorOfTest5(obj.test5.count, in: &builder)
    for i in obj.test5 {
      guard let _o = i else { continue }
      builder.create(struct: _o)
    }
    let __test5 = builder.endVector(len: obj.test5.count)
    let __vectorOfLongs = builder.createVector(obj.vectorOfLongs)
    let __vectorOfDoubles = builder.createVector(obj.vectorOfDoubles)
    let __parentNamespaceTest = MyGame_InParentNamespace.pack(&builder, obj: &obj.parentNamespaceTest)
    var __vectorOfReferrables__: [Offset] = []
    for var i in obj.vectorOfReferrables {
      __vectorOfReferrables__.append(MyGame_Example_Referrable.pack(&builder, obj: &i))
    }
    let __vectorOfReferrables = builder.createVector(ofOffsets: __vectorOfReferrables__)
    let __vectorOfWeakReferences = builder.createVector(obj.vectorOfWeakReferences)
    var __vectorOfStrongReferrables__: [Offset] = []
    for var i in obj.vectorOfStrongReferrables {
      __vectorOfStrongReferrables__.append(MyGame_Example_Referrable.pack(&builder, obj: &i))
    }
    let __vectorOfStrongReferrables = builder.createVector(ofOffsets: __vectorOfStrongReferrables__)
    let __vectorOfCoOwningReferences = builder.createVector(obj.vectorOfCoOwningReferences)
    let __vectorOfNonOwningReferences = builder.createVector(obj.vectorOfNonOwningReferences)
    let __anyUnique = obj.anyUnique?.pack(builder: &builder) ?? Offset()
    let __anyAmbiguous = obj.anyAmbiguous?.pack(builder: &builder) ?? Offset()
    let __vectorOfEnums = builder.createVector(obj.vectorOfEnums)
    let __testrequirednestedflatbuffer = builder.createVector(obj.testrequirednestedflatbuffer)
    var __scalarKeySortedTables__: [Offset] = []
    for var i in obj.scalarKeySortedTables {
      __scalarKeySortedTables__.append(MyGame_Example_Stat.pack(&builder, obj: &i))
    }
    let __scalarKeySortedTables = builder.createVector(ofOffsets: __scalarKeySortedTables__)
    let __root = MyGame_Example_Monster.startMonster(&builder)
    MyGame_Example_Monster.add(pos: obj.pos, &builder)
    MyGame_Example_Monster.add(mana: obj.mana, &builder)
    MyGame_Example_Monster.add(hp: obj.hp, &builder)
    MyGame_Example_Monster.add(name: __name, &builder)
    MyGame_Example_Monster.addVectorOf(inventory: __inventory, &builder)
    MyGame_Example_Monster.add(color: obj.color, &builder)
    if let o = obj.test?.type {
      MyGame_Example_Monster.add(testType: o, &builder)
      MyGame_Example_Monster.add(test: __test, &builder)
    }

    MyGame_Example_Monster.addVectorOf(test4: __test4, &builder)
    MyGame_Example_Monster.addVectorOf(testarrayofstring: __testarrayofstring, &builder)
    MyGame_Example_Monster.addVectorOf(testarrayoftables: __testarrayoftables, &builder)
    MyGame_Example_Monster.add(enemy: __enemy, &builder)
    MyGame_Example_Monster.addVectorOf(testnestedflatbuffer: __testnestedflatbuffer, &builder)
    MyGame_Example_Monster.add(testempty: __testempty, &builder)
    MyGame_Example_Monster.add(testbool: obj.testbool, &builder)
    MyGame_Example_Monster.add(testhashs32Fnv1: obj.testhashs32Fnv1, &builder)
    MyGame_Example_Monster.add(testhashu32Fnv1: obj.testhashu32Fnv1, &builder)
    MyGame_Example_Monster.add(testhashs64Fnv1: obj.testhashs64Fnv1, &builder)
    MyGame_Example_Monster.add(testhashu64Fnv1: obj.testhashu64Fnv1, &builder)
    MyGame_Example_Monster.add(testhashs32Fnv1a: obj.testhashs32Fnv1a, &builder)
    MyGame_Example_Monster.add(testhashu32Fnv1a: obj.testhashu32Fnv1a, &builder)
    MyGame_Example_Monster.add(testhashs64Fnv1a: obj.testhashs64Fnv1a, &builder)
    MyGame_Example_Monster.add(testhashu64Fnv1a: obj.testhashu64Fnv1a, &builder)
    MyGame_Example_Monster.addVectorOf(testarrayofbools: __testarrayofbools, &builder)
    MyGame_Example_Monster.add(testf: obj.testf, &builder)
    MyGame_Example_Monster.add(testf2: obj.testf2, &builder)
    MyGame_Example_Monster.add(testf3: obj.testf3, &builder)
    MyGame_Example_Monster.addVectorOf(testarrayofstring2: __testarrayofstring2, &builder)
    MyGame_Example_Monster.addVectorOf(testarrayofsortedstruct: __testarrayofsortedstruct, &builder)
    MyGame_Example_Monster.addVectorOf(flex: __flex, &builder)
    MyGame_Example_Monster.addVectorOf(test5: __test5, &builder)
    MyGame_Example_Monster.addVectorOf(vectorOfLongs: __vectorOfLongs, &builder)
    MyGame_Example_Monster.addVectorOf(vectorOfDoubles: __vectorOfDoubles, &builder)
    MyGame_Example_Monster.add(parentNamespaceTest: __parentNamespaceTest, &builder)
    MyGame_Example_Monster.addVectorOf(vectorOfReferrables: __vectorOfReferrables, &builder)
    MyGame_Example_Monster.add(singleWeakReference: obj.singleWeakReference, &builder)
    MyGame_Example_Monster.addVectorOf(vectorOfWeakReferences: __vectorOfWeakReferences, &builder)
    MyGame_Example_Monster.addVectorOf(vectorOfStrongReferrables: __vectorOfStrongReferrables, &builder)
    MyGame_Example_Monster.add(coOwningReference: obj.coOwningReference, &builder)
    MyGame_Example_Monster.addVectorOf(vectorOfCoOwningReferences: __vectorOfCoOwningReferences, &builder)
    MyGame_Example_Monster.add(nonOwningReference: obj.nonOwningReference, &builder)
    MyGame_Example_Monster.addVectorOf(vectorOfNonOwningReferences: __vectorOfNonOwningReferences, &builder)
    if let o = obj.anyUnique?.type {
      MyGame_Example_Monster.add(anyUniqueType: o, &builder)
      MyGame_Example_Monster.add(anyUnique: __anyUnique, &builder)
    }

    if let o = obj.anyAmbiguous?.type {
      MyGame_Example_Monster.add(anyAmbiguousType: o, &builder)
      MyGame_Example_Monster.add(anyAmbiguous: __anyAmbiguous, &builder)
    }

    MyGame_Example_Monster.addVectorOf(vectorOfEnums: __vectorOfEnums, &builder)
    MyGame_Example_Monster.add(signedEnum: obj.signedEnum, &builder)
    MyGame_Example_Monster.addVectorOf(testrequirednestedflatbuffer: __testrequirednestedflatbuffer, &builder)
    MyGame_Example_Monster.addVectorOf(scalarKeySortedTables: __scalarKeySortedTables, &builder)
    MyGame_Example_Monster.add(nativeInline: obj.nativeInline, &builder)
    MyGame_Example_Monster.add(longEnumNonEnumDefault: obj.longEnumNonEnumDefault, &builder)
    MyGame_Example_Monster.add(longEnumNormalDefault: obj.longEnumNormalDefault, &builder)
    MyGame_Example_Monster.add(nanDefault: obj.nanDefault, &builder)
    MyGame_Example_Monster.add(infDefault: obj.infDefault, &builder)
    MyGame_Example_Monster.add(positiveInfDefault: obj.positiveInfDefault, &builder)
    MyGame_Example_Monster.add(infinityDefault: obj.infinityDefault, &builder)
    MyGame_Example_Monster.add(positiveInfinityDefault: obj.positiveInfinityDefault, &builder)
    MyGame_Example_Monster.add(negativeInfDefault: obj.negativeInfDefault, &builder)
    MyGame_Example_Monster.add(negativeInfinityDefault: obj.negativeInfinityDefault, &builder)
    MyGame_Example_Monster.add(doubleInfDefault: obj.doubleInfDefault, &builder)
    return MyGame_Example_Monster.endMonster(&builder, start: __root)
  }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    var _v = try verifier.visitTable(at: position)
    try _v.visit(field: VTOFFSET.pos.p, fieldName: "pos", required: false, type: MyGame_Example_Vec3.self)
    try _v.visit(field: VTOFFSET.mana.p, fieldName: "mana", required: false, type: Int16.self)
    try _v.visit(field: VTOFFSET.hp.p, fieldName: "hp", required: false, type: Int16.self)
    try _v.visit(field: VTOFFSET.name.p, fieldName: "name", required: true, type: ForwardOffset<String>.self)
    try _v.visit(field: VTOFFSET.inventory.p, fieldName: "inventory", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)
    try _v.visit(field: VTOFFSET.color.p, fieldName: "color", required: false, type: MyGame_Example_Color.self)
    try _v.visit(unionKey: VTOFFSET.testType.p, unionField: VTOFFSET.test.p, unionKeyName: "testType", fieldName: "test", required: false, completion: { (verifier, key: MyGame_Example_Any_, pos) in
      switch key {
      case .none_:
        break // NOTE - SWIFT doesnt support none
      case .monster:
        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)
      case .testsimpletablewithenum:
        try ForwardOffset<MyGame_Example_TestSimpleTableWithEnum>.verify(&verifier, at: pos, of: MyGame_Example_TestSimpleTableWithEnum.self)
      case .mygameExample2Monster:
        try ForwardOffset<MyGame_Example2_Monster>.verify(&verifier, at: pos, of: MyGame_Example2_Monster.self)
      }
    })
    try _v.visit(field: VTOFFSET.test4.p, fieldName: "test4", required: false, type: ForwardOffset<Vector<MyGame_Example_Test, MyGame_Example_Test>>.self)
    try _v.visit(field: VTOFFSET.testarrayofstring.p, fieldName: "testarrayofstring", required: false, type: ForwardOffset<Vector<ForwardOffset<String>, String>>.self)
    try _v.visit(field: VTOFFSET.testarrayoftables.p, fieldName: "testarrayoftables", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Monster>, MyGame_Example_Monster>>.self)
    try _v.visit(field: VTOFFSET.enemy.p, fieldName: "enemy", required: false, type: ForwardOffset<MyGame_Example_Monster>.self)
    try _v.visit(field: VTOFFSET.testnestedflatbuffer.p, fieldName: "testnestedflatbuffer", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)
    try _v.visit(field: VTOFFSET.testempty.p, fieldName: "testempty", required: false, type: ForwardOffset<MyGame_Example_Stat>.self)
    try _v.visit(field: VTOFFSET.testbool.p, fieldName: "testbool", required: false, type: Bool.self)
    try _v.visit(field: VTOFFSET.testhashs32Fnv1.p, fieldName: "testhashs32Fnv1", required: false, type: Int32.self)
    try _v.visit(field: VTOFFSET.testhashu32Fnv1.p, fieldName: "testhashu32Fnv1", required: false, type: UInt32.self)
    try _v.visit(field: VTOFFSET.testhashs64Fnv1.p, fieldName: "testhashs64Fnv1", required: false, type: Int64.self)
    try _v.visit(field: VTOFFSET.testhashu64Fnv1.p, fieldName: "testhashu64Fnv1", required: false, type: UInt64.self)
    try _v.visit(field: VTOFFSET.testhashs32Fnv1a.p, fieldName: "testhashs32Fnv1a", required: false, type: Int32.self)
    try _v.visit(field: VTOFFSET.testhashu32Fnv1a.p, fieldName: "testhashu32Fnv1a", required: false, type: UInt32.self)
    try _v.visit(field: VTOFFSET.testhashs64Fnv1a.p, fieldName: "testhashs64Fnv1a", required: false, type: Int64.self)
    try _v.visit(field: VTOFFSET.testhashu64Fnv1a.p, fieldName: "testhashu64Fnv1a", required: false, type: UInt64.self)
    try _v.visit(field: VTOFFSET.testarrayofbools.p, fieldName: "testarrayofbools", required: false, type: ForwardOffset<Vector<Bool, Bool>>.self)
    try _v.visit(field: VTOFFSET.testf.p, fieldName: "testf", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.testf2.p, fieldName: "testf2", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.testf3.p, fieldName: "testf3", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.testarrayofstring2.p, fieldName: "testarrayofstring2", required: false, type: ForwardOffset<Vector<ForwardOffset<String>, String>>.self)
    try _v.visit(field: VTOFFSET.testarrayofsortedstruct.p, fieldName: "testarrayofsortedstruct", required: false, type: ForwardOffset<Vector<MyGame_Example_Ability, MyGame_Example_Ability>>.self)
    try _v.visit(field: VTOFFSET.flex.p, fieldName: "flex", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)
    try _v.visit(field: VTOFFSET.test5.p, fieldName: "test5", required: false, type: ForwardOffset<Vector<MyGame_Example_Test, MyGame_Example_Test>>.self)
    try _v.visit(field: VTOFFSET.vectorOfLongs.p, fieldName: "vectorOfLongs", required: false, type: ForwardOffset<Vector<Int64, Int64>>.self)
    try _v.visit(field: VTOFFSET.vectorOfDoubles.p, fieldName: "vectorOfDoubles", required: false, type: ForwardOffset<Vector<Double, Double>>.self)
    try _v.visit(field: VTOFFSET.parentNamespaceTest.p, fieldName: "parentNamespaceTest", required: false, type: ForwardOffset<MyGame_InParentNamespace>.self)
    try _v.visit(field: VTOFFSET.vectorOfReferrables.p, fieldName: "vectorOfReferrables", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Referrable>, MyGame_Example_Referrable>>.self)
    try _v.visit(field: VTOFFSET.singleWeakReference.p, fieldName: "singleWeakReference", required: false, type: UInt64.self)
    try _v.visit(field: VTOFFSET.vectorOfWeakReferences.p, fieldName: "vectorOfWeakReferences", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)
    try _v.visit(field: VTOFFSET.vectorOfStrongReferrables.p, fieldName: "vectorOfStrongReferrables", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Referrable>, MyGame_Example_Referrable>>.self)
    try _v.visit(field: VTOFFSET.coOwningReference.p, fieldName: "coOwningReference", required: false, type: UInt64.self)
    try _v.visit(field: VTOFFSET.vectorOfCoOwningReferences.p, fieldName: "vectorOfCoOwningReferences", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)
    try _v.visit(field: VTOFFSET.nonOwningReference.p, fieldName: "nonOwningReference", required: false, type: UInt64.self)
    try _v.visit(field: VTOFFSET.vectorOfNonOwningReferences.p, fieldName: "vectorOfNonOwningReferences", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)
    try _v.visit(unionKey: VTOFFSET.anyUniqueType.p, unionField: VTOFFSET.anyUnique.p, unionKeyName: "anyUniqueType", fieldName: "anyUnique", required: false, completion: { (verifier, key: MyGame_Example_AnyUniqueAliases, pos) in
      switch key {
      case .none_:
        break // NOTE - SWIFT doesnt support none
      case .m:
        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)
      case .ts:
        try ForwardOffset<MyGame_Example_TestSimpleTableWithEnum>.verify(&verifier, at: pos, of: MyGame_Example_TestSimpleTableWithEnum.self)
      case .m2:
        try ForwardOffset<MyGame_Example2_Monster>.verify(&verifier, at: pos, of: MyGame_Example2_Monster.self)
      }
    })
    try _v.visit(unionKey: VTOFFSET.anyAmbiguousType.p, unionField: VTOFFSET.anyAmbiguous.p, unionKeyName: "anyAmbiguousType", fieldName: "anyAmbiguous", required: false, completion: { (verifier, key: MyGame_Example_AnyAmbiguousAliases, pos) in
      switch key {
      case .none_:
        break // NOTE - SWIFT doesnt support none
      case .m1:
        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)
      case .m2:
        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)
      case .m3:
        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)
      }
    })
    try _v.visit(field: VTOFFSET.vectorOfEnums.p, fieldName: "vectorOfEnums", required: false, type: ForwardOffset<Vector<MyGame_Example_Color, MyGame_Example_Color>>.self)
    try _v.visit(field: VTOFFSET.signedEnum.p, fieldName: "signedEnum", required: false, type: MyGame_Example_Race.self)
    try _v.visit(field: VTOFFSET.testrequirednestedflatbuffer.p, fieldName: "testrequirednestedflatbuffer", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)
    try _v.visit(field: VTOFFSET.scalarKeySortedTables.p, fieldName: "scalarKeySortedTables", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Stat>, MyGame_Example_Stat>>.self)
    try _v.visit(field: VTOFFSET.nativeInline.p, fieldName: "nativeInline", required: false, type: MyGame_Example_Test.self)
    try _v.visit(field: VTOFFSET.longEnumNonEnumDefault.p, fieldName: "longEnumNonEnumDefault", required: false, type: MyGame_Example_LongEnum.self)
    try _v.visit(field: VTOFFSET.longEnumNormalDefault.p, fieldName: "longEnumNormalDefault", required: false, type: MyGame_Example_LongEnum.self)
    try _v.visit(field: VTOFFSET.nanDefault.p, fieldName: "nanDefault", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.infDefault.p, fieldName: "infDefault", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.positiveInfDefault.p, fieldName: "positiveInfDefault", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.infinityDefault.p, fieldName: "infinityDefault", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.positiveInfinityDefault.p, fieldName: "positiveInfinityDefault", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.negativeInfDefault.p, fieldName: "negativeInfDefault", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.negativeInfinityDefault.p, fieldName: "negativeInfinityDefault", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.doubleInfDefault.p, fieldName: "doubleInfDefault", required: false, type: Double.self)
    _v.finish()
  }
}

extension MyGame_Example_Monster: Encodable {

  enum CodingKeys: String, CodingKey {
    case pos = "pos"
    case mana = "mana"
    case hp = "hp"
    case name = "name"
    case inventory = "inventory"
    case color = "color"
    case testType = "test_type"
    case test = "test"
    case test4 = "test4"
    case testarrayofstring = "testarrayofstring"
    case testarrayoftables = "testarrayoftables"
    case enemy = "enemy"
    case testnestedflatbuffer = "testnestedflatbuffer"
    case testempty = "testempty"
    case testbool = "testbool"
    case testhashs32Fnv1 = "testhashs32_fnv1"
    case testhashu32Fnv1 = "testhashu32_fnv1"
    case testhashs64Fnv1 = "testhashs64_fnv1"
    case testhashu64Fnv1 = "testhashu64_fnv1"
    case testhashs32Fnv1a = "testhashs32_fnv1a"
    case testhashu32Fnv1a = "testhashu32_fnv1a"
    case testhashs64Fnv1a = "testhashs64_fnv1a"
    case testhashu64Fnv1a = "testhashu64_fnv1a"
    case testarrayofbools = "testarrayofbools"
    case testf = "testf"
    case testf2 = "testf2"
    case testf3 = "testf3"
    case testarrayofstring2 = "testarrayofstring2"
    case testarrayofsortedstruct = "testarrayofsortedstruct"
    case flex = "flex"
    case test5 = "test5"
    case vectorOfLongs = "vector_of_longs"
    case vectorOfDoubles = "vector_of_doubles"
    case parentNamespaceTest = "parent_namespace_test"
    case vectorOfReferrables = "vector_of_referrables"
    case singleWeakReference = "single_weak_reference"
    case vectorOfWeakReferences = "vector_of_weak_references"
    case vectorOfStrongReferrables = "vector_of_strong_referrables"
    case coOwningReference = "co_owning_reference"
    case vectorOfCoOwningReferences = "vector_of_co_owning_references"
    case nonOwningReference = "non_owning_reference"
    case vectorOfNonOwningReferences = "vector_of_non_owning_references"
    case anyUniqueType = "any_unique_type"
    case anyUnique = "any_unique"
    case anyAmbiguousType = "any_ambiguous_type"
    case anyAmbiguous = "any_ambiguous"
    case vectorOfEnums = "vector_of_enums"
    case signedEnum = "signed_enum"
    case testrequirednestedflatbuffer = "testrequirednestedflatbuffer"
    case scalarKeySortedTables = "scalar_key_sorted_tables"
    case nativeInline = "native_inline"
    case longEnumNonEnumDefault = "long_enum_non_enum_default"
    case longEnumNormalDefault = "long_enum_normal_default"
    case nanDefault = "nan_default"
    case infDefault = "inf_default"
    case positiveInfDefault = "positive_inf_default"
    case infinityDefault = "infinity_default"
    case positiveInfinityDefault = "positive_infinity_default"
    case negativeInfDefault = "negative_inf_default"
    case negativeInfinityDefault = "negative_infinity_default"
    case doubleInfDefault = "double_inf_default"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encodeIfPresent(pos, forKey: .pos)
    if mana != 150 {
      try container.encodeIfPresent(mana, forKey: .mana)
    }
    if hp != 100 {
      try container.encodeIfPresent(hp, forKey: .hp)
    }
    try container.encodeIfPresent(name, forKey: .name)
    if inventoryCount > 0 {
      try container.encodeIfPresent(inventory, forKey: .inventory)
    }
    if color != .blue {
      try container.encodeIfPresent(color, forKey: .color)
    }
    if testType != .none_ {
      try container.encodeIfPresent(testType, forKey: .testType)
    }
    switch testType {
    case .monster:
      let _v = test(type: MyGame_Example_Monster.self)
      try container.encodeIfPresent(_v, forKey: .test)
    case .testsimpletablewithenum:
      let _v = test(type: MyGame_Example_TestSimpleTableWithEnum.self)
      try container.encodeIfPresent(_v, forKey: .test)
    case .mygameExample2Monster:
      let _v = test(type: MyGame_Example2_Monster.self)
      try container.encodeIfPresent(_v, forKey: .test)
    default: break;
    }
    if test4Count > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .test4)
      for index in 0..<test4Count {
        guard let type = test4(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    if testarrayofstringCount > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .testarrayofstring)
      for index in 0..<testarrayofstringCount {
        guard let type = testarrayofstring(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    if testarrayoftablesCount > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .testarrayoftables)
      for index in 0..<testarrayoftablesCount {
        guard let type = testarrayoftables(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    try container.encodeIfPresent(enemy, forKey: .enemy)
    if testnestedflatbufferCount > 0 {
      try container.encodeIfPresent(testnestedflatbuffer, forKey: .testnestedflatbuffer)
    }
    try container.encodeIfPresent(testempty, forKey: .testempty)
    if testbool != false {
      try container.encodeIfPresent(testbool, forKey: .testbool)
    }
    if testhashs32Fnv1 != 0 {
      try container.encodeIfPresent(testhashs32Fnv1, forKey: .testhashs32Fnv1)
    }
    if testhashu32Fnv1 != 0 {
      try container.encodeIfPresent(testhashu32Fnv1, forKey: .testhashu32Fnv1)
    }
    if testhashs64Fnv1 != 0 {
      try container.encodeIfPresent(testhashs64Fnv1, forKey: .testhashs64Fnv1)
    }
    if testhashu64Fnv1 != 0 {
      try container.encodeIfPresent(testhashu64Fnv1, forKey: .testhashu64Fnv1)
    }
    if testhashs32Fnv1a != 0 {
      try container.encodeIfPresent(testhashs32Fnv1a, forKey: .testhashs32Fnv1a)
    }
    if testhashu32Fnv1a != 0 {
      try container.encodeIfPresent(testhashu32Fnv1a, forKey: .testhashu32Fnv1a)
    }
    if testhashs64Fnv1a != 0 {
      try container.encodeIfPresent(testhashs64Fnv1a, forKey: .testhashs64Fnv1a)
    }
    if testhashu64Fnv1a != 0 {
      try container.encodeIfPresent(testhashu64Fnv1a, forKey: .testhashu64Fnv1a)
    }
    if testarrayofboolsCount > 0 {
      try container.encodeIfPresent(testarrayofbools, forKey: .testarrayofbools)
    }
    if testf != 3.14159 {
      try container.encodeIfPresent(testf, forKey: .testf)
    }
    if testf2 != 3.0 {
      try container.encodeIfPresent(testf2, forKey: .testf2)
    }
    if testf3 != 0.0 {
      try container.encodeIfPresent(testf3, forKey: .testf3)
    }
    if testarrayofstring2Count > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .testarrayofstring2)
      for index in 0..<testarrayofstring2Count {
        guard let type = testarrayofstring2(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    if testarrayofsortedstructCount > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .testarrayofsortedstruct)
      for index in 0..<testarrayofsortedstructCount {
        guard let type = testarrayofsortedstruct(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    if flexCount > 0 {
      try container.encodeIfPresent(flex, forKey: .flex)
    }
    if test5Count > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .test5)
      for index in 0..<test5Count {
        guard let type = test5(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    if vectorOfLongsCount > 0 {
      try container.encodeIfPresent(vectorOfLongs, forKey: .vectorOfLongs)
    }
    if vectorOfDoublesCount > 0 {
      try container.encodeIfPresent(vectorOfDoubles, forKey: .vectorOfDoubles)
    }
    try container.encodeIfPresent(parentNamespaceTest, forKey: .parentNamespaceTest)
    if vectorOfReferrablesCount > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .vectorOfReferrables)
      for index in 0..<vectorOfReferrablesCount {
        guard let type = vectorOfReferrables(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    if singleWeakReference != 0 {
      try container.encodeIfPresent(singleWeakReference, forKey: .singleWeakReference)
    }
    if vectorOfWeakReferencesCount > 0 {
      try container.encodeIfPresent(vectorOfWeakReferences, forKey: .vectorOfWeakReferences)
    }
    if vectorOfStrongReferrablesCount > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .vectorOfStrongReferrables)
      for index in 0..<vectorOfStrongReferrablesCount {
        guard let type = vectorOfStrongReferrables(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    if coOwningReference != 0 {
      try container.encodeIfPresent(coOwningReference, forKey: .coOwningReference)
    }
    if vectorOfCoOwningReferencesCount > 0 {
      try container.encodeIfPresent(vectorOfCoOwningReferences, forKey: .vectorOfCoOwningReferences)
    }
    if nonOwningReference != 0 {
      try container.encodeIfPresent(nonOwningReference, forKey: .nonOwningReference)
    }
    if vectorOfNonOwningReferencesCount > 0 {
      try container.encodeIfPresent(vectorOfNonOwningReferences, forKey: .vectorOfNonOwningReferences)
    }
    if anyUniqueType != .none_ {
      try container.encodeIfPresent(anyUniqueType, forKey: .anyUniqueType)
    }
    switch anyUniqueType {
    case .m:
      let _v = anyUnique(type: MyGame_Example_Monster.self)
      try container.encodeIfPresent(_v, forKey: .anyUnique)
    case .ts:
      let _v = anyUnique(type: MyGame_Example_TestSimpleTableWithEnum.self)
      try container.encodeIfPresent(_v, forKey: .anyUnique)
    case .m2:
      let _v = anyUnique(type: MyGame_Example2_Monster.self)
      try container.encodeIfPresent(_v, forKey: .anyUnique)
    default: break;
    }
    if anyAmbiguousType != .none_ {
      try container.encodeIfPresent(anyAmbiguousType, forKey: .anyAmbiguousType)
    }
    switch anyAmbiguousType {
    case .m1:
      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)
      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)
    case .m2:
      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)
      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)
    case .m3:
      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)
      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)
    default: break;
    }
    if vectorOfEnumsCount > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .vectorOfEnums)
      for index in 0..<vectorOfEnumsCount {
        guard let type = vectorOfEnums(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    if signedEnum != .none_ {
      try container.encodeIfPresent(signedEnum, forKey: .signedEnum)
    }
    if testrequirednestedflatbufferCount > 0 {
      try container.encodeIfPresent(testrequirednestedflatbuffer, forKey: .testrequirednestedflatbuffer)
    }
    if scalarKeySortedTablesCount > 0 {
      var contentEncoder = container.nestedUnkeyedContainer(forKey: .scalarKeySortedTables)
      for index in 0..<scalarKeySortedTablesCount {
        guard let type = scalarKeySortedTables(at: index) else { continue }
        try contentEncoder.encode(type)
      }
    }
    try container.encodeIfPresent(nativeInline, forKey: .nativeInline)
    if longEnumNonEnumDefault != .longone {
      try container.encodeIfPresent(longEnumNonEnumDefault, forKey: .longEnumNonEnumDefault)
    }
    if longEnumNormalDefault != .longone {
      try container.encodeIfPresent(longEnumNormalDefault, forKey: .longEnumNormalDefault)
    }
    if !nanDefault.isNaN {
      try container.encodeIfPresent(nanDefault, forKey: .nanDefault)
    }
    if infDefault != .infinity {
      try container.encodeIfPresent(infDefault, forKey: .infDefault)
    }
    if positiveInfDefault != .infinity {
      try container.encodeIfPresent(positiveInfDefault, forKey: .positiveInfDefault)
    }
    if infinityDefault != .infinity {
      try container.encodeIfPresent(infinityDefault, forKey: .infinityDefault)
    }
    if positiveInfinityDefault != .infinity {
      try container.encodeIfPresent(positiveInfinityDefault, forKey: .positiveInfinityDefault)
    }
    if negativeInfDefault != -.infinity {
      try container.encodeIfPresent(negativeInfDefault, forKey: .negativeInfDefault)
    }
    if negativeInfinityDefault != -.infinity {
      try container.encodeIfPresent(negativeInfinityDefault, forKey: .negativeInfinityDefault)
    }
    if doubleInfDefault != .infinity {
      try container.encodeIfPresent(doubleInfDefault, forKey: .doubleInfDefault)
    }
  }
}

public class MyGame_Example_MonsterT: NativeObject {

  public var pos: MyGame_Example_Vec3?
  public var mana: Int16
  public var hp: Int16
  public var name: String
  public var inventory: [UInt8]
  public var color: MyGame_Example_Color
  public var test: MyGame_Example_Any_Union?
  public var test4: [MyGame_Example_Test?]
  public var testarrayofstring: [String?]
  public var testarrayoftables: [MyGame_Example_MonsterT?]
  public var enemy: MyGame_Example_MonsterT?
  public var testnestedflatbuffer: [UInt8]
  public var testempty: MyGame_Example_StatT?
  public var testbool: Bool
  public var testhashs32Fnv1: Int32
  public var testhashu32Fnv1: UInt32
  public var testhashs64Fnv1: Int64
  public var testhashu64Fnv1: UInt64
  public var testhashs32Fnv1a: Int32
  public var testhashu32Fnv1a: UInt32
  public var testhashs64Fnv1a: Int64
  public var testhashu64Fnv1a: UInt64
  public var testarrayofbools: [Bool]
  public var testf: Float32
  public var testf2: Float32
  public var testf3: Float32
  public var testarrayofstring2: [String?]
  public var testarrayofsortedstruct: [MyGame_Example_Ability?]
  public var flex: [UInt8]
  public var test5: [MyGame_Example_Test?]
  public var vectorOfLongs: [Int64]
  public var vectorOfDoubles: [Double]
  public var parentNamespaceTest: MyGame_InParentNamespaceT?
  public var vectorOfReferrables: [MyGame_Example_ReferrableT?]
  public var singleWeakReference: UInt64
  public var vectorOfWeakReferences: [UInt64]
  public var vectorOfStrongReferrables: [MyGame_Example_ReferrableT?]
  public var coOwningReference: UInt64
  public var vectorOfCoOwningReferences: [UInt64]
  public var nonOwningReference: UInt64
  public var vectorOfNonOwningReferences: [UInt64]
  public var anyUnique: MyGame_Example_AnyUniqueAliasesUnion?
  public var anyAmbiguous: MyGame_Example_AnyAmbiguousAliasesUnion?
  public var vectorOfEnums: [MyGame_Example_Color]
  public var signedEnum: MyGame_Example_Race
  public var testrequirednestedflatbuffer: [UInt8]
  public var scalarKeySortedTables: [MyGame_Example_StatT?]
  public var nativeInline: MyGame_Example_Test?
  public var longEnumNonEnumDefault: MyGame_Example_LongEnum
  public var longEnumNormalDefault: MyGame_Example_LongEnum
  public var nanDefault: Float32
  public var infDefault: Float32
  public var positiveInfDefault: Float32
  public var infinityDefault: Float32
  public var positiveInfinityDefault: Float32
  public var negativeInfDefault: Float32
  public var negativeInfinityDefault: Float32
  public var doubleInfDefault: Double

  public init(_ _t: inout MyGame_Example_Monster) {
    pos = _t.pos
    mana = _t.mana
    hp = _t.hp
    name = _t.name
    inventory = []
    for index in 0..<_t.inventoryCount {
        inventory.append(_t.inventory(at: index))
    }
    color = _t.color
    switch _t.testType {
    case .monster:
      var _v = _t.test(type: MyGame_Example_Monster.self)
      test = MyGame_Example_Any_Union(_v?.unpack(), type: .monster)
    case .testsimpletablewithenum:
      var _v = _t.test(type: MyGame_Example_TestSimpleTableWithEnum.self)
      test = MyGame_Example_Any_Union(_v?.unpack(), type: .testsimpletablewithenum)
    case .mygameExample2Monster:
      var _v = _t.test(type: MyGame_Example2_Monster.self)
      test = MyGame_Example_Any_Union(_v?.unpack(), type: .mygameExample2Monster)
    default: break
    }
    test4 = []
    for index in 0..<_t.test4Count {
        test4.append(_t.test4(at: index))
    }
    testarrayofstring = []
    for index in 0..<_t.testarrayofstringCount {
        testarrayofstring.append(_t.testarrayofstring(at: index))
    }
    testarrayoftables = []
    for index in 0..<_t.testarrayoftablesCount {
        var __v_ = _t.testarrayoftables(at: index)
        testarrayoftables.append(__v_?.unpack())
    }
    var __enemy = _t.enemy
    enemy = __enemy?.unpack()
    testnestedflatbuffer = []
    for index in 0..<_t.testnestedflatbufferCount {
        testnestedflatbuffer.append(_t.testnestedflatbuffer(at: index))
    }
    var __testempty = _t.testempty
    testempty = __testempty?.unpack()
    testbool = _t.testbool
    testhashs32Fnv1 = _t.testhashs32Fnv1
    testhashu32Fnv1 = _t.testhashu32Fnv1
    testhashs64Fnv1 = _t.testhashs64Fnv1
    testhashu64Fnv1 = _t.testhashu64Fnv1
    testhashs32Fnv1a = _t.testhashs32Fnv1a
    testhashu32Fnv1a = _t.testhashu32Fnv1a
    testhashs64Fnv1a = _t.testhashs64Fnv1a
    testhashu64Fnv1a = _t.testhashu64Fnv1a
    testarrayofbools = []
    for index in 0..<_t.testarrayofboolsCount {
        testarrayofbools.append(_t.testarrayofbools(at: index))
    }
    testf = _t.testf
    testf2 = _t.testf2
    testf3 = _t.testf3
    testarrayofstring2 = []
    for index in 0..<_t.testarrayofstring2Count {
        testarrayofstring2.append(_t.testarrayofstring2(at: index))
    }
    testarrayofsortedstruct = []
    for index in 0..<_t.testarrayofsortedstructCount {
        testarrayofsortedstruct.append(_t.testarrayofsortedstruct(at: index))
    }
    flex = []
    for index in 0..<_t.flexCount {
        flex.append(_t.flex(at: index))
    }
    test5 = []
    for index in 0..<_t.test5Count {
        test5.append(_t.test5(at: index))
    }
    vectorOfLongs = []
    for index in 0..<_t.vectorOfLongsCount {
        vectorOfLongs.append(_t.vectorOfLongs(at: index))
    }
    vectorOfDoubles = []
    for index in 0..<_t.vectorOfDoublesCount {
        vectorOfDoubles.append(_t.vectorOfDoubles(at: index))
    }
    var __parentNamespaceTest = _t.parentNamespaceTest
    parentNamespaceTest = __parentNamespaceTest?.unpack()
    vectorOfReferrables = []
    for index in 0..<_t.vectorOfReferrablesCount {
        var __v_ = _t.vectorOfReferrables(at: index)
        vectorOfReferrables.append(__v_?.unpack())
    }
    singleWeakReference = _t.singleWeakReference
    vectorOfWeakReferences = []
    for index in 0..<_t.vectorOfWeakReferencesCount {
        vectorOfWeakReferences.append(_t.vectorOfWeakReferences(at: index))
    }
    vectorOfStrongReferrables = []
    for index in 0..<_t.vectorOfStrongReferrablesCount {
        var __v_ = _t.vectorOfStrongReferrables(at: index)
        vectorOfStrongReferrables.append(__v_?.unpack())
    }
    coOwningReference = _t.coOwningReference
    vectorOfCoOwningReferences = []
    for index in 0..<_t.vectorOfCoOwningReferencesCount {
        vectorOfCoOwningReferences.append(_t.vectorOfCoOwningReferences(at: index))
    }
    nonOwningReference = _t.nonOwningReference
    vectorOfNonOwningReferences = []
    for index in 0..<_t.vectorOfNonOwningReferencesCount {
        vectorOfNonOwningReferences.append(_t.vectorOfNonOwningReferences(at: index))
    }
    switch _t.anyUniqueType {
    case .m:
      var _v = _t.anyUnique(type: MyGame_Example_Monster.self)
      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .m)
    case .ts:
      var _v = _t.anyUnique(type: MyGame_Example_TestSimpleTableWithEnum.self)
      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .ts)
    case .m2:
      var _v = _t.anyUnique(type: MyGame_Example2_Monster.self)
      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .m2)
    default: break
    }
    switch _t.anyAmbiguousType {
    case .m1:
      var _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)
      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m1)
    case .m2:
      var _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)
      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m2)
    case .m3:
      var _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)
      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m3)
    default: break
    }
    vectorOfEnums = []
    for index in 0..<_t.vectorOfEnumsCount {
        vectorOfEnums.append(_t.vectorOfEnums(at: index)!)
    }
    signedEnum = _t.signedEnum
    testrequirednestedflatbuffer = []
    for index in 0..<_t.testrequirednestedflatbufferCount {
        testrequirednestedflatbuffer.append(_t.testrequirednestedflatbuffer(at: index))
    }
    scalarKeySortedTables = []
    for index in 0..<_t.scalarKeySortedTablesCount {
        var __v_ = _t.scalarKeySortedTables(at: index)
        scalarKeySortedTables.append(__v_?.unpack())
    }
    nativeInline = _t.nativeInline
    longEnumNonEnumDefault = _t.longEnumNonEnumDefault
    longEnumNormalDefault = _t.longEnumNormalDefault
    nanDefault = _t.nanDefault
    infDefault = _t.infDefault
    positiveInfDefault = _t.positiveInfDefault
    infinityDefault = _t.infinityDefault
    positiveInfinityDefault = _t.positiveInfinityDefault
    negativeInfDefault = _t.negativeInfDefault
    negativeInfinityDefault = _t.negativeInfinityDefault
    doubleInfDefault = _t.doubleInfDefault
  }

  public init() {
    pos = MyGame_Example_Vec3()
    mana = 150
    hp = 100
    name = ""
    inventory = []
    color = .blue
    test4 = []
    testarrayofstring = []
    testarrayoftables = []
    enemy = MyGame_Example_MonsterT()
    testnestedflatbuffer = []
    testempty = MyGame_Example_StatT()
    testbool = false
    testhashs32Fnv1 = 0
    testhashu32Fnv1 = 0
    testhashs64Fnv1 = 0
    testhashu64Fnv1 = 0
    testhashs32Fnv1a = 0
    testhashu32Fnv1a = 0
    testhashs64Fnv1a = 0
    testhashu64Fnv1a = 0
    testarrayofbools = []
    testf = 3.14159
    testf2 = 3.0
    testf3 = 0.0
    testarrayofstring2 = []
    testarrayofsortedstruct = []
    flex = []
    test5 = []
    vectorOfLongs = []
    vectorOfDoubles = []
    parentNamespaceTest = MyGame_InParentNamespaceT()
    vectorOfReferrables = []
    singleWeakReference = 0
    vectorOfWeakReferences = []
    vectorOfStrongReferrables = []
    coOwningReference = 0
    vectorOfCoOwningReferences = []
    nonOwningReference = 0
    vectorOfNonOwningReferences = []
    vectorOfEnums = []
    signedEnum = .none_
    testrequirednestedflatbuffer = []
    scalarKeySortedTables = []
    nativeInline = MyGame_Example_Test()
    longEnumNonEnumDefault = .longone
    longEnumNormalDefault = .longone
    nanDefault = .nan
    infDefault = .infinity
    positiveInfDefault = .infinity
    infinityDefault = .infinity
    positiveInfinityDefault = .infinity
    negativeInfDefault = -.infinity
    negativeInfinityDefault = -.infinity
    doubleInfDefault = .infinity
  }

  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Monster.self) }

}
public struct MyGame_Example_TypeAliases: FlatBufferObject, Verifiable, ObjectAPIPacker {

  static func validateVersion() { FlatBuffersVersion_24_3_25() }
  public var __buffer: ByteBuffer! { return _accessor.bb }
  private var _accessor: Table

  public static var id: String { "MONS" } 
  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_TypeAliases.id, addPrefix: prefix) }
  private init(_ t: Table) { _accessor = t }
  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }

  private enum VTOFFSET: VOffset {
    case i8 = 4
    case u8 = 6
    case i16 = 8
    case u16 = 10
    case i32 = 12
    case u32 = 14
    case i64 = 16
    case u64 = 18
    case f32 = 20
    case f64 = 22
    case v8 = 24
    case vf64 = 26
    var v: Int32 { Int32(self.rawValue) }
    var p: VOffset { self.rawValue }
  }

  public var i8: Int8 { let o = _accessor.offset(VTOFFSET.i8.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int8.self, at: o) }
  @discardableResult public func mutate(i8: Int8) -> Bool {let o = _accessor.offset(VTOFFSET.i8.v);  return _accessor.mutate(i8, index: o) }
  public var u8: UInt8 { let o = _accessor.offset(VTOFFSET.u8.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt8.self, at: o) }
  @discardableResult public func mutate(u8: UInt8) -> Bool {let o = _accessor.offset(VTOFFSET.u8.v);  return _accessor.mutate(u8, index: o) }
  public var i16: Int16 { let o = _accessor.offset(VTOFFSET.i16.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) }
  @discardableResult public func mutate(i16: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.i16.v);  return _accessor.mutate(i16, index: o) }
  public var u16: UInt16 { let o = _accessor.offset(VTOFFSET.u16.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }
  @discardableResult public func mutate(u16: UInt16) -> Bool {let o = _accessor.offset(VTOFFSET.u16.v);  return _accessor.mutate(u16, index: o) }
  public var i32: Int32 { let o = _accessor.offset(VTOFFSET.i32.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
  @discardableResult public func mutate(i32: Int32) -> Bool {let o = _accessor.offset(VTOFFSET.i32.v);  return _accessor.mutate(i32, index: o) }
  public var u32: UInt32 { let o = _accessor.offset(VTOFFSET.u32.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }
  @discardableResult public func mutate(u32: UInt32) -> Bool {let o = _accessor.offset(VTOFFSET.u32.v);  return _accessor.mutate(u32, index: o) }
  public var i64: Int64 { let o = _accessor.offset(VTOFFSET.i64.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
  @discardableResult public func mutate(i64: Int64) -> Bool {let o = _accessor.offset(VTOFFSET.i64.v);  return _accessor.mutate(i64, index: o) }
  public var u64: UInt64 { let o = _accessor.offset(VTOFFSET.u64.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
  @discardableResult public func mutate(u64: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.u64.v);  return _accessor.mutate(u64, index: o) }
  public var f32: Float32 { let o = _accessor.offset(VTOFFSET.f32.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }
  @discardableResult public func mutate(f32: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.f32.v);  return _accessor.mutate(f32, index: o) }
  public var f64: Double { let o = _accessor.offset(VTOFFSET.f64.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }
  @discardableResult public func mutate(f64: Double) -> Bool {let o = _accessor.offset(VTOFFSET.f64.v);  return _accessor.mutate(f64, index: o) }
  public var hasV8: Bool { let o = _accessor.offset(VTOFFSET.v8.v); return o == 0 ? false : true }
  public var v8Count: Int32 { let o = _accessor.offset(VTOFFSET.v8.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func v8(at index: Int32) -> Int8 { let o = _accessor.offset(VTOFFSET.v8.v); return o == 0 ? 0 : _accessor.directRead(of: Int8.self, offset: _accessor.vector(at: o) + index * 1) }
  public var v8: [Int8] { return _accessor.getVector(at: VTOFFSET.v8.v) ?? [] }
  public func mutate(v8: Int8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.v8.v); return _accessor.directMutate(v8, index: _accessor.vector(at: o) + index * 1) }
  public var hasVf64: Bool { let o = _accessor.offset(VTOFFSET.vf64.v); return o == 0 ? false : true }
  public var vf64Count: Int32 { let o = _accessor.offset(VTOFFSET.vf64.v); return o == 0 ? 0 : _accessor.vector(count: o) }
  public func vf64(at index: Int32) -> Double { let o = _accessor.offset(VTOFFSET.vf64.v); return o == 0 ? 0 : _accessor.directRead(of: Double.self, offset: _accessor.vector(at: o) + index * 8) }
  public var vf64: [Double] { return _accessor.getVector(at: VTOFFSET.vf64.v) ?? [] }
  public func mutate(vf64: Double, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vf64.v); return _accessor.directMutate(vf64, index: _accessor.vector(at: o) + index * 8) }
  public static func startTypeAliases(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 12) }
  public static func add(i8: Int8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i8, def: 0, at: VTOFFSET.i8.p) }
  public static func add(u8: UInt8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u8, def: 0, at: VTOFFSET.u8.p) }
  public static func add(i16: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i16, def: 0, at: VTOFFSET.i16.p) }
  public static func add(u16: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u16, def: 0, at: VTOFFSET.u16.p) }
  public static func add(i32: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i32, def: 0, at: VTOFFSET.i32.p) }
  public static func add(u32: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u32, def: 0, at: VTOFFSET.u32.p) }
  public static func add(i64: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i64, def: 0, at: VTOFFSET.i64.p) }
  public static func add(u64: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u64, def: 0, at: VTOFFSET.u64.p) }
  public static func add(f32: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: f32, def: 0.0, at: VTOFFSET.f32.p) }
  public static func add(f64: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: f64, def: 0.0, at: VTOFFSET.f64.p) }
  public static func addVectorOf(v8: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: v8, at: VTOFFSET.v8.p) }
  public static func addVectorOf(vf64: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vf64, at: VTOFFSET.vf64.p) }
  public static func endTypeAliases(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
  public static func createTypeAliases(
    _ fbb: inout FlatBufferBuilder,
    i8: Int8 = 0,
    u8: UInt8 = 0,
    i16: Int16 = 0,
    u16: UInt16 = 0,
    i32: Int32 = 0,
    u32: UInt32 = 0,
    i64: Int64 = 0,
    u64: UInt64 = 0,
    f32: Float32 = 0.0,
    f64: Double = 0.0,
    v8VectorOffset v8: Offset = Offset(),
    vf64VectorOffset vf64: Offset = Offset()
  ) -> Offset {
    let __start = MyGame_Example_TypeAliases.startTypeAliases(&fbb)
    MyGame_Example_TypeAliases.add(i8: i8, &fbb)
    MyGame_Example_TypeAliases.add(u8: u8, &fbb)
    MyGame_Example_TypeAliases.add(i16: i16, &fbb)
    MyGame_Example_TypeAliases.add(u16: u16, &fbb)
    MyGame_Example_TypeAliases.add(i32: i32, &fbb)
    MyGame_Example_TypeAliases.add(u32: u32, &fbb)
    MyGame_Example_TypeAliases.add(i64: i64, &fbb)
    MyGame_Example_TypeAliases.add(u64: u64, &fbb)
    MyGame_Example_TypeAliases.add(f32: f32, &fbb)
    MyGame_Example_TypeAliases.add(f64: f64, &fbb)
    MyGame_Example_TypeAliases.addVectorOf(v8: v8, &fbb)
    MyGame_Example_TypeAliases.addVectorOf(vf64: vf64, &fbb)
    return MyGame_Example_TypeAliases.endTypeAliases(&fbb, start: __start)
  }
  

  public mutating func unpack() -> MyGame_Example_TypeAliasesT {
    return MyGame_Example_TypeAliasesT(&self)
  }
  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TypeAliasesT?) -> Offset {
    guard var obj = obj else { return Offset() }
    return pack(&builder, obj: &obj)
  }

  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TypeAliasesT) -> Offset {
    let __v8 = builder.createVector(obj.v8)
    let __vf64 = builder.createVector(obj.vf64)
    let __root = MyGame_Example_TypeAliases.startTypeAliases(&builder)
    MyGame_Example_TypeAliases.add(i8: obj.i8, &builder)
    MyGame_Example_TypeAliases.add(u8: obj.u8, &builder)
    MyGame_Example_TypeAliases.add(i16: obj.i16, &builder)
    MyGame_Example_TypeAliases.add(u16: obj.u16, &builder)
    MyGame_Example_TypeAliases.add(i32: obj.i32, &builder)
    MyGame_Example_TypeAliases.add(u32: obj.u32, &builder)
    MyGame_Example_TypeAliases.add(i64: obj.i64, &builder)
    MyGame_Example_TypeAliases.add(u64: obj.u64, &builder)
    MyGame_Example_TypeAliases.add(f32: obj.f32, &builder)
    MyGame_Example_TypeAliases.add(f64: obj.f64, &builder)
    MyGame_Example_TypeAliases.addVectorOf(v8: __v8, &builder)
    MyGame_Example_TypeAliases.addVectorOf(vf64: __vf64, &builder)
    return MyGame_Example_TypeAliases.endTypeAliases(&builder, start: __root)
  }

  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
    var _v = try verifier.visitTable(at: position)
    try _v.visit(field: VTOFFSET.i8.p, fieldName: "i8", required: false, type: Int8.self)
    try _v.visit(field: VTOFFSET.u8.p, fieldName: "u8", required: false, type: UInt8.self)
    try _v.visit(field: VTOFFSET.i16.p, fieldName: "i16", required: false, type: Int16.self)
    try _v.visit(field: VTOFFSET.u16.p, fieldName: "u16", required: false, type: UInt16.self)
    try _v.visit(field: VTOFFSET.i32.p, fieldName: "i32", required: false, type: Int32.self)
    try _v.visit(field: VTOFFSET.u32.p, fieldName: "u32", required: false, type: UInt32.self)
    try _v.visit(field: VTOFFSET.i64.p, fieldName: "i64", required: false, type: Int64.self)
    try _v.visit(field: VTOFFSET.u64.p, fieldName: "u64", required: false, type: UInt64.self)
    try _v.visit(field: VTOFFSET.f32.p, fieldName: "f32", required: false, type: Float32.self)
    try _v.visit(field: VTOFFSET.f64.p, fieldName: "f64", required: false, type: Double.self)
    try _v.visit(field: VTOFFSET.v8.p, fieldName: "v8", required: false, type: ForwardOffset<Vector<Int8, Int8>>.self)
    try _v.visit(field: VTOFFSET.vf64.p, fieldName: "vf64", required: false, type: ForwardOffset<Vector<Double, Double>>.self)
    _v.finish()
  }
}

extension MyGame_Example_TypeAliases: Encodable {

  enum CodingKeys: String, CodingKey {
    case i8 = "i8"
    case u8 = "u8"
    case i16 = "i16"
    case u16 = "u16"
    case i32 = "i32"
    case u32 = "u32"
    case i64 = "i64"
    case u64 = "u64"
    case f32 = "f32"
    case f64 = "f64"
    case v8 = "v8"
    case vf64 = "vf64"
  }
  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    if i8 != 0 {
      try container.encodeIfPresent(i8, forKey: .i8)
    }
    if u8 != 0 {
      try container.encodeIfPresent(u8, forKey: .u8)
    }
    if i16 != 0 {
      try container.encodeIfPresent(i16, forKey: .i16)
    }
    if u16 != 0 {
      try container.encodeIfPresent(u16, forKey: .u16)
    }
    if i32 != 0 {
      try container.encodeIfPresent(i32, forKey: .i32)
    }
    if u32 != 0 {
      try container.encodeIfPresent(u32, forKey: .u32)
    }
    if i64 != 0 {
      try container.encodeIfPresent(i64, forKey: .i64)
    }
    if u64 != 0 {
      try container.encodeIfPresent(u64, forKey: .u64)
    }
    if f32 != 0.0 {
      try container.encodeIfPresent(f32, forKey: .f32)
    }
    if f64 != 0.0 {
      try container.encodeIfPresent(f64, forKey: .f64)
    }
    if v8Count > 0 {
      try container.encodeIfPresent(v8, forKey: .v8)
    }
    if vf64Count > 0 {
      try container.encodeIfPresent(vf64, forKey: .vf64)
    }
  }
}

public class MyGame_Example_TypeAliasesT: NativeObject {

  public var i8: Int8
  public var u8: UInt8
  public var i16: Int16
  public var u16: UInt16
  public var i32: Int32
  public var u32: UInt32
  public var i64: Int64
  public var u64: UInt64
  public var f32: Float32
  public var f64: Double
  public var v8: [Int8]
  public var vf64: [Double]

  public init(_ _t: inout MyGame_Example_TypeAliases) {
    i8 = _t.i8
    u8 = _t.u8
    i16 = _t.i16
    u16 = _t.u16
    i32 = _t.i32
    u32 = _t.u32
    i64 = _t.i64
    u64 = _t.u64
    f32 = _t.f32
    f64 = _t.f64
    v8 = []
    for index in 0..<_t.v8Count {
        v8.append(_t.v8(at: index))
    }
    vf64 = []
    for index in 0..<_t.vf64Count {
        vf64.append(_t.vf64(at: index))
    }
  }

  public init() {
    i8 = 0
    u8 = 0
    i16 = 0
    u16 = 0
    i32 = 0
    u32 = 0
    i64 = 0
    u64 = 0
    f32 = 0.0
    f64 = 0.0
    v8 = []
    vf64 = []
  }

  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_TypeAliases.self) }

}
