// automatically generated by the FlatBuffers compiler, do not modify


#ifndef FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_
#define FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_

#include "flatbuffers/flatbuffers.h"
#include "flatbuffers/flexbuffers.h"
#include "flatbuffers/flex_flat_util.h"

// Ensure the included flatbuffers.h is the same version as when this file was
// generated, otherwise it may not be compatible.
static_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&
              FLATBUFFERS_VERSION_MINOR == 3 &&
              FLATBUFFERS_VERSION_REVISION == 7,
             "Non-compatible flatbuffers version included");

// For access to the binary schema that produced this file.
#include "monster_test_bfbs_generated.h"

namespace MyGame {

struct InParentNamespace;
struct InParentNamespaceBuilder;
struct InParentNamespaceT;

namespace Example2 {

struct Monster;
struct MonsterBuilder;
struct MonsterT;

}  // namespace Example2

namespace Example {

struct Test;

struct TestSimpleTableWithEnum;
struct TestSimpleTableWithEnumBuilder;
struct TestSimpleTableWithEnumT;

struct Vec3;

struct Ability;

struct StructOfStructs;

struct StructOfStructsOfStructs;

struct Stat;
struct StatBuilder;
struct StatT;

struct Referrable;
struct ReferrableBuilder;
struct ReferrableT;

struct Monster;
struct MonsterBuilder;
struct MonsterT;

struct TypeAliases;
struct TypeAliasesBuilder;
struct TypeAliasesT;

}  // namespace Example

bool operator==(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs);
bool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs);
namespace Example2 {

bool operator==(const MonsterT &lhs, const MonsterT &rhs);
bool operator!=(const MonsterT &lhs, const MonsterT &rhs);
}  // namespace Example2

namespace Example {

bool operator==(const Test &lhs, const Test &rhs);
bool operator!=(const Test &lhs, const Test &rhs);
bool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs);
bool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs);
bool operator==(const Vec3 &lhs, const Vec3 &rhs);
bool operator!=(const Vec3 &lhs, const Vec3 &rhs);
bool operator==(const Ability &lhs, const Ability &rhs);
bool operator!=(const Ability &lhs, const Ability &rhs);
bool operator==(const StructOfStructs &lhs, const StructOfStructs &rhs);
bool operator!=(const StructOfStructs &lhs, const StructOfStructs &rhs);
bool operator==(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs);
bool operator!=(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs);
bool operator==(const StatT &lhs, const StatT &rhs);
bool operator!=(const StatT &lhs, const StatT &rhs);
bool operator==(const ReferrableT &lhs, const ReferrableT &rhs);
bool operator!=(const ReferrableT &lhs, const ReferrableT &rhs);
bool operator==(const MonsterT &lhs, const MonsterT &rhs);
bool operator!=(const MonsterT &lhs, const MonsterT &rhs);
bool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs);
bool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs);

}  // namespace Example

inline const ::flatbuffers::TypeTable *InParentNamespaceTypeTable();

namespace Example2 {

inline const ::flatbuffers::TypeTable *MonsterTypeTable();

}  // namespace Example2

namespace Example {

inline const ::flatbuffers::TypeTable *TestTypeTable();

inline const ::flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable();

inline const ::flatbuffers::TypeTable *Vec3TypeTable();

inline const ::flatbuffers::TypeTable *AbilityTypeTable();

inline const ::flatbuffers::TypeTable *StructOfStructsTypeTable();

inline const ::flatbuffers::TypeTable *StructOfStructsOfStructsTypeTable();

inline const ::flatbuffers::TypeTable *StatTypeTable();

inline const ::flatbuffers::TypeTable *ReferrableTypeTable();

inline const ::flatbuffers::TypeTable *MonsterTypeTable();

inline const ::flatbuffers::TypeTable *TypeAliasesTypeTable();

/// Composite components of Monster color.
enum Color : uint8_t {
  Color_Red = 1,
  /// \brief color Green
  /// Green is bit_flag with value (1u << 1)
  Color_Green = 2,
  /// \brief color Blue (1u << 3)
  Color_Blue = 8,
  Color_NONE = 0,
  Color_ANY = 11
};

inline const Color (&EnumValuesColor())[3] {
  static const Color values[] = {
    Color_Red,
    Color_Green,
    Color_Blue
  };
  return values;
}

inline const char * const *EnumNamesColor() {
  static const char * const names[9] = {
    "Red",
    "Green",
    "",
    "",
    "",
    "",
    "",
    "Blue",
    nullptr
  };
  return names;
}

inline const char *EnumNameColor(Color e) {
  if (::flatbuffers::IsOutRange(e, Color_Red, Color_Blue)) return "";
  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Color_Red);
  return EnumNamesColor()[index];
}

enum Race : int8_t {
  Race_None = -1,
  Race_Human = 0,
  Race_Dwarf = 1,
  Race_Elf = 2,
  Race_MIN = Race_None,
  Race_MAX = Race_Elf
};

inline const Race (&EnumValuesRace())[4] {
  static const Race values[] = {
    Race_None,
    Race_Human,
    Race_Dwarf,
    Race_Elf
  };
  return values;
}

inline const char * const *EnumNamesRace() {
  static const char * const names[5] = {
    "None",
    "Human",
    "Dwarf",
    "Elf",
    nullptr
  };
  return names;
}

inline const char *EnumNameRace(Race e) {
  if (::flatbuffers::IsOutRange(e, Race_None, Race_Elf)) return "";
  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Race_None);
  return EnumNamesRace()[index];
}

enum LongEnum : uint64_t {
  LongEnum_LongOne = 2ULL,
  LongEnum_LongTwo = 4ULL,
  LongEnum_LongBig = 1099511627776ULL,
  LongEnum_NONE = 0,
  LongEnum_ANY = 1099511627782ULL
};

inline const LongEnum (&EnumValuesLongEnum())[3] {
  static const LongEnum values[] = {
    LongEnum_LongOne,
    LongEnum_LongTwo,
    LongEnum_LongBig
  };
  return values;
}

inline const char *EnumNameLongEnum(LongEnum e) {
  switch (e) {
    case LongEnum_LongOne: return "LongOne";
    case LongEnum_LongTwo: return "LongTwo";
    case LongEnum_LongBig: return "LongBig";
    default: return "";
  }
}

enum Any : uint8_t {
  Any_NONE = 0,
  Any_Monster = 1,
  Any_TestSimpleTableWithEnum = 2,
  Any_MyGame_Example2_Monster = 3,
  Any_MIN = Any_NONE,
  Any_MAX = Any_MyGame_Example2_Monster
};

inline const Any (&EnumValuesAny())[4] {
  static const Any values[] = {
    Any_NONE,
    Any_Monster,
    Any_TestSimpleTableWithEnum,
    Any_MyGame_Example2_Monster
  };
  return values;
}

inline const char * const *EnumNamesAny() {
  static const char * const names[5] = {
    "NONE",
    "Monster",
    "TestSimpleTableWithEnum",
    "MyGame_Example2_Monster",
    nullptr
  };
  return names;
}

inline const char *EnumNameAny(Any e) {
  if (::flatbuffers::IsOutRange(e, Any_NONE, Any_MyGame_Example2_Monster)) return "";
  const size_t index = static_cast<size_t>(e);
  return EnumNamesAny()[index];
}

template<typename T> struct AnyTraits {
  static const Any enum_value = Any_NONE;
};

template<> struct AnyTraits<MyGame::Example::Monster> {
  static const Any enum_value = Any_Monster;
};

template<> struct AnyTraits<MyGame::Example::TestSimpleTableWithEnum> {
  static const Any enum_value = Any_TestSimpleTableWithEnum;
};

template<> struct AnyTraits<MyGame::Example2::Monster> {
  static const Any enum_value = Any_MyGame_Example2_Monster;
};

template<typename T> struct AnyUnionTraits {
  static const Any enum_value = Any_NONE;
};

template<> struct AnyUnionTraits<MyGame::Example::MonsterT> {
  static const Any enum_value = Any_Monster;
};

template<> struct AnyUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {
  static const Any enum_value = Any_TestSimpleTableWithEnum;
};

template<> struct AnyUnionTraits<MyGame::Example2::MonsterT> {
  static const Any enum_value = Any_MyGame_Example2_Monster;
};

struct AnyUnion {
  Any type;
  void *value;

  AnyUnion() : type(Any_NONE), value(nullptr) {}
  AnyUnion(AnyUnion&& u) FLATBUFFERS_NOEXCEPT :
    type(Any_NONE), value(nullptr)
    { std::swap(type, u.type); std::swap(value, u.value); }
  AnyUnion(const AnyUnion &);
  AnyUnion &operator=(const AnyUnion &u)
    { AnyUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
  AnyUnion &operator=(AnyUnion &&u) FLATBUFFERS_NOEXCEPT
    { std::swap(type, u.type); std::swap(value, u.value); return *this; }
  ~AnyUnion() { Reset(); }

  void Reset();

  template <typename T>
  void Set(T&& val) {
    typedef typename std::remove_reference<T>::type RT;
    Reset();
    type = AnyUnionTraits<RT>::enum_value;
    if (type != Any_NONE) {
      value = new RT(std::forward<T>(val));
    }
  }

  static void *UnPack(const void *obj, Any type, const ::flatbuffers::resolver_function_t *resolver);
  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;

  MyGame::Example::MonsterT *AsMonster() {
    return type == Any_Monster ?
      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
  }
  const MyGame::Example::MonsterT *AsMonster() const {
    return type == Any_Monster ?
      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
  }
  MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() {
    return type == Any_TestSimpleTableWithEnum ?
      reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;
  }
  const MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() const {
    return type == Any_TestSimpleTableWithEnum ?
      reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;
  }
  MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() {
    return type == Any_MyGame_Example2_Monster ?
      reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;
  }
  const MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() const {
    return type == Any_MyGame_Example2_Monster ?
      reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;
  }
};


inline bool operator==(const AnyUnion &lhs, const AnyUnion &rhs) {
  if (lhs.type != rhs.type) return false;
  switch (lhs.type) {
    case Any_NONE: {
      return true;
    }
    case Any_Monster: {
      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));
    }
    case Any_TestSimpleTableWithEnum: {
      return *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(rhs.value));
    }
    case Any_MyGame_Example2_Monster: {
      return *(reinterpret_cast<const MyGame::Example2::MonsterT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example2::MonsterT *>(rhs.value));
    }
    default: {
      return false;
    }
  }
}

inline bool operator!=(const AnyUnion &lhs, const AnyUnion &rhs) {
    return !(lhs == rhs);
}

bool VerifyAny(::flatbuffers::Verifier &verifier, const void *obj, Any type);
bool VerifyAnyVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);

enum AnyUniqueAliases : uint8_t {
  AnyUniqueAliases_NONE = 0,
  AnyUniqueAliases_M = 1,
  AnyUniqueAliases_TS = 2,
  AnyUniqueAliases_M2 = 3,
  AnyUniqueAliases_MIN = AnyUniqueAliases_NONE,
  AnyUniqueAliases_MAX = AnyUniqueAliases_M2
};

inline const AnyUniqueAliases (&EnumValuesAnyUniqueAliases())[4] {
  static const AnyUniqueAliases values[] = {
    AnyUniqueAliases_NONE,
    AnyUniqueAliases_M,
    AnyUniqueAliases_TS,
    AnyUniqueAliases_M2
  };
  return values;
}

inline const char * const *EnumNamesAnyUniqueAliases() {
  static const char * const names[5] = {
    "NONE",
    "M",
    "TS",
    "M2",
    nullptr
  };
  return names;
}

inline const char *EnumNameAnyUniqueAliases(AnyUniqueAliases e) {
  if (::flatbuffers::IsOutRange(e, AnyUniqueAliases_NONE, AnyUniqueAliases_M2)) return "";
  const size_t index = static_cast<size_t>(e);
  return EnumNamesAnyUniqueAliases()[index];
}

template<typename T> struct AnyUniqueAliasesTraits {
  static const AnyUniqueAliases enum_value = AnyUniqueAliases_NONE;
};

template<> struct AnyUniqueAliasesTraits<MyGame::Example::Monster> {
  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M;
};

template<> struct AnyUniqueAliasesTraits<MyGame::Example::TestSimpleTableWithEnum> {
  static const AnyUniqueAliases enum_value = AnyUniqueAliases_TS;
};

template<> struct AnyUniqueAliasesTraits<MyGame::Example2::Monster> {
  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M2;
};

template<typename T> struct AnyUniqueAliasesUnionTraits {
  static const AnyUniqueAliases enum_value = AnyUniqueAliases_NONE;
};

template<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::MonsterT> {
  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M;
};

template<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {
  static const AnyUniqueAliases enum_value = AnyUniqueAliases_TS;
};

template<> struct AnyUniqueAliasesUnionTraits<MyGame::Example2::MonsterT> {
  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M2;
};

struct AnyUniqueAliasesUnion {
  AnyUniqueAliases type;
  void *value;

  AnyUniqueAliasesUnion() : type(AnyUniqueAliases_NONE), value(nullptr) {}
  AnyUniqueAliasesUnion(AnyUniqueAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :
    type(AnyUniqueAliases_NONE), value(nullptr)
    { std::swap(type, u.type); std::swap(value, u.value); }
  AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &);
  AnyUniqueAliasesUnion &operator=(const AnyUniqueAliasesUnion &u)
    { AnyUniqueAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
  AnyUniqueAliasesUnion &operator=(AnyUniqueAliasesUnion &&u) FLATBUFFERS_NOEXCEPT
    { std::swap(type, u.type); std::swap(value, u.value); return *this; }
  ~AnyUniqueAliasesUnion() { Reset(); }

  void Reset();

  template <typename T>
  void Set(T&& val) {
    typedef typename std::remove_reference<T>::type RT;
    Reset();
    type = AnyUniqueAliasesUnionTraits<RT>::enum_value;
    if (type != AnyUniqueAliases_NONE) {
      value = new RT(std::forward<T>(val));
    }
  }

  static void *UnPack(const void *obj, AnyUniqueAliases type, const ::flatbuffers::resolver_function_t *resolver);
  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;

  MyGame::Example::MonsterT *AsM() {
    return type == AnyUniqueAliases_M ?
      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
  }
  const MyGame::Example::MonsterT *AsM() const {
    return type == AnyUniqueAliases_M ?
      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
  }
  MyGame::Example::TestSimpleTableWithEnumT *AsTS() {
    return type == AnyUniqueAliases_TS ?
      reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;
  }
  const MyGame::Example::TestSimpleTableWithEnumT *AsTS() const {
    return type == AnyUniqueAliases_TS ?
      reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;
  }
  MyGame::Example2::MonsterT *AsM2() {
    return type == AnyUniqueAliases_M2 ?
      reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;
  }
  const MyGame::Example2::MonsterT *AsM2() const {
    return type == AnyUniqueAliases_M2 ?
      reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;
  }
};


inline bool operator==(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) {
  if (lhs.type != rhs.type) return false;
  switch (lhs.type) {
    case AnyUniqueAliases_NONE: {
      return true;
    }
    case AnyUniqueAliases_M: {
      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));
    }
    case AnyUniqueAliases_TS: {
      return *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(rhs.value));
    }
    case AnyUniqueAliases_M2: {
      return *(reinterpret_cast<const MyGame::Example2::MonsterT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example2::MonsterT *>(rhs.value));
    }
    default: {
      return false;
    }
  }
}

inline bool operator!=(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) {
    return !(lhs == rhs);
}

bool VerifyAnyUniqueAliases(::flatbuffers::Verifier &verifier, const void *obj, AnyUniqueAliases type);
bool VerifyAnyUniqueAliasesVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);

enum AnyAmbiguousAliases : uint8_t {
  AnyAmbiguousAliases_NONE = 0,
  AnyAmbiguousAliases_M1 = 1,
  AnyAmbiguousAliases_M2 = 2,
  AnyAmbiguousAliases_M3 = 3,
  AnyAmbiguousAliases_MIN = AnyAmbiguousAliases_NONE,
  AnyAmbiguousAliases_MAX = AnyAmbiguousAliases_M3
};

inline const AnyAmbiguousAliases (&EnumValuesAnyAmbiguousAliases())[4] {
  static const AnyAmbiguousAliases values[] = {
    AnyAmbiguousAliases_NONE,
    AnyAmbiguousAliases_M1,
    AnyAmbiguousAliases_M2,
    AnyAmbiguousAliases_M3
  };
  return values;
}

inline const char * const *EnumNamesAnyAmbiguousAliases() {
  static const char * const names[5] = {
    "NONE",
    "M1",
    "M2",
    "M3",
    nullptr
  };
  return names;
}

inline const char *EnumNameAnyAmbiguousAliases(AnyAmbiguousAliases e) {
  if (::flatbuffers::IsOutRange(e, AnyAmbiguousAliases_NONE, AnyAmbiguousAliases_M3)) return "";
  const size_t index = static_cast<size_t>(e);
  return EnumNamesAnyAmbiguousAliases()[index];
}

struct AnyAmbiguousAliasesUnion {
  AnyAmbiguousAliases type;
  void *value;

  AnyAmbiguousAliasesUnion() : type(AnyAmbiguousAliases_NONE), value(nullptr) {}
  AnyAmbiguousAliasesUnion(AnyAmbiguousAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :
    type(AnyAmbiguousAliases_NONE), value(nullptr)
    { std::swap(type, u.type); std::swap(value, u.value); }
  AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &);
  AnyAmbiguousAliasesUnion &operator=(const AnyAmbiguousAliasesUnion &u)
    { AnyAmbiguousAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
  AnyAmbiguousAliasesUnion &operator=(AnyAmbiguousAliasesUnion &&u) FLATBUFFERS_NOEXCEPT
    { std::swap(type, u.type); std::swap(value, u.value); return *this; }
  ~AnyAmbiguousAliasesUnion() { Reset(); }

  void Reset();

  static void *UnPack(const void *obj, AnyAmbiguousAliases type, const ::flatbuffers::resolver_function_t *resolver);
  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;

  MyGame::Example::MonsterT *AsM1() {
    return type == AnyAmbiguousAliases_M1 ?
      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
  }
  const MyGame::Example::MonsterT *AsM1() const {
    return type == AnyAmbiguousAliases_M1 ?
      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
  }
  MyGame::Example::MonsterT *AsM2() {
    return type == AnyAmbiguousAliases_M2 ?
      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
  }
  const MyGame::Example::MonsterT *AsM2() const {
    return type == AnyAmbiguousAliases_M2 ?
      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
  }
  MyGame::Example::MonsterT *AsM3() {
    return type == AnyAmbiguousAliases_M3 ?
      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
  }
  const MyGame::Example::MonsterT *AsM3() const {
    return type == AnyAmbiguousAliases_M3 ?
      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
  }
};


inline bool operator==(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) {
  if (lhs.type != rhs.type) return false;
  switch (lhs.type) {
    case AnyAmbiguousAliases_NONE: {
      return true;
    }
    case AnyAmbiguousAliases_M1: {
      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));
    }
    case AnyAmbiguousAliases_M2: {
      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));
    }
    case AnyAmbiguousAliases_M3: {
      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==
             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));
    }
    default: {
      return false;
    }
  }
}

inline bool operator!=(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) {
    return !(lhs == rhs);
}

bool VerifyAnyAmbiguousAliases(::flatbuffers::Verifier &verifier, const void *obj, AnyAmbiguousAliases type);
bool VerifyAnyAmbiguousAliasesVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);

FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(2) Test FLATBUFFERS_FINAL_CLASS {
 private:
  int16_t a_;
  int8_t b_;
  int8_t padding0__;

 public:
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return TestTypeTable();
  }
  Test()
      : a_(0),
        b_(0),
        padding0__(0) {
    (void)padding0__;
  }
  Test(int16_t _a, int8_t _b)
      : a_(::flatbuffers::EndianScalar(_a)),
        b_(::flatbuffers::EndianScalar(_b)),
        padding0__(0) {
    (void)padding0__;
  }
  int16_t a() const {
    return ::flatbuffers::EndianScalar(a_);
  }
  void mutate_a(int16_t _a) {
    ::flatbuffers::WriteScalar(&a_, _a);
  }
  int8_t b() const {
    return ::flatbuffers::EndianScalar(b_);
  }
  void mutate_b(int8_t _b) {
    ::flatbuffers::WriteScalar(&b_, _b);
  }
};
FLATBUFFERS_STRUCT_END(Test, 4);

inline bool operator==(const Test &lhs, const Test &rhs) {
  return
      (lhs.a() == rhs.a()) &&
      (lhs.b() == rhs.b());
}

inline bool operator!=(const Test &lhs, const Test &rhs) {
    return !(lhs == rhs);
}


FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Vec3 FLATBUFFERS_FINAL_CLASS {
 private:
  float x_;
  float y_;
  float z_;
  int32_t padding0__;
  double test1_;
  uint8_t test2_;
  int8_t padding1__;
  MyGame::Example::Test test3_;
  int16_t padding2__;

 public:
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return Vec3TypeTable();
  }
  Vec3()
      : x_(0),
        y_(0),
        z_(0),
        padding0__(0),
        test1_(0),
        test2_(0),
        padding1__(0),
        test3_(),
        padding2__(0) {
    (void)padding0__;
    (void)padding1__;
    (void)padding2__;
  }
  Vec3(float _x, float _y, float _z, double _test1, MyGame::Example::Color _test2, const MyGame::Example::Test &_test3)
      : x_(::flatbuffers::EndianScalar(_x)),
        y_(::flatbuffers::EndianScalar(_y)),
        z_(::flatbuffers::EndianScalar(_z)),
        padding0__(0),
        test1_(::flatbuffers::EndianScalar(_test1)),
        test2_(::flatbuffers::EndianScalar(static_cast<uint8_t>(_test2))),
        padding1__(0),
        test3_(_test3),
        padding2__(0) {
    (void)padding0__;
    (void)padding1__;
    (void)padding2__;
  }
  float x() const {
    return ::flatbuffers::EndianScalar(x_);
  }
  void mutate_x(float _x) {
    ::flatbuffers::WriteScalar(&x_, _x);
  }
  float y() const {
    return ::flatbuffers::EndianScalar(y_);
  }
  void mutate_y(float _y) {
    ::flatbuffers::WriteScalar(&y_, _y);
  }
  float z() const {
    return ::flatbuffers::EndianScalar(z_);
  }
  void mutate_z(float _z) {
    ::flatbuffers::WriteScalar(&z_, _z);
  }
  double test1() const {
    return ::flatbuffers::EndianScalar(test1_);
  }
  void mutate_test1(double _test1) {
    ::flatbuffers::WriteScalar(&test1_, _test1);
  }
  MyGame::Example::Color test2() const {
    return static_cast<MyGame::Example::Color>(::flatbuffers::EndianScalar(test2_));
  }
  void mutate_test2(MyGame::Example::Color _test2) {
    ::flatbuffers::WriteScalar(&test2_, static_cast<uint8_t>(_test2));
  }
  const MyGame::Example::Test &test3() const {
    return test3_;
  }
  MyGame::Example::Test &mutable_test3() {
    return test3_;
  }
};
FLATBUFFERS_STRUCT_END(Vec3, 32);

inline bool operator==(const Vec3 &lhs, const Vec3 &rhs) {
  return
      (lhs.x() == rhs.x()) &&
      (lhs.y() == rhs.y()) &&
      (lhs.z() == rhs.z()) &&
      (lhs.test1() == rhs.test1()) &&
      (lhs.test2() == rhs.test2()) &&
      (lhs.test3() == rhs.test3());
}

inline bool operator!=(const Vec3 &lhs, const Vec3 &rhs) {
    return !(lhs == rhs);
}


FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Ability FLATBUFFERS_FINAL_CLASS {
 private:
  uint32_t id_;
  uint32_t distance_;

 public:
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return AbilityTypeTable();
  }
  Ability()
      : id_(0),
        distance_(0) {
  }
  Ability(uint32_t _id, uint32_t _distance)
      : id_(::flatbuffers::EndianScalar(_id)),
        distance_(::flatbuffers::EndianScalar(_distance)) {
  }
  uint32_t id() const {
    return ::flatbuffers::EndianScalar(id_);
  }
  void mutate_id(uint32_t _id) {
    ::flatbuffers::WriteScalar(&id_, _id);
  }
  bool KeyCompareLessThan(const Ability * const o) const {
    return id() < o->id();
  }
  int KeyCompareWithValue(uint32_t _id) const {
    return static_cast<int>(id() > _id) - static_cast<int>(id() < _id);
  }
  uint32_t distance() const {
    return ::flatbuffers::EndianScalar(distance_);
  }
  void mutate_distance(uint32_t _distance) {
    ::flatbuffers::WriteScalar(&distance_, _distance);
  }
};
FLATBUFFERS_STRUCT_END(Ability, 8);

inline bool operator==(const Ability &lhs, const Ability &rhs) {
  return
      (lhs.id() == rhs.id()) &&
      (lhs.distance() == rhs.distance());
}

inline bool operator!=(const Ability &lhs, const Ability &rhs) {
    return !(lhs == rhs);
}


FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) StructOfStructs FLATBUFFERS_FINAL_CLASS {
 private:
  MyGame::Example::Ability a_;
  MyGame::Example::Test b_;
  MyGame::Example::Ability c_;

 public:
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return StructOfStructsTypeTable();
  }
  StructOfStructs()
      : a_(),
        b_(),
        c_() {
  }
  StructOfStructs(const MyGame::Example::Ability &_a, const MyGame::Example::Test &_b, const MyGame::Example::Ability &_c)
      : a_(_a),
        b_(_b),
        c_(_c) {
  }
  const MyGame::Example::Ability &a() const {
    return a_;
  }
  MyGame::Example::Ability &mutable_a() {
    return a_;
  }
  const MyGame::Example::Test &b() const {
    return b_;
  }
  MyGame::Example::Test &mutable_b() {
    return b_;
  }
  const MyGame::Example::Ability &c() const {
    return c_;
  }
  MyGame::Example::Ability &mutable_c() {
    return c_;
  }
};
FLATBUFFERS_STRUCT_END(StructOfStructs, 20);

inline bool operator==(const StructOfStructs &lhs, const StructOfStructs &rhs) {
  return
      (lhs.a() == rhs.a()) &&
      (lhs.b() == rhs.b()) &&
      (lhs.c() == rhs.c());
}

inline bool operator!=(const StructOfStructs &lhs, const StructOfStructs &rhs) {
    return !(lhs == rhs);
}


FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) StructOfStructsOfStructs FLATBUFFERS_FINAL_CLASS {
 private:
  MyGame::Example::StructOfStructs a_;

 public:
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return StructOfStructsOfStructsTypeTable();
  }
  StructOfStructsOfStructs()
      : a_() {
  }
  StructOfStructsOfStructs(const MyGame::Example::StructOfStructs &_a)
      : a_(_a) {
  }
  const MyGame::Example::StructOfStructs &a() const {
    return a_;
  }
  MyGame::Example::StructOfStructs &mutable_a() {
    return a_;
  }
};
FLATBUFFERS_STRUCT_END(StructOfStructsOfStructs, 20);

inline bool operator==(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs) {
  return
      (lhs.a() == rhs.a());
}

inline bool operator!=(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs) {
    return !(lhs == rhs);
}


}  // namespace Example

struct InParentNamespaceT : public ::flatbuffers::NativeTable {
  typedef InParentNamespace TableType;
};

struct InParentNamespace FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
  typedef InParentNamespaceT NativeTableType;
  typedef InParentNamespaceBuilder Builder;
  typedef MyGame::Example::MonsterBinarySchema BinarySchema;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return InParentNamespaceTypeTable();
  }
  bool Verify(::flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           verifier.EndTable();
  }
  InParentNamespaceT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(InParentNamespaceT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static ::flatbuffers::Offset<InParentNamespace> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct InParentNamespaceBuilder {
  typedef InParentNamespace Table;
  ::flatbuffers::FlatBufferBuilder &fbb_;
  ::flatbuffers::uoffset_t start_;
  explicit InParentNamespaceBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ::flatbuffers::Offset<InParentNamespace> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = ::flatbuffers::Offset<InParentNamespace>(end);
    return o;
  }
};

inline ::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(
    ::flatbuffers::FlatBufferBuilder &_fbb) {
  InParentNamespaceBuilder builder_(_fbb);
  return builder_.Finish();
}

::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);

namespace Example2 {

struct MonsterT : public ::flatbuffers::NativeTable {
  typedef Monster TableType;
};

struct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
  typedef MonsterT NativeTableType;
  typedef MonsterBuilder Builder;
  typedef MyGame::Example::MonsterBinarySchema BinarySchema;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return MonsterTypeTable();
  }
  bool Verify(::flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           verifier.EndTable();
  }
  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct MonsterBuilder {
  typedef Monster Table;
  ::flatbuffers::FlatBufferBuilder &fbb_;
  ::flatbuffers::uoffset_t start_;
  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ::flatbuffers::Offset<Monster> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = ::flatbuffers::Offset<Monster>(end);
    return o;
  }
};

inline ::flatbuffers::Offset<Monster> CreateMonster(
    ::flatbuffers::FlatBufferBuilder &_fbb) {
  MonsterBuilder builder_(_fbb);
  return builder_.Finish();
}

::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);

}  // namespace Example2

namespace Example {

struct TestSimpleTableWithEnumT : public ::flatbuffers::NativeTable {
  typedef TestSimpleTableWithEnum TableType;
  MyGame::Example::Color color = MyGame::Example::Color_Green;
};

struct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
  typedef TestSimpleTableWithEnumT NativeTableType;
  typedef TestSimpleTableWithEnumBuilder Builder;
  typedef MyGame::Example::MonsterBinarySchema BinarySchema;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return TestSimpleTableWithEnumTypeTable();
  }
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_COLOR = 4
  };
  MyGame::Example::Color color() const {
    return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 2));
  }
  bool mutate_color(MyGame::Example::Color _color = static_cast<MyGame::Example::Color>(2)) {
    return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 2);
  }
  bool Verify(::flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<uint8_t>(verifier, VT_COLOR, 1) &&
           verifier.EndTable();
  }
  TestSimpleTableWithEnumT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(TestSimpleTableWithEnumT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static ::flatbuffers::Offset<TestSimpleTableWithEnum> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct TestSimpleTableWithEnumBuilder {
  typedef TestSimpleTableWithEnum Table;
  ::flatbuffers::FlatBufferBuilder &fbb_;
  ::flatbuffers::uoffset_t start_;
  void add_color(MyGame::Example::Color color) {
    fbb_.AddElement<uint8_t>(TestSimpleTableWithEnum::VT_COLOR, static_cast<uint8_t>(color), 2);
  }
  explicit TestSimpleTableWithEnumBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ::flatbuffers::Offset<TestSimpleTableWithEnum> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = ::flatbuffers::Offset<TestSimpleTableWithEnum>(end);
    return o;
  }
};

inline ::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    MyGame::Example::Color color = MyGame::Example::Color_Green) {
  TestSimpleTableWithEnumBuilder builder_(_fbb);
  builder_.add_color(color);
  return builder_.Finish();
}

::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct StatT : public ::flatbuffers::NativeTable {
  typedef Stat TableType;
  std::string id{};
  int64_t val = 0;
  uint16_t count = 0;
};

struct Stat FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
  typedef StatT NativeTableType;
  typedef StatBuilder Builder;
  typedef MyGame::Example::MonsterBinarySchema BinarySchema;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return StatTypeTable();
  }
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ID = 4,
    VT_VAL = 6,
    VT_COUNT = 8
  };
  const ::flatbuffers::String *id() const {
    return GetPointer<const ::flatbuffers::String *>(VT_ID);
  }
  ::flatbuffers::String *mutable_id() {
    return GetPointer<::flatbuffers::String *>(VT_ID);
  }
  int64_t val() const {
    return GetField<int64_t>(VT_VAL, 0);
  }
  bool mutate_val(int64_t _val = 0) {
    return SetField<int64_t>(VT_VAL, _val, 0);
  }
  uint16_t count() const {
    return GetField<uint16_t>(VT_COUNT, 0);
  }
  bool mutate_count(uint16_t _count = 0) {
    return SetField<uint16_t>(VT_COUNT, _count, 0);
  }
  bool KeyCompareLessThan(const Stat * const o) const {
    return count() < o->count();
  }
  int KeyCompareWithValue(uint16_t _count) const {
    return static_cast<int>(count() > _count) - static_cast<int>(count() < _count);
  }
  bool Verify(::flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_ID) &&
           verifier.VerifyString(id()) &&
           VerifyField<int64_t>(verifier, VT_VAL, 8) &&
           VerifyField<uint16_t>(verifier, VT_COUNT, 2) &&
           verifier.EndTable();
  }
  StatT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(StatT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static ::flatbuffers::Offset<Stat> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct StatBuilder {
  typedef Stat Table;
  ::flatbuffers::FlatBufferBuilder &fbb_;
  ::flatbuffers::uoffset_t start_;
  void add_id(::flatbuffers::Offset<::flatbuffers::String> id) {
    fbb_.AddOffset(Stat::VT_ID, id);
  }
  void add_val(int64_t val) {
    fbb_.AddElement<int64_t>(Stat::VT_VAL, val, 0);
  }
  void add_count(uint16_t count) {
    fbb_.AddElement<uint16_t>(Stat::VT_COUNT, count, 0);
  }
  explicit StatBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ::flatbuffers::Offset<Stat> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = ::flatbuffers::Offset<Stat>(end);
    return o;
  }
};

inline ::flatbuffers::Offset<Stat> CreateStat(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    ::flatbuffers::Offset<::flatbuffers::String> id = 0,
    int64_t val = 0,
    uint16_t count = 0) {
  StatBuilder builder_(_fbb);
  builder_.add_val(val);
  builder_.add_id(id);
  builder_.add_count(count);
  return builder_.Finish();
}

inline ::flatbuffers::Offset<Stat> CreateStatDirect(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    const char *id = nullptr,
    int64_t val = 0,
    uint16_t count = 0) {
  auto id__ = id ? _fbb.CreateString(id) : 0;
  return MyGame::Example::CreateStat(
      _fbb,
      id__,
      val,
      count);
}

::flatbuffers::Offset<Stat> CreateStat(::flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct ReferrableT : public ::flatbuffers::NativeTable {
  typedef Referrable TableType;
  uint64_t id = 0;
};

struct Referrable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
  typedef ReferrableT NativeTableType;
  typedef ReferrableBuilder Builder;
  typedef MyGame::Example::MonsterBinarySchema BinarySchema;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return ReferrableTypeTable();
  }
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ID = 4
  };
  uint64_t id() const {
    return GetField<uint64_t>(VT_ID, 0);
  }
  bool mutate_id(uint64_t _id = 0) {
    return SetField<uint64_t>(VT_ID, _id, 0);
  }
  bool KeyCompareLessThan(const Referrable * const o) const {
    return id() < o->id();
  }
  int KeyCompareWithValue(uint64_t _id) const {
    return static_cast<int>(id() > _id) - static_cast<int>(id() < _id);
  }
  bool Verify(::flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<uint64_t>(verifier, VT_ID, 8) &&
           verifier.EndTable();
  }
  ReferrableT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(ReferrableT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static ::flatbuffers::Offset<Referrable> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct ReferrableBuilder {
  typedef Referrable Table;
  ::flatbuffers::FlatBufferBuilder &fbb_;
  ::flatbuffers::uoffset_t start_;
  void add_id(uint64_t id) {
    fbb_.AddElement<uint64_t>(Referrable::VT_ID, id, 0);
  }
  explicit ReferrableBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ::flatbuffers::Offset<Referrable> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = ::flatbuffers::Offset<Referrable>(end);
    return o;
  }
};

inline ::flatbuffers::Offset<Referrable> CreateReferrable(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    uint64_t id = 0) {
  ReferrableBuilder builder_(_fbb);
  builder_.add_id(id);
  return builder_.Finish();
}

::flatbuffers::Offset<Referrable> CreateReferrable(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct MonsterT : public ::flatbuffers::NativeTable {
  typedef Monster TableType;
  std::unique_ptr<MyGame::Example::Vec3> pos{};
  int16_t mana = 150;
  int16_t hp = 100;
  std::string name{};
  std::vector<uint8_t> inventory{};
  MyGame::Example::Color color = MyGame::Example::Color_Blue;
  MyGame::Example::AnyUnion test{};
  std::vector<MyGame::Example::Test> test4{};
  std::vector<std::string> testarrayofstring{};
  std::vector<std::unique_ptr<MyGame::Example::MonsterT>> testarrayoftables{};
  std::unique_ptr<MyGame::Example::MonsterT> enemy{};
  std::vector<uint8_t> testnestedflatbuffer{};
  std::unique_ptr<MyGame::Example::StatT> testempty{};
  bool testbool = false;
  int32_t testhashs32_fnv1 = 0;
  uint32_t testhashu32_fnv1 = 0;
  int64_t testhashs64_fnv1 = 0;
  uint64_t testhashu64_fnv1 = 0;
  int32_t testhashs32_fnv1a = 0;
  Stat *testhashu32_fnv1a = nullptr;
  int64_t testhashs64_fnv1a = 0;
  uint64_t testhashu64_fnv1a = 0;
  std::vector<bool> testarrayofbools{};
  float testf = 3.14159f;
  float testf2 = 3.0f;
  float testf3 = 0.0f;
  std::vector<std::string> testarrayofstring2{};
  std::vector<MyGame::Example::Ability> testarrayofsortedstruct{};
  std::vector<uint8_t> flex{};
  std::vector<MyGame::Example::Test> test5{};
  std::vector<int64_t> vector_of_longs{};
  std::vector<double> vector_of_doubles{};
  std::unique_ptr<MyGame::InParentNamespaceT> parent_namespace_test{};
  std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_referrables{};
  ReferrableT *single_weak_reference = nullptr;
  std::vector<ReferrableT *> vector_of_weak_references{};
  std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_strong_referrables{};
  ReferrableT *co_owning_reference = nullptr;
  std::vector<std::unique_ptr<ReferrableT>> vector_of_co_owning_references{};
  ReferrableT *non_owning_reference = nullptr;
  std::vector<ReferrableT *> vector_of_non_owning_references{};
  MyGame::Example::AnyUniqueAliasesUnion any_unique{};
  MyGame::Example::AnyAmbiguousAliasesUnion any_ambiguous{};
  std::vector<MyGame::Example::Color> vector_of_enums{};
  MyGame::Example::Race signed_enum = MyGame::Example::Race_None;
  std::vector<uint8_t> testrequirednestedflatbuffer{};
  std::vector<std::unique_ptr<MyGame::Example::StatT>> scalar_key_sorted_tables{};
  MyGame::Example::Test native_inline{};
  MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0);
  MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne;
  float nan_default = std::numeric_limits<float>::quiet_NaN();
  float inf_default = std::numeric_limits<float>::infinity();
  float positive_inf_default = std::numeric_limits<float>::infinity();
  float infinity_default = std::numeric_limits<float>::infinity();
  float positive_infinity_default = std::numeric_limits<float>::infinity();
  float negative_inf_default = -std::numeric_limits<float>::infinity();
  float negative_infinity_default = -std::numeric_limits<float>::infinity();
  double double_inf_default = std::numeric_limits<double>::infinity();
  MonsterT() = default;
  MonsterT(const MonsterT &o);
  MonsterT(MonsterT&&) FLATBUFFERS_NOEXCEPT = default;
  MonsterT &operator=(MonsterT o) FLATBUFFERS_NOEXCEPT;
};

/// an example documentation comment: "monster object"
struct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
  typedef MonsterT NativeTableType;
  typedef MonsterBuilder Builder;
  typedef MyGame::Example::MonsterBinarySchema BinarySchema;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return MonsterTypeTable();
  }
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_POS = 4,
    VT_MANA = 6,
    VT_HP = 8,
    VT_NAME = 10,
    VT_INVENTORY = 14,
    VT_COLOR = 16,
    VT_TEST_TYPE = 18,
    VT_TEST = 20,
    VT_TEST4 = 22,
    VT_TESTARRAYOFSTRING = 24,
    VT_TESTARRAYOFTABLES = 26,
    VT_ENEMY = 28,
    VT_TESTNESTEDFLATBUFFER = 30,
    VT_TESTEMPTY = 32,
    VT_TESTBOOL = 34,
    VT_TESTHASHS32_FNV1 = 36,
    VT_TESTHASHU32_FNV1 = 38,
    VT_TESTHASHS64_FNV1 = 40,
    VT_TESTHASHU64_FNV1 = 42,
    VT_TESTHASHS32_FNV1A = 44,
    VT_TESTHASHU32_FNV1A = 46,
    VT_TESTHASHS64_FNV1A = 48,
    VT_TESTHASHU64_FNV1A = 50,
    VT_TESTARRAYOFBOOLS = 52,
    VT_TESTF = 54,
    VT_TESTF2 = 56,
    VT_TESTF3 = 58,
    VT_TESTARRAYOFSTRING2 = 60,
    VT_TESTARRAYOFSORTEDSTRUCT = 62,
    VT_FLEX = 64,
    VT_TEST5 = 66,
    VT_VECTOR_OF_LONGS = 68,
    VT_VECTOR_OF_DOUBLES = 70,
    VT_PARENT_NAMESPACE_TEST = 72,
    VT_VECTOR_OF_REFERRABLES = 74,
    VT_SINGLE_WEAK_REFERENCE = 76,
    VT_VECTOR_OF_WEAK_REFERENCES = 78,
    VT_VECTOR_OF_STRONG_REFERRABLES = 80,
    VT_CO_OWNING_REFERENCE = 82,
    VT_VECTOR_OF_CO_OWNING_REFERENCES = 84,
    VT_NON_OWNING_REFERENCE = 86,
    VT_VECTOR_OF_NON_OWNING_REFERENCES = 88,
    VT_ANY_UNIQUE_TYPE = 90,
    VT_ANY_UNIQUE = 92,
    VT_ANY_AMBIGUOUS_TYPE = 94,
    VT_ANY_AMBIGUOUS = 96,
    VT_VECTOR_OF_ENUMS = 98,
    VT_SIGNED_ENUM = 100,
    VT_TESTREQUIREDNESTEDFLATBUFFER = 102,
    VT_SCALAR_KEY_SORTED_TABLES = 104,
    VT_NATIVE_INLINE = 106,
    VT_LONG_ENUM_NON_ENUM_DEFAULT = 108,
    VT_LONG_ENUM_NORMAL_DEFAULT = 110,
    VT_NAN_DEFAULT = 112,
    VT_INF_DEFAULT = 114,
    VT_POSITIVE_INF_DEFAULT = 116,
    VT_INFINITY_DEFAULT = 118,
    VT_POSITIVE_INFINITY_DEFAULT = 120,
    VT_NEGATIVE_INF_DEFAULT = 122,
    VT_NEGATIVE_INFINITY_DEFAULT = 124,
    VT_DOUBLE_INF_DEFAULT = 126
  };
  const MyGame::Example::Vec3 *pos() const {
    return GetStruct<const MyGame::Example::Vec3 *>(VT_POS);
  }
  MyGame::Example::Vec3 *mutable_pos() {
    return GetStruct<MyGame::Example::Vec3 *>(VT_POS);
  }
  int16_t mana() const {
    return GetField<int16_t>(VT_MANA, 150);
  }
  bool mutate_mana(int16_t _mana = 150) {
    return SetField<int16_t>(VT_MANA, _mana, 150);
  }
  int16_t hp() const {
    return GetField<int16_t>(VT_HP, 100);
  }
  bool mutate_hp(int16_t _hp = 100) {
    return SetField<int16_t>(VT_HP, _hp, 100);
  }
  const ::flatbuffers::String *name() const {
    return GetPointer<const ::flatbuffers::String *>(VT_NAME);
  }
  ::flatbuffers::String *mutable_name() {
    return GetPointer<::flatbuffers::String *>(VT_NAME);
  }
  bool KeyCompareLessThan(const Monster * const o) const {
    return *name() < *o->name();
  }
  int KeyCompareWithValue(const char *_name) const {
    return strcmp(name()->c_str(), _name);
  }
  const ::flatbuffers::Vector<uint8_t> *inventory() const {
    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);
  }
  ::flatbuffers::Vector<uint8_t> *mutable_inventory() {
    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);
  }
  MyGame::Example::Color color() const {
    return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 8));
  }
  bool mutate_color(MyGame::Example::Color _color = static_cast<MyGame::Example::Color>(8)) {
    return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 8);
  }
  MyGame::Example::Any test_type() const {
    return static_cast<MyGame::Example::Any>(GetField<uint8_t>(VT_TEST_TYPE, 0));
  }
  const void *test() const {
    return GetPointer<const void *>(VT_TEST);
  }
  template<typename T> const T *test_as() const;
  const MyGame::Example::Monster *test_as_Monster() const {
    return test_type() == MyGame::Example::Any_Monster ? static_cast<const MyGame::Example::Monster *>(test()) : nullptr;
  }
  const MyGame::Example::TestSimpleTableWithEnum *test_as_TestSimpleTableWithEnum() const {
    return test_type() == MyGame::Example::Any_TestSimpleTableWithEnum ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(test()) : nullptr;
  }
  const MyGame::Example2::Monster *test_as_MyGame_Example2_Monster() const {
    return test_type() == MyGame::Example::Any_MyGame_Example2_Monster ? static_cast<const MyGame::Example2::Monster *>(test()) : nullptr;
  }
  void *mutable_test() {
    return GetPointer<void *>(VT_TEST);
  }
  const ::flatbuffers::Vector<const MyGame::Example::Test *> *test4() const {
    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);
  }
  ::flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test4() {
    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);
  }
  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring() const {
    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);
  }
  ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *mutable_testarrayofstring() {
    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);
  }
  /// an example documentation comment: this will end up in the generated code
  /// multiline too
  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables() const {
    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);
  }
  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *mutable_testarrayoftables() {
    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);
  }
  const MyGame::Example::Monster *enemy() const {
    return GetPointer<const MyGame::Example::Monster *>(VT_ENEMY);
  }
  MyGame::Example::Monster *mutable_enemy() {
    return GetPointer<MyGame::Example::Monster *>(VT_ENEMY);
  }
  const ::flatbuffers::Vector<uint8_t> *testnestedflatbuffer() const {
    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);
  }
  ::flatbuffers::Vector<uint8_t> *mutable_testnestedflatbuffer() {
    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);
  }
  const MyGame::Example::Monster *testnestedflatbuffer_nested_root() const {
    const auto _f = testnestedflatbuffer();
    return _f ? ::flatbuffers::GetRoot<MyGame::Example::Monster>(_f->Data())
              : nullptr;
  }
  const MyGame::Example::Stat *testempty() const {
    return GetPointer<const MyGame::Example::Stat *>(VT_TESTEMPTY);
  }
  MyGame::Example::Stat *mutable_testempty() {
    return GetPointer<MyGame::Example::Stat *>(VT_TESTEMPTY);
  }
  bool testbool() const {
    return GetField<uint8_t>(VT_TESTBOOL, 0) != 0;
  }
  bool mutate_testbool(bool _testbool = 0) {
    return SetField<uint8_t>(VT_TESTBOOL, static_cast<uint8_t>(_testbool), 0);
  }
  int32_t testhashs32_fnv1() const {
    return GetField<int32_t>(VT_TESTHASHS32_FNV1, 0);
  }
  bool mutate_testhashs32_fnv1(int32_t _testhashs32_fnv1 = 0) {
    return SetField<int32_t>(VT_TESTHASHS32_FNV1, _testhashs32_fnv1, 0);
  }
  uint32_t testhashu32_fnv1() const {
    return GetField<uint32_t>(VT_TESTHASHU32_FNV1, 0);
  }
  bool mutate_testhashu32_fnv1(uint32_t _testhashu32_fnv1 = 0) {
    return SetField<uint32_t>(VT_TESTHASHU32_FNV1, _testhashu32_fnv1, 0);
  }
  int64_t testhashs64_fnv1() const {
    return GetField<int64_t>(VT_TESTHASHS64_FNV1, 0);
  }
  bool mutate_testhashs64_fnv1(int64_t _testhashs64_fnv1 = 0) {
    return SetField<int64_t>(VT_TESTHASHS64_FNV1, _testhashs64_fnv1, 0);
  }
  uint64_t testhashu64_fnv1() const {
    return GetField<uint64_t>(VT_TESTHASHU64_FNV1, 0);
  }
  bool mutate_testhashu64_fnv1(uint64_t _testhashu64_fnv1 = 0) {
    return SetField<uint64_t>(VT_TESTHASHU64_FNV1, _testhashu64_fnv1, 0);
  }
  int32_t testhashs32_fnv1a() const {
    return GetField<int32_t>(VT_TESTHASHS32_FNV1A, 0);
  }
  bool mutate_testhashs32_fnv1a(int32_t _testhashs32_fnv1a = 0) {
    return SetField<int32_t>(VT_TESTHASHS32_FNV1A, _testhashs32_fnv1a, 0);
  }
  uint32_t testhashu32_fnv1a() const {
    return GetField<uint32_t>(VT_TESTHASHU32_FNV1A, 0);
  }
  bool mutate_testhashu32_fnv1a(uint32_t _testhashu32_fnv1a = 0) {
    return SetField<uint32_t>(VT_TESTHASHU32_FNV1A, _testhashu32_fnv1a, 0);
  }
  int64_t testhashs64_fnv1a() const {
    return GetField<int64_t>(VT_TESTHASHS64_FNV1A, 0);
  }
  bool mutate_testhashs64_fnv1a(int64_t _testhashs64_fnv1a = 0) {
    return SetField<int64_t>(VT_TESTHASHS64_FNV1A, _testhashs64_fnv1a, 0);
  }
  uint64_t testhashu64_fnv1a() const {
    return GetField<uint64_t>(VT_TESTHASHU64_FNV1A, 0);
  }
  bool mutate_testhashu64_fnv1a(uint64_t _testhashu64_fnv1a = 0) {
    return SetField<uint64_t>(VT_TESTHASHU64_FNV1A, _testhashu64_fnv1a, 0);
  }
  const ::flatbuffers::Vector<uint8_t> *testarrayofbools() const {
    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);
  }
  ::flatbuffers::Vector<uint8_t> *mutable_testarrayofbools() {
    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);
  }
  float testf() const {
    return GetField<float>(VT_TESTF, 3.14159f);
  }
  bool mutate_testf(float _testf = 3.14159f) {
    return SetField<float>(VT_TESTF, _testf, 3.14159f);
  }
  float testf2() const {
    return GetField<float>(VT_TESTF2, 3.0f);
  }
  bool mutate_testf2(float _testf2 = 3.0f) {
    return SetField<float>(VT_TESTF2, _testf2, 3.0f);
  }
  float testf3() const {
    return GetField<float>(VT_TESTF3, 0.0f);
  }
  bool mutate_testf3(float _testf3 = 0.0f) {
    return SetField<float>(VT_TESTF3, _testf3, 0.0f);
  }
  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring2() const {
    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);
  }
  ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *mutable_testarrayofstring2() {
    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);
  }
  const ::flatbuffers::Vector<const MyGame::Example::Ability *> *testarrayofsortedstruct() const {
    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);
  }
  ::flatbuffers::Vector<const MyGame::Example::Ability *> *mutable_testarrayofsortedstruct() {
    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);
  }
  const ::flatbuffers::Vector<uint8_t> *flex() const {
    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_FLEX);
  }
  ::flatbuffers::Vector<uint8_t> *mutable_flex() {
    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_FLEX);
  }
  flexbuffers::Reference flex_flexbuffer_root() const {
    const auto _f = flex();
    return _f ? flexbuffers::GetRoot(_f->Data(), _f->size())
              : flexbuffers::Reference();
  }
  const ::flatbuffers::Vector<const MyGame::Example::Test *> *test5() const {
    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);
  }
  ::flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test5() {
    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);
  }
  const ::flatbuffers::Vector<int64_t> *vector_of_longs() const {
    return GetPointer<const ::flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);
  }
  ::flatbuffers::Vector<int64_t> *mutable_vector_of_longs() {
    return GetPointer<::flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);
  }
  const ::flatbuffers::Vector<double> *vector_of_doubles() const {
    return GetPointer<const ::flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);
  }
  ::flatbuffers::Vector<double> *mutable_vector_of_doubles() {
    return GetPointer<::flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);
  }
  const MyGame::InParentNamespace *parent_namespace_test() const {
    return GetPointer<const MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);
  }
  MyGame::InParentNamespace *mutable_parent_namespace_test() {
    return GetPointer<MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);
  }
  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables() const {
    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);
  }
  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_referrables() {
    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);
  }
  uint64_t single_weak_reference() const {
    return GetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, 0);
  }
  bool mutate_single_weak_reference(uint64_t _single_weak_reference = 0) {
    return SetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, _single_weak_reference, 0);
  }
  const ::flatbuffers::Vector<uint64_t> *vector_of_weak_references() const {
    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES);
  }
  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_weak_references() {
    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES);
  }
  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables() const {
    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);
  }
  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_strong_referrables() {
    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);
  }
  uint64_t co_owning_reference() const {
    return GetField<uint64_t>(VT_CO_OWNING_REFERENCE, 0);
  }
  bool mutate_co_owning_reference(uint64_t _co_owning_reference = 0) {
    return SetField<uint64_t>(VT_CO_OWNING_REFERENCE, _co_owning_reference, 0);
  }
  const ::flatbuffers::Vector<uint64_t> *vector_of_co_owning_references() const {
    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);
  }
  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_co_owning_references() {
    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);
  }
  uint64_t non_owning_reference() const {
    return GetField<uint64_t>(VT_NON_OWNING_REFERENCE, 0);
  }
  bool mutate_non_owning_reference(uint64_t _non_owning_reference = 0) {
    return SetField<uint64_t>(VT_NON_OWNING_REFERENCE, _non_owning_reference, 0);
  }
  const ::flatbuffers::Vector<uint64_t> *vector_of_non_owning_references() const {
    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);
  }
  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_non_owning_references() {
    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);
  }
  MyGame::Example::AnyUniqueAliases any_unique_type() const {
    return static_cast<MyGame::Example::AnyUniqueAliases>(GetField<uint8_t>(VT_ANY_UNIQUE_TYPE, 0));
  }
  const void *any_unique() const {
    return GetPointer<const void *>(VT_ANY_UNIQUE);
  }
  template<typename T> const T *any_unique_as() const;
  const MyGame::Example::Monster *any_unique_as_M() const {
    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M ? static_cast<const MyGame::Example::Monster *>(any_unique()) : nullptr;
  }
  const MyGame::Example::TestSimpleTableWithEnum *any_unique_as_TS() const {
    return any_unique_type() == MyGame::Example::AnyUniqueAliases_TS ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(any_unique()) : nullptr;
  }
  const MyGame::Example2::Monster *any_unique_as_M2() const {
    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M2 ? static_cast<const MyGame::Example2::Monster *>(any_unique()) : nullptr;
  }
  void *mutable_any_unique() {
    return GetPointer<void *>(VT_ANY_UNIQUE);
  }
  MyGame::Example::AnyAmbiguousAliases any_ambiguous_type() const {
    return static_cast<MyGame::Example::AnyAmbiguousAliases>(GetField<uint8_t>(VT_ANY_AMBIGUOUS_TYPE, 0));
  }
  const void *any_ambiguous() const {
    return GetPointer<const void *>(VT_ANY_AMBIGUOUS);
  }
  const MyGame::Example::Monster *any_ambiguous_as_M1() const {
    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M1 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;
  }
  const MyGame::Example::Monster *any_ambiguous_as_M2() const {
    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M2 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;
  }
  const MyGame::Example::Monster *any_ambiguous_as_M3() const {
    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M3 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;
  }
  void *mutable_any_ambiguous() {
    return GetPointer<void *>(VT_ANY_AMBIGUOUS);
  }
  const ::flatbuffers::Vector<uint8_t> *vector_of_enums() const {
    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);
  }
  ::flatbuffers::Vector<uint8_t> *mutable_vector_of_enums() {
    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);
  }
  MyGame::Example::Race signed_enum() const {
    return static_cast<MyGame::Example::Race>(GetField<int8_t>(VT_SIGNED_ENUM, -1));
  }
  bool mutate_signed_enum(MyGame::Example::Race _signed_enum = static_cast<MyGame::Example::Race>(-1)) {
    return SetField<int8_t>(VT_SIGNED_ENUM, static_cast<int8_t>(_signed_enum), -1);
  }
  const ::flatbuffers::Vector<uint8_t> *testrequirednestedflatbuffer() const {
    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);
  }
  ::flatbuffers::Vector<uint8_t> *mutable_testrequirednestedflatbuffer() {
    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);
  }
  const MyGame::Example::Monster *testrequirednestedflatbuffer_nested_root() const {
    const auto _f = testrequirednestedflatbuffer();
    return _f ? ::flatbuffers::GetRoot<MyGame::Example::Monster>(_f->Data())
              : nullptr;
  }
  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *scalar_key_sorted_tables() const {
    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *>(VT_SCALAR_KEY_SORTED_TABLES);
  }
  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *mutable_scalar_key_sorted_tables() {
    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *>(VT_SCALAR_KEY_SORTED_TABLES);
  }
  const MyGame::Example::Test *native_inline() const {
    return GetStruct<const MyGame::Example::Test *>(VT_NATIVE_INLINE);
  }
  MyGame::Example::Test *mutable_native_inline() {
    return GetStruct<MyGame::Example::Test *>(VT_NATIVE_INLINE);
  }
  MyGame::Example::LongEnum long_enum_non_enum_default() const {
    return static_cast<MyGame::Example::LongEnum>(GetField<uint64_t>(VT_LONG_ENUM_NON_ENUM_DEFAULT, 0));
  }
  bool mutate_long_enum_non_enum_default(MyGame::Example::LongEnum _long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0)) {
    return SetField<uint64_t>(VT_LONG_ENUM_NON_ENUM_DEFAULT, static_cast<uint64_t>(_long_enum_non_enum_default), 0);
  }
  MyGame::Example::LongEnum long_enum_normal_default() const {
    return static_cast<MyGame::Example::LongEnum>(GetField<uint64_t>(VT_LONG_ENUM_NORMAL_DEFAULT, 2ULL));
  }
  bool mutate_long_enum_normal_default(MyGame::Example::LongEnum _long_enum_normal_default = static_cast<MyGame::Example::LongEnum>(2ULL)) {
    return SetField<uint64_t>(VT_LONG_ENUM_NORMAL_DEFAULT, static_cast<uint64_t>(_long_enum_normal_default), 2ULL);
  }
  float nan_default() const {
    return GetField<float>(VT_NAN_DEFAULT, std::numeric_limits<float>::quiet_NaN());
  }
  bool mutate_nan_default(float _nan_default = std::numeric_limits<float>::quiet_NaN()) {
    return SetField<float>(VT_NAN_DEFAULT, _nan_default, std::numeric_limits<float>::quiet_NaN());
  }
  float inf_default() const {
    return GetField<float>(VT_INF_DEFAULT, std::numeric_limits<float>::infinity());
  }
  bool mutate_inf_default(float _inf_default = std::numeric_limits<float>::infinity()) {
    return SetField<float>(VT_INF_DEFAULT, _inf_default, std::numeric_limits<float>::infinity());
  }
  float positive_inf_default() const {
    return GetField<float>(VT_POSITIVE_INF_DEFAULT, std::numeric_limits<float>::infinity());
  }
  bool mutate_positive_inf_default(float _positive_inf_default = std::numeric_limits<float>::infinity()) {
    return SetField<float>(VT_POSITIVE_INF_DEFAULT, _positive_inf_default, std::numeric_limits<float>::infinity());
  }
  float infinity_default() const {
    return GetField<float>(VT_INFINITY_DEFAULT, std::numeric_limits<float>::infinity());
  }
  bool mutate_infinity_default(float _infinity_default = std::numeric_limits<float>::infinity()) {
    return SetField<float>(VT_INFINITY_DEFAULT, _infinity_default, std::numeric_limits<float>::infinity());
  }
  float positive_infinity_default() const {
    return GetField<float>(VT_POSITIVE_INFINITY_DEFAULT, std::numeric_limits<float>::infinity());
  }
  bool mutate_positive_infinity_default(float _positive_infinity_default = std::numeric_limits<float>::infinity()) {
    return SetField<float>(VT_POSITIVE_INFINITY_DEFAULT, _positive_infinity_default, std::numeric_limits<float>::infinity());
  }
  float negative_inf_default() const {
    return GetField<float>(VT_NEGATIVE_INF_DEFAULT, -std::numeric_limits<float>::infinity());
  }
  bool mutate_negative_inf_default(float _negative_inf_default = -std::numeric_limits<float>::infinity()) {
    return SetField<float>(VT_NEGATIVE_INF_DEFAULT, _negative_inf_default, -std::numeric_limits<float>::infinity());
  }
  float negative_infinity_default() const {
    return GetField<float>(VT_NEGATIVE_INFINITY_DEFAULT, -std::numeric_limits<float>::infinity());
  }
  bool mutate_negative_infinity_default(float _negative_infinity_default = -std::numeric_limits<float>::infinity()) {
    return SetField<float>(VT_NEGATIVE_INFINITY_DEFAULT, _negative_infinity_default, -std::numeric_limits<float>::infinity());
  }
  double double_inf_default() const {
    return GetField<double>(VT_DOUBLE_INF_DEFAULT, std::numeric_limits<double>::infinity());
  }
  bool mutate_double_inf_default(double _double_inf_default = std::numeric_limits<double>::infinity()) {
    return SetField<double>(VT_DOUBLE_INF_DEFAULT, _double_inf_default, std::numeric_limits<double>::infinity());
  }
  bool Verify(::flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<MyGame::Example::Vec3>(verifier, VT_POS, 8) &&
           VerifyField<int16_t>(verifier, VT_MANA, 2) &&
           VerifyField<int16_t>(verifier, VT_HP, 2) &&
           VerifyOffsetRequired(verifier, VT_NAME) &&
           verifier.VerifyString(name()) &&
           VerifyOffset(verifier, VT_INVENTORY) &&
           verifier.VerifyVector(inventory()) &&
           VerifyField<uint8_t>(verifier, VT_COLOR, 1) &&
           VerifyField<uint8_t>(verifier, VT_TEST_TYPE, 1) &&
           VerifyOffset(verifier, VT_TEST) &&
           VerifyAny(verifier, test(), test_type()) &&
           VerifyOffset(verifier, VT_TEST4) &&
           verifier.VerifyVector(test4()) &&
           VerifyOffset(verifier, VT_TESTARRAYOFSTRING) &&
           verifier.VerifyVector(testarrayofstring()) &&
           verifier.VerifyVectorOfStrings(testarrayofstring()) &&
           VerifyOffset(verifier, VT_TESTARRAYOFTABLES) &&
           verifier.VerifyVector(testarrayoftables()) &&
           verifier.VerifyVectorOfTables(testarrayoftables()) &&
           VerifyOffset(verifier, VT_ENEMY) &&
           verifier.VerifyTable(enemy()) &&
           VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&
           verifier.VerifyVector(testnestedflatbuffer()) &&
           verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testnestedflatbuffer(), nullptr) &&
           VerifyOffset(verifier, VT_TESTEMPTY) &&
           verifier.VerifyTable(testempty()) &&
           VerifyField<uint8_t>(verifier, VT_TESTBOOL, 1) &&
           VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1, 4) &&
           VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1, 4) &&
           VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1, 8) &&
           VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1, 8) &&
           VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1A, 4) &&
           VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1A, 4) &&
           VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1A, 8) &&
           VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1A, 8) &&
           VerifyOffset(verifier, VT_TESTARRAYOFBOOLS) &&
           verifier.VerifyVector(testarrayofbools()) &&
           VerifyField<float>(verifier, VT_TESTF, 4) &&
           VerifyField<float>(verifier, VT_TESTF2, 4) &&
           VerifyField<float>(verifier, VT_TESTF3, 4) &&
           VerifyOffset(verifier, VT_TESTARRAYOFSTRING2) &&
           verifier.VerifyVector(testarrayofstring2()) &&
           verifier.VerifyVectorOfStrings(testarrayofstring2()) &&
           VerifyOffset(verifier, VT_TESTARRAYOFSORTEDSTRUCT) &&
           verifier.VerifyVector(testarrayofsortedstruct()) &&
           VerifyOffset(verifier, VT_FLEX) &&
           verifier.VerifyVector(flex()) &&
           flexbuffers::VerifyNestedFlexBuffer(flex(), verifier) &&
           VerifyOffset(verifier, VT_TEST5) &&
           verifier.VerifyVector(test5()) &&
           VerifyOffset(verifier, VT_VECTOR_OF_LONGS) &&
           verifier.VerifyVector(vector_of_longs()) &&
           VerifyOffset(verifier, VT_VECTOR_OF_DOUBLES) &&
           verifier.VerifyVector(vector_of_doubles()) &&
           VerifyOffset(verifier, VT_PARENT_NAMESPACE_TEST) &&
           verifier.VerifyTable(parent_namespace_test()) &&
           VerifyOffset(verifier, VT_VECTOR_OF_REFERRABLES) &&
           verifier.VerifyVector(vector_of_referrables()) &&
           verifier.VerifyVectorOfTables(vector_of_referrables()) &&
           VerifyField<uint64_t>(verifier, VT_SINGLE_WEAK_REFERENCE, 8) &&
           VerifyOffset(verifier, VT_VECTOR_OF_WEAK_REFERENCES) &&
           verifier.VerifyVector(vector_of_weak_references()) &&
           VerifyOffset(verifier, VT_VECTOR_OF_STRONG_REFERRABLES) &&
           verifier.VerifyVector(vector_of_strong_referrables()) &&
           verifier.VerifyVectorOfTables(vector_of_strong_referrables()) &&
           VerifyField<uint64_t>(verifier, VT_CO_OWNING_REFERENCE, 8) &&
           VerifyOffset(verifier, VT_VECTOR_OF_CO_OWNING_REFERENCES) &&
           verifier.VerifyVector(vector_of_co_owning_references()) &&
           VerifyField<uint64_t>(verifier, VT_NON_OWNING_REFERENCE, 8) &&
           VerifyOffset(verifier, VT_VECTOR_OF_NON_OWNING_REFERENCES) &&
           verifier.VerifyVector(vector_of_non_owning_references()) &&
           VerifyField<uint8_t>(verifier, VT_ANY_UNIQUE_TYPE, 1) &&
           VerifyOffset(verifier, VT_ANY_UNIQUE) &&
           VerifyAnyUniqueAliases(verifier, any_unique(), any_unique_type()) &&
           VerifyField<uint8_t>(verifier, VT_ANY_AMBIGUOUS_TYPE, 1) &&
           VerifyOffset(verifier, VT_ANY_AMBIGUOUS) &&
           VerifyAnyAmbiguousAliases(verifier, any_ambiguous(), any_ambiguous_type()) &&
           VerifyOffset(verifier, VT_VECTOR_OF_ENUMS) &&
           verifier.VerifyVector(vector_of_enums()) &&
           VerifyField<int8_t>(verifier, VT_SIGNED_ENUM, 1) &&
           VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
           verifier.VerifyVector(testrequirednestedflatbuffer()) &&
           verifier.VerifyNestedFlatBuffer<MyGame::Example::Monster>(testrequirednestedflatbuffer(), nullptr) &&
           VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&
           verifier.VerifyVector(scalar_key_sorted_tables()) &&
           verifier.VerifyVectorOfTables(scalar_key_sorted_tables()) &&
           VerifyField<MyGame::Example::Test>(verifier, VT_NATIVE_INLINE, 2) &&
           VerifyField<uint64_t>(verifier, VT_LONG_ENUM_NON_ENUM_DEFAULT, 8) &&
           VerifyField<uint64_t>(verifier, VT_LONG_ENUM_NORMAL_DEFAULT, 8) &&
           VerifyField<float>(verifier, VT_NAN_DEFAULT, 4) &&
           VerifyField<float>(verifier, VT_INF_DEFAULT, 4) &&
           VerifyField<float>(verifier, VT_POSITIVE_INF_DEFAULT, 4) &&
           VerifyField<float>(verifier, VT_INFINITY_DEFAULT, 4) &&
           VerifyField<float>(verifier, VT_POSITIVE_INFINITY_DEFAULT, 4) &&
           VerifyField<float>(verifier, VT_NEGATIVE_INF_DEFAULT, 4) &&
           VerifyField<float>(verifier, VT_NEGATIVE_INFINITY_DEFAULT, 4) &&
           VerifyField<double>(verifier, VT_DOUBLE_INF_DEFAULT, 8) &&
           verifier.EndTable();
  }
  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

template<> inline const MyGame::Example::Monster *Monster::test_as<MyGame::Example::Monster>() const {
  return test_as_Monster();
}

template<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::test_as<MyGame::Example::TestSimpleTableWithEnum>() const {
  return test_as_TestSimpleTableWithEnum();
}

template<> inline const MyGame::Example2::Monster *Monster::test_as<MyGame::Example2::Monster>() const {
  return test_as_MyGame_Example2_Monster();
}

template<> inline const MyGame::Example::Monster *Monster::any_unique_as<MyGame::Example::Monster>() const {
  return any_unique_as_M();
}

template<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::any_unique_as<MyGame::Example::TestSimpleTableWithEnum>() const {
  return any_unique_as_TS();
}

template<> inline const MyGame::Example2::Monster *Monster::any_unique_as<MyGame::Example2::Monster>() const {
  return any_unique_as_M2();
}

struct MonsterBuilder {
  typedef Monster Table;
  ::flatbuffers::FlatBufferBuilder &fbb_;
  ::flatbuffers::uoffset_t start_;
  void add_pos(const MyGame::Example::Vec3 *pos) {
    fbb_.AddStruct(Monster::VT_POS, pos);
  }
  void add_mana(int16_t mana) {
    fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150);
  }
  void add_hp(int16_t hp) {
    fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100);
  }
  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {
    fbb_.AddOffset(Monster::VT_NAME, name);
  }
  void add_inventory(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory) {
    fbb_.AddOffset(Monster::VT_INVENTORY, inventory);
  }
  void add_color(MyGame::Example::Color color) {
    fbb_.AddElement<uint8_t>(Monster::VT_COLOR, static_cast<uint8_t>(color), 8);
  }
  void add_test_type(MyGame::Example::Any test_type) {
    fbb_.AddElement<uint8_t>(Monster::VT_TEST_TYPE, static_cast<uint8_t>(test_type), 0);
  }
  void add_test(::flatbuffers::Offset<void> test) {
    fbb_.AddOffset(Monster::VT_TEST, test);
  }
  void add_test4(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test4) {
    fbb_.AddOffset(Monster::VT_TEST4, test4);
  }
  void add_testarrayofstring(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring) {
    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING, testarrayofstring);
  }
  void add_testarrayoftables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables) {
    fbb_.AddOffset(Monster::VT_TESTARRAYOFTABLES, testarrayoftables);
  }
  void add_enemy(::flatbuffers::Offset<MyGame::Example::Monster> enemy) {
    fbb_.AddOffset(Monster::VT_ENEMY, enemy);
  }
  void add_testnestedflatbuffer(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testnestedflatbuffer) {
    fbb_.AddOffset(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer);
  }
  void add_testempty(::flatbuffers::Offset<MyGame::Example::Stat> testempty) {
    fbb_.AddOffset(Monster::VT_TESTEMPTY, testempty);
  }
  void add_testbool(bool testbool) {
    fbb_.AddElement<uint8_t>(Monster::VT_TESTBOOL, static_cast<uint8_t>(testbool), 0);
  }
  void add_testhashs32_fnv1(int32_t testhashs32_fnv1) {
    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0);
  }
  void add_testhashu32_fnv1(uint32_t testhashu32_fnv1) {
    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0);
  }
  void add_testhashs64_fnv1(int64_t testhashs64_fnv1) {
    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0);
  }
  void add_testhashu64_fnv1(uint64_t testhashu64_fnv1) {
    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0);
  }
  void add_testhashs32_fnv1a(int32_t testhashs32_fnv1a) {
    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0);
  }
  void add_testhashu32_fnv1a(uint32_t testhashu32_fnv1a) {
    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0);
  }
  void add_testhashs64_fnv1a(int64_t testhashs64_fnv1a) {
    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0);
  }
  void add_testhashu64_fnv1a(uint64_t testhashu64_fnv1a) {
    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0);
  }
  void add_testarrayofbools(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testarrayofbools) {
    fbb_.AddOffset(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools);
  }
  void add_testf(float testf) {
    fbb_.AddElement<float>(Monster::VT_TESTF, testf, 3.14159f);
  }
  void add_testf2(float testf2) {
    fbb_.AddElement<float>(Monster::VT_TESTF2, testf2, 3.0f);
  }
  void add_testf3(float testf3) {
    fbb_.AddElement<float>(Monster::VT_TESTF3, testf3, 0.0f);
  }
  void add_testarrayofstring2(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring2) {
    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2);
  }
  void add_testarrayofsortedstruct(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct) {
    fbb_.AddOffset(Monster::VT_TESTARRAYOFSORTEDSTRUCT, testarrayofsortedstruct);
  }
  void add_flex(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> flex) {
    fbb_.AddOffset(Monster::VT_FLEX, flex);
  }
  void add_test5(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test5) {
    fbb_.AddOffset(Monster::VT_TEST5, test5);
  }
  void add_vector_of_longs(::flatbuffers::Offset<::flatbuffers::Vector<int64_t>> vector_of_longs) {
    fbb_.AddOffset(Monster::VT_VECTOR_OF_LONGS, vector_of_longs);
  }
  void add_vector_of_doubles(::flatbuffers::Offset<::flatbuffers::Vector<double>> vector_of_doubles) {
    fbb_.AddOffset(Monster::VT_VECTOR_OF_DOUBLES, vector_of_doubles);
  }
  void add_parent_namespace_test(::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test) {
    fbb_.AddOffset(Monster::VT_PARENT_NAMESPACE_TEST, parent_namespace_test);
  }
  void add_vector_of_referrables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables) {
    fbb_.AddOffset(Monster::VT_VECTOR_OF_REFERRABLES, vector_of_referrables);
  }
  void add_single_weak_reference(uint64_t single_weak_reference) {
    fbb_.AddElement<uint64_t>(Monster::VT_SINGLE_WEAK_REFERENCE, single_weak_reference, 0);
  }
  void add_vector_of_weak_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_weak_references) {
    fbb_.AddOffset(Monster::VT_VECTOR_OF_WEAK_REFERENCES, vector_of_weak_references);
  }
  void add_vector_of_strong_referrables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables) {
    fbb_.AddOffset(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, vector_of_strong_referrables);
  }
  void add_co_owning_reference(uint64_t co_owning_reference) {
    fbb_.AddElement<uint64_t>(Monster::VT_CO_OWNING_REFERENCE, co_owning_reference, 0);
  }
  void add_vector_of_co_owning_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_co_owning_references) {
    fbb_.AddOffset(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, vector_of_co_owning_references);
  }
  void add_non_owning_reference(uint64_t non_owning_reference) {
    fbb_.AddElement<uint64_t>(Monster::VT_NON_OWNING_REFERENCE, non_owning_reference, 0);
  }
  void add_vector_of_non_owning_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_non_owning_references) {
    fbb_.AddOffset(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, vector_of_non_owning_references);
  }
  void add_any_unique_type(MyGame::Example::AnyUniqueAliases any_unique_type) {
    fbb_.AddElement<uint8_t>(Monster::VT_ANY_UNIQUE_TYPE, static_cast<uint8_t>(any_unique_type), 0);
  }
  void add_any_unique(::flatbuffers::Offset<void> any_unique) {
    fbb_.AddOffset(Monster::VT_ANY_UNIQUE, any_unique);
  }
  void add_any_ambiguous_type(MyGame::Example::AnyAmbiguousAliases any_ambiguous_type) {
    fbb_.AddElement<uint8_t>(Monster::VT_ANY_AMBIGUOUS_TYPE, static_cast<uint8_t>(any_ambiguous_type), 0);
  }
  void add_any_ambiguous(::flatbuffers::Offset<void> any_ambiguous) {
    fbb_.AddOffset(Monster::VT_ANY_AMBIGUOUS, any_ambiguous);
  }
  void add_vector_of_enums(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> vector_of_enums) {
    fbb_.AddOffset(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);
  }
  void add_signed_enum(MyGame::Example::Race signed_enum) {
    fbb_.AddElement<int8_t>(Monster::VT_SIGNED_ENUM, static_cast<int8_t>(signed_enum), -1);
  }
  void add_testrequirednestedflatbuffer(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer) {
    fbb_.AddOffset(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);
  }
  void add_scalar_key_sorted_tables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>>> scalar_key_sorted_tables) {
    fbb_.AddOffset(Monster::VT_SCALAR_KEY_SORTED_TABLES, scalar_key_sorted_tables);
  }
  void add_native_inline(const MyGame::Example::Test *native_inline) {
    fbb_.AddStruct(Monster::VT_NATIVE_INLINE, native_inline);
  }
  void add_long_enum_non_enum_default(MyGame::Example::LongEnum long_enum_non_enum_default) {
    fbb_.AddElement<uint64_t>(Monster::VT_LONG_ENUM_NON_ENUM_DEFAULT, static_cast<uint64_t>(long_enum_non_enum_default), 0);
  }
  void add_long_enum_normal_default(MyGame::Example::LongEnum long_enum_normal_default) {
    fbb_.AddElement<uint64_t>(Monster::VT_LONG_ENUM_NORMAL_DEFAULT, static_cast<uint64_t>(long_enum_normal_default), 2ULL);
  }
  void add_nan_default(float nan_default) {
    fbb_.AddElement<float>(Monster::VT_NAN_DEFAULT, nan_default, std::numeric_limits<float>::quiet_NaN());
  }
  void add_inf_default(float inf_default) {
    fbb_.AddElement<float>(Monster::VT_INF_DEFAULT, inf_default, std::numeric_limits<float>::infinity());
  }
  void add_positive_inf_default(float positive_inf_default) {
    fbb_.AddElement<float>(Monster::VT_POSITIVE_INF_DEFAULT, positive_inf_default, std::numeric_limits<float>::infinity());
  }
  void add_infinity_default(float infinity_default) {
    fbb_.AddElement<float>(Monster::VT_INFINITY_DEFAULT, infinity_default, std::numeric_limits<float>::infinity());
  }
  void add_positive_infinity_default(float positive_infinity_default) {
    fbb_.AddElement<float>(Monster::VT_POSITIVE_INFINITY_DEFAULT, positive_infinity_default, std::numeric_limits<float>::infinity());
  }
  void add_negative_inf_default(float negative_inf_default) {
    fbb_.AddElement<float>(Monster::VT_NEGATIVE_INF_DEFAULT, negative_inf_default, -std::numeric_limits<float>::infinity());
  }
  void add_negative_infinity_default(float negative_infinity_default) {
    fbb_.AddElement<float>(Monster::VT_NEGATIVE_INFINITY_DEFAULT, negative_infinity_default, -std::numeric_limits<float>::infinity());
  }
  void add_double_inf_default(double double_inf_default) {
    fbb_.AddElement<double>(Monster::VT_DOUBLE_INF_DEFAULT, double_inf_default, std::numeric_limits<double>::infinity());
  }
  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ::flatbuffers::Offset<Monster> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = ::flatbuffers::Offset<Monster>(end);
    fbb_.Required(o, Monster::VT_NAME);
    return o;
  }
};

inline ::flatbuffers::Offset<Monster> CreateMonster(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    const MyGame::Example::Vec3 *pos = nullptr,
    int16_t mana = 150,
    int16_t hp = 100,
    ::flatbuffers::Offset<::flatbuffers::String> name = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory = 0,
    MyGame::Example::Color color = MyGame::Example::Color_Blue,
    MyGame::Example::Any test_type = MyGame::Example::Any_NONE,
    ::flatbuffers::Offset<void> test = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test4 = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables = 0,
    ::flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testnestedflatbuffer = 0,
    ::flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,
    bool testbool = false,
    int32_t testhashs32_fnv1 = 0,
    uint32_t testhashu32_fnv1 = 0,
    int64_t testhashs64_fnv1 = 0,
    uint64_t testhashu64_fnv1 = 0,
    int32_t testhashs32_fnv1a = 0,
    uint32_t testhashu32_fnv1a = 0,
    int64_t testhashs64_fnv1a = 0,
    uint64_t testhashu64_fnv1a = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testarrayofbools = 0,
    float testf = 3.14159f,
    float testf2 = 3.0f,
    float testf3 = 0.0f,
    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring2 = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> flex = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test5 = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<int64_t>> vector_of_longs = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<double>> vector_of_doubles = 0,
    ::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables = 0,
    uint64_t single_weak_reference = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_weak_references = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables = 0,
    uint64_t co_owning_reference = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_co_owning_references = 0,
    uint64_t non_owning_reference = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_non_owning_references = 0,
    MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases_NONE,
    ::flatbuffers::Offset<void> any_unique = 0,
    MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,
    ::flatbuffers::Offset<void> any_ambiguous = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> vector_of_enums = 0,
    MyGame::Example::Race signed_enum = MyGame::Example::Race_None,
    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>>> scalar_key_sorted_tables = 0,
    const MyGame::Example::Test *native_inline = nullptr,
    MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0),
    MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne,
    float nan_default = std::numeric_limits<float>::quiet_NaN(),
    float inf_default = std::numeric_limits<float>::infinity(),
    float positive_inf_default = std::numeric_limits<float>::infinity(),
    float infinity_default = std::numeric_limits<float>::infinity(),
    float positive_infinity_default = std::numeric_limits<float>::infinity(),
    float negative_inf_default = -std::numeric_limits<float>::infinity(),
    float negative_infinity_default = -std::numeric_limits<float>::infinity(),
    double double_inf_default = std::numeric_limits<double>::infinity()) {
  MonsterBuilder builder_(_fbb);
  builder_.add_double_inf_default(double_inf_default);
  builder_.add_long_enum_normal_default(long_enum_normal_default);
  builder_.add_long_enum_non_enum_default(long_enum_non_enum_default);
  builder_.add_non_owning_reference(non_owning_reference);
  builder_.add_co_owning_reference(co_owning_reference);
  builder_.add_single_weak_reference(single_weak_reference);
  builder_.add_testhashu64_fnv1a(testhashu64_fnv1a);
  builder_.add_testhashs64_fnv1a(testhashs64_fnv1a);
  builder_.add_testhashu64_fnv1(testhashu64_fnv1);
  builder_.add_testhashs64_fnv1(testhashs64_fnv1);
  builder_.add_negative_infinity_default(negative_infinity_default);
  builder_.add_negative_inf_default(negative_inf_default);
  builder_.add_positive_infinity_default(positive_infinity_default);
  builder_.add_infinity_default(infinity_default);
  builder_.add_positive_inf_default(positive_inf_default);
  builder_.add_inf_default(inf_default);
  builder_.add_nan_default(nan_default);
  builder_.add_native_inline(native_inline);
  builder_.add_scalar_key_sorted_tables(scalar_key_sorted_tables);
  builder_.add_testrequirednestedflatbuffer(testrequirednestedflatbuffer);
  builder_.add_vector_of_enums(vector_of_enums);
  builder_.add_any_ambiguous(any_ambiguous);
  builder_.add_any_unique(any_unique);
  builder_.add_vector_of_non_owning_references(vector_of_non_owning_references);
  builder_.add_vector_of_co_owning_references(vector_of_co_owning_references);
  builder_.add_vector_of_strong_referrables(vector_of_strong_referrables);
  builder_.add_vector_of_weak_references(vector_of_weak_references);
  builder_.add_vector_of_referrables(vector_of_referrables);
  builder_.add_parent_namespace_test(parent_namespace_test);
  builder_.add_vector_of_doubles(vector_of_doubles);
  builder_.add_vector_of_longs(vector_of_longs);
  builder_.add_test5(test5);
  builder_.add_flex(flex);
  builder_.add_testarrayofsortedstruct(testarrayofsortedstruct);
  builder_.add_testarrayofstring2(testarrayofstring2);
  builder_.add_testf3(testf3);
  builder_.add_testf2(testf2);
  builder_.add_testf(testf);
  builder_.add_testarrayofbools(testarrayofbools);
  builder_.add_testhashu32_fnv1a(testhashu32_fnv1a);
  builder_.add_testhashs32_fnv1a(testhashs32_fnv1a);
  builder_.add_testhashu32_fnv1(testhashu32_fnv1);
  builder_.add_testhashs32_fnv1(testhashs32_fnv1);
  builder_.add_testempty(testempty);
  builder_.add_testnestedflatbuffer(testnestedflatbuffer);
  builder_.add_enemy(enemy);
  builder_.add_testarrayoftables(testarrayoftables);
  builder_.add_testarrayofstring(testarrayofstring);
  builder_.add_test4(test4);
  builder_.add_test(test);
  builder_.add_inventory(inventory);
  builder_.add_name(name);
  builder_.add_pos(pos);
  builder_.add_hp(hp);
  builder_.add_mana(mana);
  builder_.add_signed_enum(signed_enum);
  builder_.add_any_ambiguous_type(any_ambiguous_type);
  builder_.add_any_unique_type(any_unique_type);
  builder_.add_testbool(testbool);
  builder_.add_test_type(test_type);
  builder_.add_color(color);
  return builder_.Finish();
}

inline ::flatbuffers::Offset<Monster> CreateMonsterDirect(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    const MyGame::Example::Vec3 *pos = nullptr,
    int16_t mana = 150,
    int16_t hp = 100,
    const char *name = nullptr,
    const std::vector<uint8_t> *inventory = nullptr,
    MyGame::Example::Color color = MyGame::Example::Color_Blue,
    MyGame::Example::Any test_type = MyGame::Example::Any_NONE,
    ::flatbuffers::Offset<void> test = 0,
    const std::vector<MyGame::Example::Test> *test4 = nullptr,
    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring = nullptr,
    std::vector<::flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables = nullptr,
    ::flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,
    const std::vector<uint8_t> *testnestedflatbuffer = nullptr,
    ::flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,
    bool testbool = false,
    int32_t testhashs32_fnv1 = 0,
    uint32_t testhashu32_fnv1 = 0,
    int64_t testhashs64_fnv1 = 0,
    uint64_t testhashu64_fnv1 = 0,
    int32_t testhashs32_fnv1a = 0,
    uint32_t testhashu32_fnv1a = 0,
    int64_t testhashs64_fnv1a = 0,
    uint64_t testhashu64_fnv1a = 0,
    const std::vector<uint8_t> *testarrayofbools = nullptr,
    float testf = 3.14159f,
    float testf2 = 3.0f,
    float testf3 = 0.0f,
    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring2 = nullptr,
    std::vector<MyGame::Example::Ability> *testarrayofsortedstruct = nullptr,
    const std::vector<uint8_t> *flex = nullptr,
    const std::vector<MyGame::Example::Test> *test5 = nullptr,
    const std::vector<int64_t> *vector_of_longs = nullptr,
    const std::vector<double> *vector_of_doubles = nullptr,
    ::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0,
    std::vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables = nullptr,
    uint64_t single_weak_reference = 0,
    const std::vector<uint64_t> *vector_of_weak_references = nullptr,
    std::vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables = nullptr,
    uint64_t co_owning_reference = 0,
    const std::vector<uint64_t> *vector_of_co_owning_references = nullptr,
    uint64_t non_owning_reference = 0,
    const std::vector<uint64_t> *vector_of_non_owning_references = nullptr,
    MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases_NONE,
    ::flatbuffers::Offset<void> any_unique = 0,
    MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,
    ::flatbuffers::Offset<void> any_ambiguous = 0,
    const std::vector<uint8_t> *vector_of_enums = nullptr,
    MyGame::Example::Race signed_enum = MyGame::Example::Race_None,
    const std::vector<uint8_t> *testrequirednestedflatbuffer = nullptr,
    std::vector<::flatbuffers::Offset<MyGame::Example::Stat>> *scalar_key_sorted_tables = nullptr,
    const MyGame::Example::Test *native_inline = nullptr,
    MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0),
    MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne,
    float nan_default = std::numeric_limits<float>::quiet_NaN(),
    float inf_default = std::numeric_limits<float>::infinity(),
    float positive_inf_default = std::numeric_limits<float>::infinity(),
    float infinity_default = std::numeric_limits<float>::infinity(),
    float positive_infinity_default = std::numeric_limits<float>::infinity(),
    float negative_inf_default = -std::numeric_limits<float>::infinity(),
    float negative_infinity_default = -std::numeric_limits<float>::infinity(),
    double double_inf_default = std::numeric_limits<double>::infinity()) {
  auto name__ = name ? _fbb.CreateString(name) : 0;
  auto inventory__ = inventory ? _fbb.CreateVector<uint8_t>(*inventory) : 0;
  auto test4__ = test4 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test4) : 0;
  auto testarrayofstring__ = testarrayofstring ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*testarrayofstring) : 0;
  auto testarrayoftables__ = testarrayoftables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Monster>(testarrayoftables) : 0;
  auto testnestedflatbuffer__ = testnestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testnestedflatbuffer) : 0;
  auto testarrayofbools__ = testarrayofbools ? _fbb.CreateVector<uint8_t>(*testarrayofbools) : 0;
  auto testarrayofstring2__ = testarrayofstring2 ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*testarrayofstring2) : 0;
  auto testarrayofsortedstruct__ = testarrayofsortedstruct ? _fbb.CreateVectorOfSortedStructs<MyGame::Example::Ability>(testarrayofsortedstruct) : 0;
  auto flex__ = flex ? _fbb.CreateVector<uint8_t>(*flex) : 0;
  auto test5__ = test5 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test5) : 0;
  auto vector_of_longs__ = vector_of_longs ? _fbb.CreateVector<int64_t>(*vector_of_longs) : 0;
  auto vector_of_doubles__ = vector_of_doubles ? _fbb.CreateVector<double>(*vector_of_doubles) : 0;
  auto vector_of_referrables__ = vector_of_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_referrables) : 0;
  auto vector_of_weak_references__ = vector_of_weak_references ? _fbb.CreateVector<uint64_t>(*vector_of_weak_references) : 0;
  auto vector_of_strong_referrables__ = vector_of_strong_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_strong_referrables) : 0;
  auto vector_of_co_owning_references__ = vector_of_co_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_co_owning_references) : 0;
  auto vector_of_non_owning_references__ = vector_of_non_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_non_owning_references) : 0;
  auto vector_of_enums__ = vector_of_enums ? _fbb.CreateVector<uint8_t>(*vector_of_enums) : 0;
  auto testrequirednestedflatbuffer__ = testrequirednestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testrequirednestedflatbuffer) : 0;
  auto scalar_key_sorted_tables__ = scalar_key_sorted_tables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Stat>(scalar_key_sorted_tables) : 0;
  return MyGame::Example::CreateMonster(
      _fbb,
      pos,
      mana,
      hp,
      name__,
      inventory__,
      color,
      test_type,
      test,
      test4__,
      testarrayofstring__,
      testarrayoftables__,
      enemy,
      testnestedflatbuffer__,
      testempty,
      testbool,
      testhashs32_fnv1,
      testhashu32_fnv1,
      testhashs64_fnv1,
      testhashu64_fnv1,
      testhashs32_fnv1a,
      testhashu32_fnv1a,
      testhashs64_fnv1a,
      testhashu64_fnv1a,
      testarrayofbools__,
      testf,
      testf2,
      testf3,
      testarrayofstring2__,
      testarrayofsortedstruct__,
      flex__,
      test5__,
      vector_of_longs__,
      vector_of_doubles__,
      parent_namespace_test,
      vector_of_referrables__,
      single_weak_reference,
      vector_of_weak_references__,
      vector_of_strong_referrables__,
      co_owning_reference,
      vector_of_co_owning_references__,
      non_owning_reference,
      vector_of_non_owning_references__,
      any_unique_type,
      any_unique,
      any_ambiguous_type,
      any_ambiguous,
      vector_of_enums__,
      signed_enum,
      testrequirednestedflatbuffer__,
      scalar_key_sorted_tables__,
      native_inline,
      long_enum_non_enum_default,
      long_enum_normal_default,
      nan_default,
      inf_default,
      positive_inf_default,
      infinity_default,
      positive_infinity_default,
      negative_inf_default,
      negative_infinity_default,
      double_inf_default);
}

::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct TypeAliasesT : public ::flatbuffers::NativeTable {
  typedef TypeAliases TableType;
  int8_t i8 = 0;
  uint8_t u8 = 0;
  int16_t i16 = 0;
  uint16_t u16 = 0;
  int32_t i32 = 0;
  uint32_t u32 = 0;
  int64_t i64 = 0;
  uint64_t u64 = 0;
  float f32 = 0.0f;
  double f64 = 0.0;
  std::vector<int8_t> v8{};
  std::vector<double> vf64{};
};

struct TypeAliases FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
  typedef TypeAliasesT NativeTableType;
  typedef TypeAliasesBuilder Builder;
  typedef MyGame::Example::MonsterBinarySchema BinarySchema;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return TypeAliasesTypeTable();
  }
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_I8 = 4,
    VT_U8 = 6,
    VT_I16 = 8,
    VT_U16 = 10,
    VT_I32 = 12,
    VT_U32 = 14,
    VT_I64 = 16,
    VT_U64 = 18,
    VT_F32 = 20,
    VT_F64 = 22,
    VT_V8 = 24,
    VT_VF64 = 26
  };
  int8_t i8() const {
    return GetField<int8_t>(VT_I8, 0);
  }
  bool mutate_i8(int8_t _i8 = 0) {
    return SetField<int8_t>(VT_I8, _i8, 0);
  }
  uint8_t u8() const {
    return GetField<uint8_t>(VT_U8, 0);
  }
  bool mutate_u8(uint8_t _u8 = 0) {
    return SetField<uint8_t>(VT_U8, _u8, 0);
  }
  int16_t i16() const {
    return GetField<int16_t>(VT_I16, 0);
  }
  bool mutate_i16(int16_t _i16 = 0) {
    return SetField<int16_t>(VT_I16, _i16, 0);
  }
  uint16_t u16() const {
    return GetField<uint16_t>(VT_U16, 0);
  }
  bool mutate_u16(uint16_t _u16 = 0) {
    return SetField<uint16_t>(VT_U16, _u16, 0);
  }
  int32_t i32() const {
    return GetField<int32_t>(VT_I32, 0);
  }
  bool mutate_i32(int32_t _i32 = 0) {
    return SetField<int32_t>(VT_I32, _i32, 0);
  }
  uint32_t u32() const {
    return GetField<uint32_t>(VT_U32, 0);
  }
  bool mutate_u32(uint32_t _u32 = 0) {
    return SetField<uint32_t>(VT_U32, _u32, 0);
  }
  int64_t i64() const {
    return GetField<int64_t>(VT_I64, 0);
  }
  bool mutate_i64(int64_t _i64 = 0) {
    return SetField<int64_t>(VT_I64, _i64, 0);
  }
  uint64_t u64() const {
    return GetField<uint64_t>(VT_U64, 0);
  }
  bool mutate_u64(uint64_t _u64 = 0) {
    return SetField<uint64_t>(VT_U64, _u64, 0);
  }
  float f32() const {
    return GetField<float>(VT_F32, 0.0f);
  }
  bool mutate_f32(float _f32 = 0.0f) {
    return SetField<float>(VT_F32, _f32, 0.0f);
  }
  double f64() const {
    return GetField<double>(VT_F64, 0.0);
  }
  bool mutate_f64(double _f64 = 0.0) {
    return SetField<double>(VT_F64, _f64, 0.0);
  }
  const ::flatbuffers::Vector<int8_t> *v8() const {
    return GetPointer<const ::flatbuffers::Vector<int8_t> *>(VT_V8);
  }
  ::flatbuffers::Vector<int8_t> *mutable_v8() {
    return GetPointer<::flatbuffers::Vector<int8_t> *>(VT_V8);
  }
  const ::flatbuffers::Vector<double> *vf64() const {
    return GetPointer<const ::flatbuffers::Vector<double> *>(VT_VF64);
  }
  ::flatbuffers::Vector<double> *mutable_vf64() {
    return GetPointer<::flatbuffers::Vector<double> *>(VT_VF64);
  }
  bool Verify(::flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<int8_t>(verifier, VT_I8, 1) &&
           VerifyField<uint8_t>(verifier, VT_U8, 1) &&
           VerifyField<int16_t>(verifier, VT_I16, 2) &&
           VerifyField<uint16_t>(verifier, VT_U16, 2) &&
           VerifyField<int32_t>(verifier, VT_I32, 4) &&
           VerifyField<uint32_t>(verifier, VT_U32, 4) &&
           VerifyField<int64_t>(verifier, VT_I64, 8) &&
           VerifyField<uint64_t>(verifier, VT_U64, 8) &&
           VerifyField<float>(verifier, VT_F32, 4) &&
           VerifyField<double>(verifier, VT_F64, 8) &&
           VerifyOffset(verifier, VT_V8) &&
           verifier.VerifyVector(v8()) &&
           VerifyOffset(verifier, VT_VF64) &&
           verifier.VerifyVector(vf64()) &&
           verifier.EndTable();
  }
  TypeAliasesT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(TypeAliasesT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static ::flatbuffers::Offset<TypeAliases> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct TypeAliasesBuilder {
  typedef TypeAliases Table;
  ::flatbuffers::FlatBufferBuilder &fbb_;
  ::flatbuffers::uoffset_t start_;
  void add_i8(int8_t i8) {
    fbb_.AddElement<int8_t>(TypeAliases::VT_I8, i8, 0);
  }
  void add_u8(uint8_t u8) {
    fbb_.AddElement<uint8_t>(TypeAliases::VT_U8, u8, 0);
  }
  void add_i16(int16_t i16) {
    fbb_.AddElement<int16_t>(TypeAliases::VT_I16, i16, 0);
  }
  void add_u16(uint16_t u16) {
    fbb_.AddElement<uint16_t>(TypeAliases::VT_U16, u16, 0);
  }
  void add_i32(int32_t i32) {
    fbb_.AddElement<int32_t>(TypeAliases::VT_I32, i32, 0);
  }
  void add_u32(uint32_t u32) {
    fbb_.AddElement<uint32_t>(TypeAliases::VT_U32, u32, 0);
  }
  void add_i64(int64_t i64) {
    fbb_.AddElement<int64_t>(TypeAliases::VT_I64, i64, 0);
  }
  void add_u64(uint64_t u64) {
    fbb_.AddElement<uint64_t>(TypeAliases::VT_U64, u64, 0);
  }
  void add_f32(float f32) {
    fbb_.AddElement<float>(TypeAliases::VT_F32, f32, 0.0f);
  }
  void add_f64(double f64) {
    fbb_.AddElement<double>(TypeAliases::VT_F64, f64, 0.0);
  }
  void add_v8(::flatbuffers::Offset<::flatbuffers::Vector<int8_t>> v8) {
    fbb_.AddOffset(TypeAliases::VT_V8, v8);
  }
  void add_vf64(::flatbuffers::Offset<::flatbuffers::Vector<double>> vf64) {
    fbb_.AddOffset(TypeAliases::VT_VF64, vf64);
  }
  explicit TypeAliasesBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ::flatbuffers::Offset<TypeAliases> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = ::flatbuffers::Offset<TypeAliases>(end);
    return o;
  }
};

inline ::flatbuffers::Offset<TypeAliases> CreateTypeAliases(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    int8_t i8 = 0,
    uint8_t u8 = 0,
    int16_t i16 = 0,
    uint16_t u16 = 0,
    int32_t i32 = 0,
    uint32_t u32 = 0,
    int64_t i64 = 0,
    uint64_t u64 = 0,
    float f32 = 0.0f,
    double f64 = 0.0,
    ::flatbuffers::Offset<::flatbuffers::Vector<int8_t>> v8 = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<double>> vf64 = 0) {
  TypeAliasesBuilder builder_(_fbb);
  builder_.add_f64(f64);
  builder_.add_u64(u64);
  builder_.add_i64(i64);
  builder_.add_vf64(vf64);
  builder_.add_v8(v8);
  builder_.add_f32(f32);
  builder_.add_u32(u32);
  builder_.add_i32(i32);
  builder_.add_u16(u16);
  builder_.add_i16(i16);
  builder_.add_u8(u8);
  builder_.add_i8(i8);
  return builder_.Finish();
}

inline ::flatbuffers::Offset<TypeAliases> CreateTypeAliasesDirect(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    int8_t i8 = 0,
    uint8_t u8 = 0,
    int16_t i16 = 0,
    uint16_t u16 = 0,
    int32_t i32 = 0,
    uint32_t u32 = 0,
    int64_t i64 = 0,
    uint64_t u64 = 0,
    float f32 = 0.0f,
    double f64 = 0.0,
    const std::vector<int8_t> *v8 = nullptr,
    const std::vector<double> *vf64 = nullptr) {
  auto v8__ = v8 ? _fbb.CreateVector<int8_t>(*v8) : 0;
  auto vf64__ = vf64 ? _fbb.CreateVector<double>(*vf64) : 0;
  return MyGame::Example::CreateTypeAliases(
      _fbb,
      i8,
      u8,
      i16,
      u16,
      i32,
      u32,
      i64,
      u64,
      f32,
      f64,
      v8__,
      vf64__);
}

::flatbuffers::Offset<TypeAliases> CreateTypeAliases(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);

}  // namespace Example


inline bool operator==(const InParentNamespaceT &, const InParentNamespaceT &) {
  return true;
}

inline bool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs) {
    return !(lhs == rhs);
}


inline InParentNamespaceT *InParentNamespace::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
  auto _o = std::unique_ptr<InParentNamespaceT>(new InParentNamespaceT());
  UnPackTo(_o.get(), _resolver);
  return _o.release();
}

inline void InParentNamespace::UnPackTo(InParentNamespaceT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
}

inline ::flatbuffers::Offset<InParentNamespace> InParentNamespace::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  return CreateInParentNamespace(_fbb, _o, _rehasher);
}

inline ::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const InParentNamespaceT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  return MyGame::CreateInParentNamespace(
      _fbb);
}

namespace Example2 {


inline bool operator==(const MonsterT &, const MonsterT &) {
  return true;
}

inline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {
    return !(lhs == rhs);
}


inline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
  auto _o = std::unique_ptr<MonsterT>(new MonsterT());
  UnPackTo(_o.get(), _resolver);
  return _o.release();
}

inline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
}

inline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  return CreateMonster(_fbb, _o, _rehasher);
}

inline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  return MyGame::Example2::CreateMonster(
      _fbb);
}

}  // namespace Example2

namespace Example {


inline bool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) {
  return
      (lhs.color == rhs.color);
}

inline bool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) {
    return !(lhs == rhs);
}


inline TestSimpleTableWithEnumT *TestSimpleTableWithEnum::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
  auto _o = std::unique_ptr<TestSimpleTableWithEnumT>(new TestSimpleTableWithEnumT());
  UnPackTo(_o.get(), _resolver);
  return _o.release();
}

inline void TestSimpleTableWithEnum::UnPackTo(TestSimpleTableWithEnumT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = color(); _o->color = _e; }
}

inline ::flatbuffers::Offset<TestSimpleTableWithEnum> TestSimpleTableWithEnum::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  return CreateTestSimpleTableWithEnum(_fbb, _o, _rehasher);
}

inline ::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const TestSimpleTableWithEnumT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _color = _o->color;
  return MyGame::Example::CreateTestSimpleTableWithEnum(
      _fbb,
      _color);
}


inline bool operator==(const StatT &lhs, const StatT &rhs) {
  return
      (lhs.id == rhs.id) &&
      (lhs.val == rhs.val) &&
      (lhs.count == rhs.count);
}

inline bool operator!=(const StatT &lhs, const StatT &rhs) {
    return !(lhs == rhs);
}


inline StatT *Stat::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
  auto _o = std::unique_ptr<StatT>(new StatT());
  UnPackTo(_o.get(), _resolver);
  return _o.release();
}

inline void Stat::UnPackTo(StatT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = id(); if (_e) _o->id = _e->str(); }
  { auto _e = val(); _o->val = _e; }
  { auto _e = count(); _o->count = _e; }
}

inline ::flatbuffers::Offset<Stat> Stat::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  return CreateStat(_fbb, _o, _rehasher);
}

inline ::flatbuffers::Offset<Stat> CreateStat(::flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const StatT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _id = _o->id.empty() ? 0 : _fbb.CreateString(_o->id);
  auto _val = _o->val;
  auto _count = _o->count;
  return MyGame::Example::CreateStat(
      _fbb,
      _id,
      _val,
      _count);
}


inline bool operator==(const ReferrableT &lhs, const ReferrableT &rhs) {
  return
      (lhs.id == rhs.id);
}

inline bool operator!=(const ReferrableT &lhs, const ReferrableT &rhs) {
    return !(lhs == rhs);
}


inline ReferrableT *Referrable::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
  auto _o = std::unique_ptr<ReferrableT>(new ReferrableT());
  UnPackTo(_o.get(), _resolver);
  return _o.release();
}

inline void Referrable::UnPackTo(ReferrableT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = id(); _o->id = _e; }
}

inline ::flatbuffers::Offset<Referrable> Referrable::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  return CreateReferrable(_fbb, _o, _rehasher);
}

inline ::flatbuffers::Offset<Referrable> CreateReferrable(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const ReferrableT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _id = _o->id;
  return MyGame::Example::CreateReferrable(
      _fbb,
      _id);
}


inline bool operator==(const MonsterT &lhs, const MonsterT &rhs) {
  return
      ((lhs.pos == rhs.pos) || (lhs.pos && rhs.pos && *lhs.pos == *rhs.pos)) &&
      (lhs.mana == rhs.mana) &&
      (lhs.hp == rhs.hp) &&
      (lhs.name == rhs.name) &&
      (lhs.inventory == rhs.inventory) &&
      (lhs.color == rhs.color) &&
      (lhs.test == rhs.test) &&
      (lhs.test4 == rhs.test4) &&
      (lhs.testarrayofstring == rhs.testarrayofstring) &&
      (lhs.testarrayoftables.size() == rhs.testarrayoftables.size() && std::equal(lhs.testarrayoftables.cbegin(), lhs.testarrayoftables.cend(), rhs.testarrayoftables.cbegin(), [](std::unique_ptr<MyGame::Example::MonsterT> const &a, std::unique_ptr<MyGame::Example::MonsterT> const &b) { return (a == b) || (a && b && *a == *b); })) &&
      ((lhs.enemy == rhs.enemy) || (lhs.enemy && rhs.enemy && *lhs.enemy == *rhs.enemy)) &&
      (lhs.testnestedflatbuffer == rhs.testnestedflatbuffer) &&
      ((lhs.testempty == rhs.testempty) || (lhs.testempty && rhs.testempty && *lhs.testempty == *rhs.testempty)) &&
      (lhs.testbool == rhs.testbool) &&
      (lhs.testhashs32_fnv1 == rhs.testhashs32_fnv1) &&
      (lhs.testhashu32_fnv1 == rhs.testhashu32_fnv1) &&
      (lhs.testhashs64_fnv1 == rhs.testhashs64_fnv1) &&
      (lhs.testhashu64_fnv1 == rhs.testhashu64_fnv1) &&
      (lhs.testhashs32_fnv1a == rhs.testhashs32_fnv1a) &&
      (lhs.testhashu32_fnv1a == rhs.testhashu32_fnv1a) &&
      (lhs.testhashs64_fnv1a == rhs.testhashs64_fnv1a) &&
      (lhs.testhashu64_fnv1a == rhs.testhashu64_fnv1a) &&
      (lhs.testarrayofbools == rhs.testarrayofbools) &&
      (lhs.testf == rhs.testf) &&
      (lhs.testf2 == rhs.testf2) &&
      (lhs.testf3 == rhs.testf3) &&
      (lhs.testarrayofstring2 == rhs.testarrayofstring2) &&
      (lhs.testarrayofsortedstruct == rhs.testarrayofsortedstruct) &&
      (lhs.flex == rhs.flex) &&
      (lhs.test5 == rhs.test5) &&
      (lhs.vector_of_longs == rhs.vector_of_longs) &&
      (lhs.vector_of_doubles == rhs.vector_of_doubles) &&
      ((lhs.parent_namespace_test == rhs.parent_namespace_test) || (lhs.parent_namespace_test && rhs.parent_namespace_test && *lhs.parent_namespace_test == *rhs.parent_namespace_test)) &&
      (lhs.vector_of_referrables.size() == rhs.vector_of_referrables.size() && std::equal(lhs.vector_of_referrables.cbegin(), lhs.vector_of_referrables.cend(), rhs.vector_of_referrables.cbegin(), [](std::unique_ptr<MyGame::Example::ReferrableT> const &a, std::unique_ptr<MyGame::Example::ReferrableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&
      (lhs.single_weak_reference == rhs.single_weak_reference) &&
      (lhs.vector_of_weak_references == rhs.vector_of_weak_references) &&
      (lhs.vector_of_strong_referrables.size() == rhs.vector_of_strong_referrables.size() && std::equal(lhs.vector_of_strong_referrables.cbegin(), lhs.vector_of_strong_referrables.cend(), rhs.vector_of_strong_referrables.cbegin(), [](std::unique_ptr<MyGame::Example::ReferrableT> const &a, std::unique_ptr<MyGame::Example::ReferrableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&
      (lhs.co_owning_reference == rhs.co_owning_reference) &&
      (lhs.vector_of_co_owning_references == rhs.vector_of_co_owning_references) &&
      (lhs.non_owning_reference == rhs.non_owning_reference) &&
      (lhs.vector_of_non_owning_references == rhs.vector_of_non_owning_references) &&
      (lhs.any_unique == rhs.any_unique) &&
      (lhs.any_ambiguous == rhs.any_ambiguous) &&
      (lhs.vector_of_enums == rhs.vector_of_enums) &&
      (lhs.signed_enum == rhs.signed_enum) &&
      (lhs.testrequirednestedflatbuffer == rhs.testrequirednestedflatbuffer) &&
      (lhs.scalar_key_sorted_tables.size() == rhs.scalar_key_sorted_tables.size() && std::equal(lhs.scalar_key_sorted_tables.cbegin(), lhs.scalar_key_sorted_tables.cend(), rhs.scalar_key_sorted_tables.cbegin(), [](std::unique_ptr<MyGame::Example::StatT> const &a, std::unique_ptr<MyGame::Example::StatT> const &b) { return (a == b) || (a && b && *a == *b); })) &&
      (lhs.native_inline == rhs.native_inline) &&
      (lhs.long_enum_non_enum_default == rhs.long_enum_non_enum_default) &&
      (lhs.long_enum_normal_default == rhs.long_enum_normal_default) &&
      (lhs.nan_default == rhs.nan_default) &&
      (lhs.inf_default == rhs.inf_default) &&
      (lhs.positive_inf_default == rhs.positive_inf_default) &&
      (lhs.infinity_default == rhs.infinity_default) &&
      (lhs.positive_infinity_default == rhs.positive_infinity_default) &&
      (lhs.negative_inf_default == rhs.negative_inf_default) &&
      (lhs.negative_infinity_default == rhs.negative_infinity_default) &&
      (lhs.double_inf_default == rhs.double_inf_default);
}

inline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {
    return !(lhs == rhs);
}


inline MonsterT::MonsterT(const MonsterT &o)
      : pos((o.pos) ? new MyGame::Example::Vec3(*o.pos) : nullptr),
        mana(o.mana),
        hp(o.hp),
        name(o.name),
        inventory(o.inventory),
        color(o.color),
        test(o.test),
        test4(o.test4),
        testarrayofstring(o.testarrayofstring),
        enemy((o.enemy) ? new MyGame::Example::MonsterT(*o.enemy) : nullptr),
        testnestedflatbuffer(o.testnestedflatbuffer),
        testempty((o.testempty) ? new MyGame::Example::StatT(*o.testempty) : nullptr),
        testbool(o.testbool),
        testhashs32_fnv1(o.testhashs32_fnv1),
        testhashu32_fnv1(o.testhashu32_fnv1),
        testhashs64_fnv1(o.testhashs64_fnv1),
        testhashu64_fnv1(o.testhashu64_fnv1),
        testhashs32_fnv1a(o.testhashs32_fnv1a),
        testhashu32_fnv1a(o.testhashu32_fnv1a),
        testhashs64_fnv1a(o.testhashs64_fnv1a),
        testhashu64_fnv1a(o.testhashu64_fnv1a),
        testarrayofbools(o.testarrayofbools),
        testf(o.testf),
        testf2(o.testf2),
        testf3(o.testf3),
        testarrayofstring2(o.testarrayofstring2),
        testarrayofsortedstruct(o.testarrayofsortedstruct),
        flex(o.flex),
        test5(o.test5),
        vector_of_longs(o.vector_of_longs),
        vector_of_doubles(o.vector_of_doubles),
        parent_namespace_test((o.parent_namespace_test) ? new MyGame::InParentNamespaceT(*o.parent_namespace_test) : nullptr),
        single_weak_reference(o.single_weak_reference),
        vector_of_weak_references(o.vector_of_weak_references),
        co_owning_reference(o.co_owning_reference),
        non_owning_reference(o.non_owning_reference),
        vector_of_non_owning_references(o.vector_of_non_owning_references),
        any_unique(o.any_unique),
        any_ambiguous(o.any_ambiguous),
        vector_of_enums(o.vector_of_enums),
        signed_enum(o.signed_enum),
        testrequirednestedflatbuffer(o.testrequirednestedflatbuffer),
        native_inline(o.native_inline),
        long_enum_non_enum_default(o.long_enum_non_enum_default),
        long_enum_normal_default(o.long_enum_normal_default),
        nan_default(o.nan_default),
        inf_default(o.inf_default),
        positive_inf_default(o.positive_inf_default),
        infinity_default(o.infinity_default),
        positive_infinity_default(o.positive_infinity_default),
        negative_inf_default(o.negative_inf_default),
        negative_infinity_default(o.negative_infinity_default),
        double_inf_default(o.double_inf_default) {
  testarrayoftables.reserve(o.testarrayoftables.size());
  for (const auto &testarrayoftables_ : o.testarrayoftables) { testarrayoftables.emplace_back((testarrayoftables_) ? new MyGame::Example::MonsterT(*testarrayoftables_) : nullptr); }
  vector_of_referrables.reserve(o.vector_of_referrables.size());
  for (const auto &vector_of_referrables_ : o.vector_of_referrables) { vector_of_referrables.emplace_back((vector_of_referrables_) ? new MyGame::Example::ReferrableT(*vector_of_referrables_) : nullptr); }
  vector_of_strong_referrables.reserve(o.vector_of_strong_referrables.size());
  for (const auto &vector_of_strong_referrables_ : o.vector_of_strong_referrables) { vector_of_strong_referrables.emplace_back((vector_of_strong_referrables_) ? new MyGame::Example::ReferrableT(*vector_of_strong_referrables_) : nullptr); }
  vector_of_co_owning_references.reserve(o.vector_of_co_owning_references.size());
  for (const auto &vector_of_co_owning_references_ : o.vector_of_co_owning_references) { vector_of_co_owning_references.emplace_back((vector_of_co_owning_references_) ? new ReferrableT(*vector_of_co_owning_references_) : nullptr); }
  scalar_key_sorted_tables.reserve(o.scalar_key_sorted_tables.size());
  for (const auto &scalar_key_sorted_tables_ : o.scalar_key_sorted_tables) { scalar_key_sorted_tables.emplace_back((scalar_key_sorted_tables_) ? new MyGame::Example::StatT(*scalar_key_sorted_tables_) : nullptr); }
}

inline MonsterT &MonsterT::operator=(MonsterT o) FLATBUFFERS_NOEXCEPT {
  std::swap(pos, o.pos);
  std::swap(mana, o.mana);
  std::swap(hp, o.hp);
  std::swap(name, o.name);
  std::swap(inventory, o.inventory);
  std::swap(color, o.color);
  std::swap(test, o.test);
  std::swap(test4, o.test4);
  std::swap(testarrayofstring, o.testarrayofstring);
  std::swap(testarrayoftables, o.testarrayoftables);
  std::swap(enemy, o.enemy);
  std::swap(testnestedflatbuffer, o.testnestedflatbuffer);
  std::swap(testempty, o.testempty);
  std::swap(testbool, o.testbool);
  std::swap(testhashs32_fnv1, o.testhashs32_fnv1);
  std::swap(testhashu32_fnv1, o.testhashu32_fnv1);
  std::swap(testhashs64_fnv1, o.testhashs64_fnv1);
  std::swap(testhashu64_fnv1, o.testhashu64_fnv1);
  std::swap(testhashs32_fnv1a, o.testhashs32_fnv1a);
  std::swap(testhashu32_fnv1a, o.testhashu32_fnv1a);
  std::swap(testhashs64_fnv1a, o.testhashs64_fnv1a);
  std::swap(testhashu64_fnv1a, o.testhashu64_fnv1a);
  std::swap(testarrayofbools, o.testarrayofbools);
  std::swap(testf, o.testf);
  std::swap(testf2, o.testf2);
  std::swap(testf3, o.testf3);
  std::swap(testarrayofstring2, o.testarrayofstring2);
  std::swap(testarrayofsortedstruct, o.testarrayofsortedstruct);
  std::swap(flex, o.flex);
  std::swap(test5, o.test5);
  std::swap(vector_of_longs, o.vector_of_longs);
  std::swap(vector_of_doubles, o.vector_of_doubles);
  std::swap(parent_namespace_test, o.parent_namespace_test);
  std::swap(vector_of_referrables, o.vector_of_referrables);
  std::swap(single_weak_reference, o.single_weak_reference);
  std::swap(vector_of_weak_references, o.vector_of_weak_references);
  std::swap(vector_of_strong_referrables, o.vector_of_strong_referrables);
  std::swap(co_owning_reference, o.co_owning_reference);
  std::swap(vector_of_co_owning_references, o.vector_of_co_owning_references);
  std::swap(non_owning_reference, o.non_owning_reference);
  std::swap(vector_of_non_owning_references, o.vector_of_non_owning_references);
  std::swap(any_unique, o.any_unique);
  std::swap(any_ambiguous, o.any_ambiguous);
  std::swap(vector_of_enums, o.vector_of_enums);
  std::swap(signed_enum, o.signed_enum);
  std::swap(testrequirednestedflatbuffer, o.testrequirednestedflatbuffer);
  std::swap(scalar_key_sorted_tables, o.scalar_key_sorted_tables);
  std::swap(native_inline, o.native_inline);
  std::swap(long_enum_non_enum_default, o.long_enum_non_enum_default);
  std::swap(long_enum_normal_default, o.long_enum_normal_default);
  std::swap(nan_default, o.nan_default);
  std::swap(inf_default, o.inf_default);
  std::swap(positive_inf_default, o.positive_inf_default);
  std::swap(infinity_default, o.infinity_default);
  std::swap(positive_infinity_default, o.positive_infinity_default);
  std::swap(negative_inf_default, o.negative_inf_default);
  std::swap(negative_infinity_default, o.negative_infinity_default);
  std::swap(double_inf_default, o.double_inf_default);
  return *this;
}

inline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
  auto _o = std::unique_ptr<MonsterT>(new MonsterT());
  UnPackTo(_o.get(), _resolver);
  return _o.release();
}

inline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = pos(); if (_e) _o->pos = std::unique_ptr<MyGame::Example::Vec3>(new MyGame::Example::Vec3(*_e)); }
  { auto _e = mana(); _o->mana = _e; }
  { auto _e = hp(); _o->hp = _e; }
  { auto _e = name(); if (_e) _o->name = _e->str(); }
  { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->inventory.begin()); } }
  { auto _e = color(); _o->color = _e; }
  { auto _e = test_type(); _o->test.type = _e; }
  { auto _e = test(); if (_e) _o->test.value = MyGame::Example::AnyUnion::UnPack(_e, test_type(), _resolver); }
  { auto _e = test4(); if (_e) { _o->test4.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test4[_i] = *_e->Get(_i); } } else { _o->test4.resize(0); } }
  { auto _e = testarrayofstring(); if (_e) { _o->testarrayofstring.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring[_i] = _e->Get(_i)->str(); } } else { _o->testarrayofstring.resize(0); } }
  { auto _e = testarrayoftables(); if (_e) { _o->testarrayoftables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->testarrayoftables[_i]) { _e->Get(_i)->UnPackTo(_o->testarrayoftables[_i].get(), _resolver); } else { _o->testarrayoftables[_i] = std::unique_ptr<MyGame::Example::MonsterT>(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->testarrayoftables.resize(0); } }
  { auto _e = enemy(); if (_e) { if(_o->enemy) { _e->UnPackTo(_o->enemy.get(), _resolver); } else { _o->enemy = std::unique_ptr<MyGame::Example::MonsterT>(_e->UnPack(_resolver)); } } else if (_o->enemy) { _o->enemy.reset(); } }
  { auto _e = testnestedflatbuffer(); if (_e) { _o->testnestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testnestedflatbuffer.begin()); } }
  { auto _e = testempty(); if (_e) { if(_o->testempty) { _e->UnPackTo(_o->testempty.get(), _resolver); } else { _o->testempty = std::unique_ptr<MyGame::Example::StatT>(_e->UnPack(_resolver)); } } else if (_o->testempty) { _o->testempty.reset(); } }
  { auto _e = testbool(); _o->testbool = _e; }
  { auto _e = testhashs32_fnv1(); _o->testhashs32_fnv1 = _e; }
  { auto _e = testhashu32_fnv1(); _o->testhashu32_fnv1 = _e; }
  { auto _e = testhashs64_fnv1(); _o->testhashs64_fnv1 = _e; }
  { auto _e = testhashu64_fnv1(); _o->testhashu64_fnv1 = _e; }
  { auto _e = testhashs32_fnv1a(); _o->testhashs32_fnv1a = _e; }
  { auto _e = testhashu32_fnv1a(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->testhashu32_fnv1a), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->testhashu32_fnv1a = nullptr; }
  { auto _e = testhashs64_fnv1a(); _o->testhashs64_fnv1a = _e; }
  { auto _e = testhashu64_fnv1a(); _o->testhashu64_fnv1a = _e; }
  { auto _e = testarrayofbools(); if (_e) { _o->testarrayofbools.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofbools[_i] = _e->Get(_i) != 0; } } else { _o->testarrayofbools.resize(0); } }
  { auto _e = testf(); _o->testf = _e; }
  { auto _e = testf2(); _o->testf2 = _e; }
  { auto _e = testf3(); _o->testf3 = _e; }
  { auto _e = testarrayofstring2(); if (_e) { _o->testarrayofstring2.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring2[_i] = _e->Get(_i)->str(); } } else { _o->testarrayofstring2.resize(0); } }
  { auto _e = testarrayofsortedstruct(); if (_e) { _o->testarrayofsortedstruct.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofsortedstruct[_i] = *_e->Get(_i); } } else { _o->testarrayofsortedstruct.resize(0); } }
  { auto _e = flex(); if (_e) { _o->flex.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->flex.begin()); } }
  { auto _e = test5(); if (_e) { _o->test5.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test5[_i] = *_e->Get(_i); } } else { _o->test5.resize(0); } }
  { auto _e = vector_of_longs(); if (_e) { _o->vector_of_longs.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_longs[_i] = _e->Get(_i); } } else { _o->vector_of_longs.resize(0); } }
  { auto _e = vector_of_doubles(); if (_e) { _o->vector_of_doubles.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_doubles[_i] = _e->Get(_i); } } else { _o->vector_of_doubles.resize(0); } }
  { auto _e = parent_namespace_test(); if (_e) { if(_o->parent_namespace_test) { _e->UnPackTo(_o->parent_namespace_test.get(), _resolver); } else { _o->parent_namespace_test = std::unique_ptr<MyGame::InParentNamespaceT>(_e->UnPack(_resolver)); } } else if (_o->parent_namespace_test) { _o->parent_namespace_test.reset(); } }
  { auto _e = vector_of_referrables(); if (_e) { _o->vector_of_referrables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->vector_of_referrables[_i]) { _e->Get(_i)->UnPackTo(_o->vector_of_referrables[_i].get(), _resolver); } else { _o->vector_of_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->vector_of_referrables.resize(0); } }
  { auto _e = single_weak_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->single_weak_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->single_weak_reference = nullptr; }
  { auto _e = vector_of_weak_references(); if (_e) { _o->vector_of_weak_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_weak_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_weak_references[_i] = nullptr; } } else { _o->vector_of_weak_references.resize(0); } }
  { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->vector_of_strong_referrables[_i]) { _e->Get(_i)->UnPackTo(_o->vector_of_strong_referrables[_i].get(), _resolver); } else { _o->vector_of_strong_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->vector_of_strong_referrables.resize(0); } }
  { auto _e = co_owning_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->co_owning_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->co_owning_reference = nullptr; }
  { auto _e = vector_of_co_owning_references(); if (_e) { _o->vector_of_co_owning_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, default_ptr_type*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_co_owning_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i)));/* else do nothing */; } } else { _o->vector_of_co_owning_references.resize(0); } }
  { auto _e = non_owning_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->non_owning_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->non_owning_reference = nullptr; }
  { auto _e = vector_of_non_owning_references(); if (_e) { _o->vector_of_non_owning_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_non_owning_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_non_owning_references[_i] = nullptr; } } else { _o->vector_of_non_owning_references.resize(0); } }
  { auto _e = any_unique_type(); _o->any_unique.type = _e; }
  { auto _e = any_unique(); if (_e) _o->any_unique.value = MyGame::Example::AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); }
  { auto _e = any_ambiguous_type(); _o->any_ambiguous.type = _e; }
  { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = MyGame::Example::AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); }
  { auto _e = vector_of_enums(); if (_e) { _o->vector_of_enums.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_enums[_i] = static_cast<MyGame::Example::Color>(_e->Get(_i)); } } else { _o->vector_of_enums.resize(0); } }
  { auto _e = signed_enum(); _o->signed_enum = _e; }
  { auto _e = testrequirednestedflatbuffer(); if (_e) { _o->testrequirednestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testrequirednestedflatbuffer.begin()); } }
  { auto _e = scalar_key_sorted_tables(); if (_e) { _o->scalar_key_sorted_tables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->scalar_key_sorted_tables[_i]) { _e->Get(_i)->UnPackTo(_o->scalar_key_sorted_tables[_i].get(), _resolver); } else { _o->scalar_key_sorted_tables[_i] = std::unique_ptr<MyGame::Example::StatT>(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->scalar_key_sorted_tables.resize(0); } }
  { auto _e = native_inline(); if (_e) _o->native_inline = *_e; }
  { auto _e = long_enum_non_enum_default(); _o->long_enum_non_enum_default = _e; }
  { auto _e = long_enum_normal_default(); _o->long_enum_normal_default = _e; }
  { auto _e = nan_default(); _o->nan_default = _e; }
  { auto _e = inf_default(); _o->inf_default = _e; }
  { auto _e = positive_inf_default(); _o->positive_inf_default = _e; }
  { auto _e = infinity_default(); _o->infinity_default = _e; }
  { auto _e = positive_infinity_default(); _o->positive_infinity_default = _e; }
  { auto _e = negative_inf_default(); _o->negative_inf_default = _e; }
  { auto _e = negative_infinity_default(); _o->negative_infinity_default = _e; }
  { auto _e = double_inf_default(); _o->double_inf_default = _e; }
}

inline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  return CreateMonster(_fbb, _o, _rehasher);
}

inline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _pos = _o->pos ? _o->pos.get() : nullptr;
  auto _mana = _o->mana;
  auto _hp = _o->hp;
  auto _name = _fbb.CreateString(_o->name);
  auto _inventory = _o->inventory.size() ? _fbb.CreateVector(_o->inventory) : 0;
  auto _color = _o->color;
  auto _test_type = _o->test.type;
  auto _test = _o->test.Pack(_fbb);
  auto _test4 = _o->test4.size() ? _fbb.CreateVectorOfStructs(_o->test4) : 0;
  auto _testarrayofstring = _o->testarrayofstring.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring) : 0;
  auto _testarrayoftables = _o->testarrayoftables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Monster>> (_o->testarrayoftables.size(), [](size_t i, _VectorArgs *__va) { return CreateMonster(*__va->__fbb, __va->__o->testarrayoftables[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _enemy = _o->enemy ? CreateMonster(_fbb, _o->enemy.get(), _rehasher) : 0;
  auto _testnestedflatbuffer = _o->testnestedflatbuffer.size() ? _fbb.CreateVector(_o->testnestedflatbuffer) : 0;
  auto _testempty = _o->testempty ? CreateStat(_fbb, _o->testempty.get(), _rehasher) : 0;
  auto _testbool = _o->testbool;
  auto _testhashs32_fnv1 = _o->testhashs32_fnv1;
  auto _testhashu32_fnv1 = _o->testhashu32_fnv1;
  auto _testhashs64_fnv1 = _o->testhashs64_fnv1;
  auto _testhashu64_fnv1 = _o->testhashu64_fnv1;
  auto _testhashs32_fnv1a = _o->testhashs32_fnv1a;
  auto _testhashu32_fnv1a = _rehasher ? static_cast<uint32_t>((*_rehasher)(_o->testhashu32_fnv1a)) : 0;
  auto _testhashs64_fnv1a = _o->testhashs64_fnv1a;
  auto _testhashu64_fnv1a = _o->testhashu64_fnv1a;
  auto _testarrayofbools = _o->testarrayofbools.size() ? _fbb.CreateVector(_o->testarrayofbools) : 0;
  auto _testf = _o->testf;
  auto _testf2 = _o->testf2;
  auto _testf3 = _o->testf3;
  auto _testarrayofstring2 = _o->testarrayofstring2.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring2) : 0;
  auto _testarrayofsortedstruct = _o->testarrayofsortedstruct.size() ? _fbb.CreateVectorOfStructs(_o->testarrayofsortedstruct) : 0;
  auto _flex = _o->flex.size() ? _fbb.CreateVector(_o->flex) : 0;
  auto _test5 = _o->test5.size() ? _fbb.CreateVectorOfStructs(_o->test5) : 0;
  auto _vector_of_longs = _o->vector_of_longs.size() ? _fbb.CreateVector(_o->vector_of_longs) : 0;
  auto _vector_of_doubles = _o->vector_of_doubles.size() ? _fbb.CreateVector(_o->vector_of_doubles) : 0;
  auto _parent_namespace_test = _o->parent_namespace_test ? CreateInParentNamespace(_fbb, _o->parent_namespace_test.get(), _rehasher) : 0;
  auto _vector_of_referrables = _o->vector_of_referrables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_referrables.size(), [](size_t i, _VectorArgs *__va) { return CreateReferrable(*__va->__fbb, __va->__o->vector_of_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _single_weak_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->single_weak_reference)) : 0;
  auto _vector_of_weak_references = _o->vector_of_weak_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_weak_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_weak_references[i])) : 0; }, &_va ) : 0;
  auto _vector_of_strong_referrables = _o->vector_of_strong_referrables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_strong_referrables.size(), [](size_t i, _VectorArgs *__va) { return CreateReferrable(*__va->__fbb, __va->__o->vector_of_strong_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _co_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->co_owning_reference)) : 0;
  auto _vector_of_co_owning_references = _o->vector_of_co_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_co_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_co_owning_references[i].get())) : 0; }, &_va ) : 0;
  auto _non_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->non_owning_reference)) : 0;
  auto _vector_of_non_owning_references = _o->vector_of_non_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_non_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_non_owning_references[i])) : 0; }, &_va ) : 0;
  auto _any_unique_type = _o->any_unique.type;
  auto _any_unique = _o->any_unique.Pack(_fbb);
  auto _any_ambiguous_type = _o->any_ambiguous.type;
  auto _any_ambiguous = _o->any_ambiguous.Pack(_fbb);
  auto _vector_of_enums = _o->vector_of_enums.size() ? _fbb.CreateVectorScalarCast<uint8_t>(::flatbuffers::data(_o->vector_of_enums), _o->vector_of_enums.size()) : 0;
  auto _signed_enum = _o->signed_enum;
  auto _testrequirednestedflatbuffer = _o->testrequirednestedflatbuffer.size() ? _fbb.CreateVector(_o->testrequirednestedflatbuffer) : 0;
  auto _scalar_key_sorted_tables = _o->scalar_key_sorted_tables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Stat>> (_o->scalar_key_sorted_tables.size(), [](size_t i, _VectorArgs *__va) { return CreateStat(*__va->__fbb, __va->__o->scalar_key_sorted_tables[i].get(), __va->__rehasher); }, &_va ) : 0;
  auto _native_inline = &_o->native_inline;
  auto _long_enum_non_enum_default = _o->long_enum_non_enum_default;
  auto _long_enum_normal_default = _o->long_enum_normal_default;
  auto _nan_default = _o->nan_default;
  auto _inf_default = _o->inf_default;
  auto _positive_inf_default = _o->positive_inf_default;
  auto _infinity_default = _o->infinity_default;
  auto _positive_infinity_default = _o->positive_infinity_default;
  auto _negative_inf_default = _o->negative_inf_default;
  auto _negative_infinity_default = _o->negative_infinity_default;
  auto _double_inf_default = _o->double_inf_default;
  return MyGame::Example::CreateMonster(
      _fbb,
      _pos,
      _mana,
      _hp,
      _name,
      _inventory,
      _color,
      _test_type,
      _test,
      _test4,
      _testarrayofstring,
      _testarrayoftables,
      _enemy,
      _testnestedflatbuffer,
      _testempty,
      _testbool,
      _testhashs32_fnv1,
      _testhashu32_fnv1,
      _testhashs64_fnv1,
      _testhashu64_fnv1,
      _testhashs32_fnv1a,
      _testhashu32_fnv1a,
      _testhashs64_fnv1a,
      _testhashu64_fnv1a,
      _testarrayofbools,
      _testf,
      _testf2,
      _testf3,
      _testarrayofstring2,
      _testarrayofsortedstruct,
      _flex,
      _test5,
      _vector_of_longs,
      _vector_of_doubles,
      _parent_namespace_test,
      _vector_of_referrables,
      _single_weak_reference,
      _vector_of_weak_references,
      _vector_of_strong_referrables,
      _co_owning_reference,
      _vector_of_co_owning_references,
      _non_owning_reference,
      _vector_of_non_owning_references,
      _any_unique_type,
      _any_unique,
      _any_ambiguous_type,
      _any_ambiguous,
      _vector_of_enums,
      _signed_enum,
      _testrequirednestedflatbuffer,
      _scalar_key_sorted_tables,
      _native_inline,
      _long_enum_non_enum_default,
      _long_enum_normal_default,
      _nan_default,
      _inf_default,
      _positive_inf_default,
      _infinity_default,
      _positive_infinity_default,
      _negative_inf_default,
      _negative_infinity_default,
      _double_inf_default);
}


inline bool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs) {
  return
      (lhs.i8 == rhs.i8) &&
      (lhs.u8 == rhs.u8) &&
      (lhs.i16 == rhs.i16) &&
      (lhs.u16 == rhs.u16) &&
      (lhs.i32 == rhs.i32) &&
      (lhs.u32 == rhs.u32) &&
      (lhs.i64 == rhs.i64) &&
      (lhs.u64 == rhs.u64) &&
      (lhs.f32 == rhs.f32) &&
      (lhs.f64 == rhs.f64) &&
      (lhs.v8 == rhs.v8) &&
      (lhs.vf64 == rhs.vf64);
}

inline bool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs) {
    return !(lhs == rhs);
}


inline TypeAliasesT *TypeAliases::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
  auto _o = std::unique_ptr<TypeAliasesT>(new TypeAliasesT());
  UnPackTo(_o.get(), _resolver);
  return _o.release();
}

inline void TypeAliases::UnPackTo(TypeAliasesT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = i8(); _o->i8 = _e; }
  { auto _e = u8(); _o->u8 = _e; }
  { auto _e = i16(); _o->i16 = _e; }
  { auto _e = u16(); _o->u16 = _e; }
  { auto _e = i32(); _o->i32 = _e; }
  { auto _e = u32(); _o->u32 = _e; }
  { auto _e = i64(); _o->i64 = _e; }
  { auto _e = u64(); _o->u64 = _e; }
  { auto _e = f32(); _o->f32 = _e; }
  { auto _e = f64(); _o->f64 = _e; }
  { auto _e = v8(); if (_e) { _o->v8.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->v8.begin()); } }
  { auto _e = vf64(); if (_e) { _o->vf64.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vf64[_i] = _e->Get(_i); } } else { _o->vf64.resize(0); } }
}

inline ::flatbuffers::Offset<TypeAliases> TypeAliases::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  return CreateTypeAliases(_fbb, _o, _rehasher);
}

inline ::flatbuffers::Offset<TypeAliases> CreateTypeAliases(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const TypeAliasesT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _i8 = _o->i8;
  auto _u8 = _o->u8;
  auto _i16 = _o->i16;
  auto _u16 = _o->u16;
  auto _i32 = _o->i32;
  auto _u32 = _o->u32;
  auto _i64 = _o->i64;
  auto _u64 = _o->u64;
  auto _f32 = _o->f32;
  auto _f64 = _o->f64;
  auto _v8 = _o->v8.size() ? _fbb.CreateVector(_o->v8) : 0;
  auto _vf64 = _o->vf64.size() ? _fbb.CreateVector(_o->vf64) : 0;
  return MyGame::Example::CreateTypeAliases(
      _fbb,
      _i8,
      _u8,
      _i16,
      _u16,
      _i32,
      _u32,
      _i64,
      _u64,
      _f32,
      _f64,
      _v8,
      _vf64);
}

inline bool VerifyAny(::flatbuffers::Verifier &verifier, const void *obj, Any type) {
  switch (type) {
    case Any_NONE: {
      return true;
    }
    case Any_Monster: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return verifier.VerifyTable(ptr);
    }
    case Any_TestSimpleTableWithEnum: {
      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);
      return verifier.VerifyTable(ptr);
    }
    case Any_MyGame_Example2_Monster: {
      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
      return verifier.VerifyTable(ptr);
    }
    default: return true;
  }
}

inline bool VerifyAnyVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {
  if (!values || !types) return !values && !types;
  if (values->size() != types->size()) return false;
  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
    if (!VerifyAny(
        verifier,  values->Get(i), types->GetEnum<Any>(i))) {
      return false;
    }
  }
  return true;
}

inline void *AnyUnion::UnPack(const void *obj, Any type, const ::flatbuffers::resolver_function_t *resolver) {
  (void)resolver;
  switch (type) {
    case Any_Monster: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return ptr->UnPack(resolver);
    }
    case Any_TestSimpleTableWithEnum: {
      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);
      return ptr->UnPack(resolver);
    }
    case Any_MyGame_Example2_Monster: {
      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
      return ptr->UnPack(resolver);
    }
    default: return nullptr;
  }
}

inline ::flatbuffers::Offset<void> AnyUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {
  (void)_rehasher;
  switch (type) {
    case Any_Monster: {
      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
      return CreateMonster(_fbb, ptr, _rehasher).Union();
    }
    case Any_TestSimpleTableWithEnum: {
      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);
      return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();
    }
    case Any_MyGame_Example2_Monster: {
      auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);
      return CreateMonster(_fbb, ptr, _rehasher).Union();
    }
    default: return 0;
  }
}

inline AnyUnion::AnyUnion(const AnyUnion &u) : type(u.type), value(nullptr) {
  switch (type) {
    case Any_Monster: {
      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));
      break;
    }
    case Any_TestSimpleTableWithEnum: {
      value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));
      break;
    }
    case Any_MyGame_Example2_Monster: {
      value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));
      break;
    }
    default:
      break;
  }
}

inline void AnyUnion::Reset() {
  switch (type) {
    case Any_Monster: {
      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
      delete ptr;
      break;
    }
    case Any_TestSimpleTableWithEnum: {
      auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);
      delete ptr;
      break;
    }
    case Any_MyGame_Example2_Monster: {
      auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);
      delete ptr;
      break;
    }
    default: break;
  }
  value = nullptr;
  type = Any_NONE;
}

inline bool VerifyAnyUniqueAliases(::flatbuffers::Verifier &verifier, const void *obj, AnyUniqueAliases type) {
  switch (type) {
    case AnyUniqueAliases_NONE: {
      return true;
    }
    case AnyUniqueAliases_M: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return verifier.VerifyTable(ptr);
    }
    case AnyUniqueAliases_TS: {
      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);
      return verifier.VerifyTable(ptr);
    }
    case AnyUniqueAliases_M2: {
      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
      return verifier.VerifyTable(ptr);
    }
    default: return true;
  }
}

inline bool VerifyAnyUniqueAliasesVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {
  if (!values || !types) return !values && !types;
  if (values->size() != types->size()) return false;
  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
    if (!VerifyAnyUniqueAliases(
        verifier,  values->Get(i), types->GetEnum<AnyUniqueAliases>(i))) {
      return false;
    }
  }
  return true;
}

inline void *AnyUniqueAliasesUnion::UnPack(const void *obj, AnyUniqueAliases type, const ::flatbuffers::resolver_function_t *resolver) {
  (void)resolver;
  switch (type) {
    case AnyUniqueAliases_M: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return ptr->UnPack(resolver);
    }
    case AnyUniqueAliases_TS: {
      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);
      return ptr->UnPack(resolver);
    }
    case AnyUniqueAliases_M2: {
      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
      return ptr->UnPack(resolver);
    }
    default: return nullptr;
  }
}

inline ::flatbuffers::Offset<void> AnyUniqueAliasesUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {
  (void)_rehasher;
  switch (type) {
    case AnyUniqueAliases_M: {
      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
      return CreateMonster(_fbb, ptr, _rehasher).Union();
    }
    case AnyUniqueAliases_TS: {
      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);
      return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();
    }
    case AnyUniqueAliases_M2: {
      auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);
      return CreateMonster(_fbb, ptr, _rehasher).Union();
    }
    default: return 0;
  }
}

inline AnyUniqueAliasesUnion::AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &u) : type(u.type), value(nullptr) {
  switch (type) {
    case AnyUniqueAliases_M: {
      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));
      break;
    }
    case AnyUniqueAliases_TS: {
      value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));
      break;
    }
    case AnyUniqueAliases_M2: {
      value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));
      break;
    }
    default:
      break;
  }
}

inline void AnyUniqueAliasesUnion::Reset() {
  switch (type) {
    case AnyUniqueAliases_M: {
      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
      delete ptr;
      break;
    }
    case AnyUniqueAliases_TS: {
      auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);
      delete ptr;
      break;
    }
    case AnyUniqueAliases_M2: {
      auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);
      delete ptr;
      break;
    }
    default: break;
  }
  value = nullptr;
  type = AnyUniqueAliases_NONE;
}

inline bool VerifyAnyAmbiguousAliases(::flatbuffers::Verifier &verifier, const void *obj, AnyAmbiguousAliases type) {
  switch (type) {
    case AnyAmbiguousAliases_NONE: {
      return true;
    }
    case AnyAmbiguousAliases_M1: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return verifier.VerifyTable(ptr);
    }
    case AnyAmbiguousAliases_M2: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return verifier.VerifyTable(ptr);
    }
    case AnyAmbiguousAliases_M3: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return verifier.VerifyTable(ptr);
    }
    default: return true;
  }
}

inline bool VerifyAnyAmbiguousAliasesVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {
  if (!values || !types) return !values && !types;
  if (values->size() != types->size()) return false;
  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
    if (!VerifyAnyAmbiguousAliases(
        verifier,  values->Get(i), types->GetEnum<AnyAmbiguousAliases>(i))) {
      return false;
    }
  }
  return true;
}

inline void *AnyAmbiguousAliasesUnion::UnPack(const void *obj, AnyAmbiguousAliases type, const ::flatbuffers::resolver_function_t *resolver) {
  (void)resolver;
  switch (type) {
    case AnyAmbiguousAliases_M1: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return ptr->UnPack(resolver);
    }
    case AnyAmbiguousAliases_M2: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return ptr->UnPack(resolver);
    }
    case AnyAmbiguousAliases_M3: {
      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
      return ptr->UnPack(resolver);
    }
    default: return nullptr;
  }
}

inline ::flatbuffers::Offset<void> AnyAmbiguousAliasesUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {
  (void)_rehasher;
  switch (type) {
    case AnyAmbiguousAliases_M1: {
      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
      return CreateMonster(_fbb, ptr, _rehasher).Union();
    }
    case AnyAmbiguousAliases_M2: {
      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
      return CreateMonster(_fbb, ptr, _rehasher).Union();
    }
    case AnyAmbiguousAliases_M3: {
      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
      return CreateMonster(_fbb, ptr, _rehasher).Union();
    }
    default: return 0;
  }
}

inline AnyAmbiguousAliasesUnion::AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &u) : type(u.type), value(nullptr) {
  switch (type) {
    case AnyAmbiguousAliases_M1: {
      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));
      break;
    }
    case AnyAmbiguousAliases_M2: {
      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));
      break;
    }
    case AnyAmbiguousAliases_M3: {
      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));
      break;
    }
    default:
      break;
  }
}

inline void AnyAmbiguousAliasesUnion::Reset() {
  switch (type) {
    case AnyAmbiguousAliases_M1: {
      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
      delete ptr;
      break;
    }
    case AnyAmbiguousAliases_M2: {
      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
      delete ptr;
      break;
    }
    case AnyAmbiguousAliases_M3: {
      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
      delete ptr;
      break;
    }
    default: break;
  }
  value = nullptr;
  type = AnyAmbiguousAliases_NONE;
}

inline const ::flatbuffers::TypeTable *ColorTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_UCHAR, 0, 0 },
    { ::flatbuffers::ET_UCHAR, 0, 0 },
    { ::flatbuffers::ET_UCHAR, 0, 0 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::ColorTypeTable
  };
  static const int64_t values[] = { 1, 2, 8 };
  static const char * const names[] = {
    "Red",
    "Green",
    "Blue"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *RaceTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_CHAR, 0, 0 },
    { ::flatbuffers::ET_CHAR, 0, 0 },
    { ::flatbuffers::ET_CHAR, 0, 0 },
    { ::flatbuffers::ET_CHAR, 0, 0 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::RaceTypeTable
  };
  static const int64_t values[] = { -1, 0, 1, 2 };
  static const char * const names[] = {
    "None",
    "Human",
    "Dwarf",
    "Elf"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_ENUM, 4, type_codes, type_refs, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *LongEnumTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_ULONG, 0, 0 },
    { ::flatbuffers::ET_ULONG, 0, 0 },
    { ::flatbuffers::ET_ULONG, 0, 0 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::LongEnumTypeTable
  };
  static const int64_t values[] = { 2ULL, 4ULL, 1099511627776ULL };
  static const char * const names[] = {
    "LongOne",
    "LongTwo",
    "LongBig"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *AnyTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SEQUENCE, 0, -1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 0 },
    { ::flatbuffers::ET_SEQUENCE, 0, 1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 2 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::MonsterTypeTable,
    MyGame::Example::TestSimpleTableWithEnumTypeTable,
    MyGame::Example2::MonsterTypeTable
  };
  static const char * const names[] = {
    "NONE",
    "Monster",
    "TestSimpleTableWithEnum",
    "MyGame_Example2_Monster"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *AnyUniqueAliasesTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SEQUENCE, 0, -1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 0 },
    { ::flatbuffers::ET_SEQUENCE, 0, 1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 2 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::MonsterTypeTable,
    MyGame::Example::TestSimpleTableWithEnumTypeTable,
    MyGame::Example2::MonsterTypeTable
  };
  static const char * const names[] = {
    "NONE",
    "M",
    "TS",
    "M2"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SEQUENCE, 0, -1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 0 },
    { ::flatbuffers::ET_SEQUENCE, 0, 0 },
    { ::flatbuffers::ET_SEQUENCE, 0, 0 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::MonsterTypeTable
  };
  static const char * const names[] = {
    "NONE",
    "M1",
    "M2",
    "M3"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
  };
  return &tt;
}

}  // namespace Example

inline const ::flatbuffers::TypeTable *InParentNamespaceTypeTable() {
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr
  };
  return &tt;
}

namespace Example2 {

inline const ::flatbuffers::TypeTable *MonsterTypeTable() {
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr
  };
  return &tt;
}

}  // namespace Example2

namespace Example {

inline const ::flatbuffers::TypeTable *TestTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SHORT, 0, -1 },
    { ::flatbuffers::ET_CHAR, 0, -1 }
  };
  static const int64_t values[] = { 0, 2, 4 };
  static const char * const names[] = {
    "a",
    "b"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_UCHAR, 0, 0 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::ColorTypeTable
  };
  static const char * const names[] = {
    "color"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *Vec3TypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_DOUBLE, 0, -1 },
    { ::flatbuffers::ET_UCHAR, 0, 0 },
    { ::flatbuffers::ET_SEQUENCE, 0, 1 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::ColorTypeTable,
    MyGame::Example::TestTypeTable
  };
  static const int64_t values[] = { 0, 4, 8, 16, 24, 26, 32 };
  static const char * const names[] = {
    "x",
    "y",
    "z",
    "test1",
    "test2",
    "test3"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_STRUCT, 6, type_codes, type_refs, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *AbilityTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_UINT, 0, -1 },
    { ::flatbuffers::ET_UINT, 0, -1 }
  };
  static const int64_t values[] = { 0, 4, 8 };
  static const char * const names[] = {
    "id",
    "distance"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *StructOfStructsTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SEQUENCE, 0, 0 },
    { ::flatbuffers::ET_SEQUENCE, 0, 1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 0 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::AbilityTypeTable,
    MyGame::Example::TestTypeTable
  };
  static const int64_t values[] = { 0, 8, 12, 20 };
  static const char * const names[] = {
    "a",
    "b",
    "c"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_STRUCT, 3, type_codes, type_refs, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *StructOfStructsOfStructsTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SEQUENCE, 0, 0 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::StructOfStructsTypeTable
  };
  static const int64_t values[] = { 0, 20 };
  static const char * const names[] = {
    "a"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_STRUCT, 1, type_codes, type_refs, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *StatTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_STRING, 0, -1 },
    { ::flatbuffers::ET_LONG, 0, -1 },
    { ::flatbuffers::ET_USHORT, 0, -1 }
  };
  static const char * const names[] = {
    "id",
    "val",
    "count"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *ReferrableTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_ULONG, 0, -1 }
  };
  static const char * const names[] = {
    "id"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *MonsterTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SEQUENCE, 0, 0 },
    { ::flatbuffers::ET_SHORT, 0, -1 },
    { ::flatbuffers::ET_SHORT, 0, -1 },
    { ::flatbuffers::ET_STRING, 0, -1 },
    { ::flatbuffers::ET_BOOL, 0, -1 },
    { ::flatbuffers::ET_UCHAR, 1, -1 },
    { ::flatbuffers::ET_UCHAR, 0, 1 },
    { ::flatbuffers::ET_UTYPE, 0, 2 },
    { ::flatbuffers::ET_SEQUENCE, 0, 2 },
    { ::flatbuffers::ET_SEQUENCE, 1, 3 },
    { ::flatbuffers::ET_STRING, 1, -1 },
    { ::flatbuffers::ET_SEQUENCE, 1, 4 },
    { ::flatbuffers::ET_SEQUENCE, 0, 4 },
    { ::flatbuffers::ET_UCHAR, 1, -1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 5 },
    { ::flatbuffers::ET_BOOL, 0, -1 },
    { ::flatbuffers::ET_INT, 0, -1 },
    { ::flatbuffers::ET_UINT, 0, -1 },
    { ::flatbuffers::ET_LONG, 0, -1 },
    { ::flatbuffers::ET_ULONG, 0, -1 },
    { ::flatbuffers::ET_INT, 0, -1 },
    { ::flatbuffers::ET_UINT, 0, -1 },
    { ::flatbuffers::ET_LONG, 0, -1 },
    { ::flatbuffers::ET_ULONG, 0, -1 },
    { ::flatbuffers::ET_BOOL, 1, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_STRING, 1, -1 },
    { ::flatbuffers::ET_SEQUENCE, 1, 6 },
    { ::flatbuffers::ET_UCHAR, 1, -1 },
    { ::flatbuffers::ET_SEQUENCE, 1, 3 },
    { ::flatbuffers::ET_LONG, 1, -1 },
    { ::flatbuffers::ET_DOUBLE, 1, -1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 7 },
    { ::flatbuffers::ET_SEQUENCE, 1, 8 },
    { ::flatbuffers::ET_ULONG, 0, -1 },
    { ::flatbuffers::ET_ULONG, 1, -1 },
    { ::flatbuffers::ET_SEQUENCE, 1, 8 },
    { ::flatbuffers::ET_ULONG, 0, -1 },
    { ::flatbuffers::ET_ULONG, 1, -1 },
    { ::flatbuffers::ET_ULONG, 0, -1 },
    { ::flatbuffers::ET_ULONG, 1, -1 },
    { ::flatbuffers::ET_UTYPE, 0, 9 },
    { ::flatbuffers::ET_SEQUENCE, 0, 9 },
    { ::flatbuffers::ET_UTYPE, 0, 10 },
    { ::flatbuffers::ET_SEQUENCE, 0, 10 },
    { ::flatbuffers::ET_UCHAR, 1, 1 },
    { ::flatbuffers::ET_CHAR, 0, 11 },
    { ::flatbuffers::ET_UCHAR, 1, -1 },
    { ::flatbuffers::ET_SEQUENCE, 1, 5 },
    { ::flatbuffers::ET_SEQUENCE, 0, 3 },
    { ::flatbuffers::ET_ULONG, 0, 12 },
    { ::flatbuffers::ET_ULONG, 0, 12 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_DOUBLE, 0, -1 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    MyGame::Example::Vec3TypeTable,
    MyGame::Example::ColorTypeTable,
    MyGame::Example::AnyTypeTable,
    MyGame::Example::TestTypeTable,
    MyGame::Example::MonsterTypeTable,
    MyGame::Example::StatTypeTable,
    MyGame::Example::AbilityTypeTable,
    MyGame::InParentNamespaceTypeTable,
    MyGame::Example::ReferrableTypeTable,
    MyGame::Example::AnyUniqueAliasesTypeTable,
    MyGame::Example::AnyAmbiguousAliasesTypeTable,
    MyGame::Example::RaceTypeTable,
    MyGame::Example::LongEnumTypeTable
  };
  static const char * const names[] = {
    "pos",
    "mana",
    "hp",
    "name",
    "friendly",
    "inventory",
    "color",
    "test_type",
    "test",
    "test4",
    "testarrayofstring",
    "testarrayoftables",
    "enemy",
    "testnestedflatbuffer",
    "testempty",
    "testbool",
    "testhashs32_fnv1",
    "testhashu32_fnv1",
    "testhashs64_fnv1",
    "testhashu64_fnv1",
    "testhashs32_fnv1a",
    "testhashu32_fnv1a",
    "testhashs64_fnv1a",
    "testhashu64_fnv1a",
    "testarrayofbools",
    "testf",
    "testf2",
    "testf3",
    "testarrayofstring2",
    "testarrayofsortedstruct",
    "flex",
    "test5",
    "vector_of_longs",
    "vector_of_doubles",
    "parent_namespace_test",
    "vector_of_referrables",
    "single_weak_reference",
    "vector_of_weak_references",
    "vector_of_strong_referrables",
    "co_owning_reference",
    "vector_of_co_owning_references",
    "non_owning_reference",
    "vector_of_non_owning_references",
    "any_unique_type",
    "any_unique",
    "any_ambiguous_type",
    "any_ambiguous",
    "vector_of_enums",
    "signed_enum",
    "testrequirednestedflatbuffer",
    "scalar_key_sorted_tables",
    "native_inline",
    "long_enum_non_enum_default",
    "long_enum_normal_default",
    "nan_default",
    "inf_default",
    "positive_inf_default",
    "infinity_default",
    "positive_infinity_default",
    "negative_inf_default",
    "negative_infinity_default",
    "double_inf_default"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_TABLE, 62, type_codes, type_refs, nullptr, nullptr, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *TypeAliasesTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_CHAR, 0, -1 },
    { ::flatbuffers::ET_UCHAR, 0, -1 },
    { ::flatbuffers::ET_SHORT, 0, -1 },
    { ::flatbuffers::ET_USHORT, 0, -1 },
    { ::flatbuffers::ET_INT, 0, -1 },
    { ::flatbuffers::ET_UINT, 0, -1 },
    { ::flatbuffers::ET_LONG, 0, -1 },
    { ::flatbuffers::ET_ULONG, 0, -1 },
    { ::flatbuffers::ET_FLOAT, 0, -1 },
    { ::flatbuffers::ET_DOUBLE, 0, -1 },
    { ::flatbuffers::ET_CHAR, 1, -1 },
    { ::flatbuffers::ET_DOUBLE, 1, -1 }
  };
  static const char * const names[] = {
    "i8",
    "u8",
    "i16",
    "u16",
    "i32",
    "u32",
    "i64",
    "u64",
    "f32",
    "f64",
    "v8",
    "vf64"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, nullptr, names
  };
  return &tt;
}

inline const MyGame::Example::Monster *GetMonster(const void *buf) {
  return ::flatbuffers::GetRoot<MyGame::Example::Monster>(buf);
}

inline const MyGame::Example::Monster *GetSizePrefixedMonster(const void *buf) {
  return ::flatbuffers::GetSizePrefixedRoot<MyGame::Example::Monster>(buf);
}

inline Monster *GetMutableMonster(void *buf) {
  return ::flatbuffers::GetMutableRoot<Monster>(buf);
}

inline MyGame::Example::Monster *GetMutableSizePrefixedMonster(void *buf) {
  return ::flatbuffers::GetMutableSizePrefixedRoot<MyGame::Example::Monster>(buf);
}

inline const char *MonsterIdentifier() {
  return "MONS";
}

inline bool MonsterBufferHasIdentifier(const void *buf) {
  return ::flatbuffers::BufferHasIdentifier(
      buf, MonsterIdentifier());
}

inline bool SizePrefixedMonsterBufferHasIdentifier(const void *buf) {
  return ::flatbuffers::BufferHasIdentifier(
      buf, MonsterIdentifier(), true);
}

inline bool VerifyMonsterBuffer(
    ::flatbuffers::Verifier &verifier) {
  return verifier.VerifyBuffer<MyGame::Example::Monster>(MonsterIdentifier());
}

inline bool VerifySizePrefixedMonsterBuffer(
    ::flatbuffers::Verifier &verifier) {
  return verifier.VerifySizePrefixedBuffer<MyGame::Example::Monster>(MonsterIdentifier());
}

inline const char *MonsterExtension() {
  return "mon";
}

inline void FinishMonsterBuffer(
    ::flatbuffers::FlatBufferBuilder &fbb,
    ::flatbuffers::Offset<MyGame::Example::Monster> root) {
  fbb.Finish(root, MonsterIdentifier());
}

inline void FinishSizePrefixedMonsterBuffer(
    ::flatbuffers::FlatBufferBuilder &fbb,
    ::flatbuffers::Offset<MyGame::Example::Monster> root) {
  fbb.FinishSizePrefixed(root, MonsterIdentifier());
}

inline std::unique_ptr<MyGame::Example::MonsterT> UnPackMonster(
    const void *buf,
    const ::flatbuffers::resolver_function_t *res = nullptr) {
  return std::unique_ptr<MyGame::Example::MonsterT>(GetMonster(buf)->UnPack(res));
}

inline std::unique_ptr<MyGame::Example::MonsterT> UnPackSizePrefixedMonster(
    const void *buf,
    const ::flatbuffers::resolver_function_t *res = nullptr) {
  return std::unique_ptr<MyGame::Example::MonsterT>(GetSizePrefixedMonster(buf)->UnPack(res));
}

}  // namespace Example
}  // namespace MyGame

#endif  // FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_
