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


#ifndef FLATBUFFERS_GENERATED_ASSETA_BIGFOOT_FLAT_H_
#define FLATBUFFERS_GENERATED_ASSETA_BIGFOOT_FLAT_H_

#include "flatbuffers/flatbuffers.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 == 25 &&
              FLATBUFFERS_VERSION_MINOR == 12 &&
              FLATBUFFERS_VERSION_REVISION == 19,
             "Non-compatible flatbuffers version included");

#include "Engine/BigFile/Asset/AssetTypeID.hpp"
#include "Engine/BigFile/Asset/AssetTypeID.hpp"
#include "System/UUID/UUID.hpp"
#include "Engine/BigFile/Asset/AssetHeader_generated.hpp"

#include "EASTL/unique_ptr.h"
#include "EASTL/string.h"

namespace Bigfoot {
namespace Flat {

struct Ref;

struct AssetA;
struct AssetABuilder;
struct AssetAT;

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

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

FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) Ref FLATBUFFERS_FINAL_CLASS {
 private:
  Bigfoot::Flat::UUID uuid_;

 public:
  struct Traits;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return RefTypeTable();
  }
  static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() {
    return "Bigfoot.Flat.Ref";
  }
  Ref()
      : uuid_() {
  }
  Ref(const Bigfoot::Flat::UUID &_uuid)
      : uuid_(_uuid) {
  }
  const Bigfoot::Flat::UUID &uuid() const {
    return uuid_;
  }
};
FLATBUFFERS_STRUCT_END(Ref, 16);

struct Ref::Traits {
  using type = Ref;
};

struct AssetAT : public ::flatbuffers::NativeTable {
  typedef AssetA TableType;
  static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() {
    return "Bigfoot.Flat.AssetAT";
  }
  eastl::unique_ptr<Bigfoot::Flat::AssetHeaderT> asset_header{};
  uint32_t health = 0;
  uint32_t mana = 0;
  std::vector<Bigfoot::Flat::Ref> refs{};
  eastl::unique_ptr<Bigfoot::Flat::Ref> ref{};
  AssetAT() = default;
  AssetAT(const AssetAT &o);
  AssetAT(AssetAT&&) FLATBUFFERS_NOEXCEPT = default;
  AssetAT &operator=(AssetAT o) FLATBUFFERS_NOEXCEPT;
};

struct AssetA FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
  typedef AssetAT NativeTableType;
  typedef AssetABuilder Builder;
  struct Traits;
  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
    return AssetATypeTable();
  }
  static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() {
    return "Bigfoot.Flat.AssetA";
  }
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ASSET_HEADER = 4,
    VT_HEALTH = 6,
    VT_MANA = 8,
    VT_REFS = 10,
    VT_REF = 12
  };
  const Bigfoot::Flat::AssetHeader *asset_header() const {
    return GetPointer<const Bigfoot::Flat::AssetHeader *>(VT_ASSET_HEADER);
  }
  uint32_t health() const {
    return GetField<uint32_t>(VT_HEALTH, 0);
  }
  uint32_t mana() const {
    return GetField<uint32_t>(VT_MANA, 0);
  }
  const ::flatbuffers::Vector<const Bigfoot::Flat::Ref *> *refs() const {
    return GetPointer<const ::flatbuffers::Vector<const Bigfoot::Flat::Ref *> *>(VT_REFS);
  }
  const Bigfoot::Flat::Ref *ref() const {
    return GetStruct<const Bigfoot::Flat::Ref *>(VT_REF);
  }
  template <bool B = false>
  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_ASSET_HEADER) &&
           verifier.VerifyTable(asset_header()) &&
           VerifyField<uint32_t>(verifier, VT_HEALTH, 4) &&
           VerifyField<uint32_t>(verifier, VT_MANA, 4) &&
           VerifyOffset(verifier, VT_REFS) &&
           verifier.VerifyVector(refs()) &&
           VerifyField<Bigfoot::Flat::Ref>(verifier, VT_REF, 1) &&
           verifier.EndTable();
  }
  AssetAT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  void UnPackTo(AssetAT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
  static ::flatbuffers::Offset<AssetA> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const AssetAT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct AssetABuilder {
  typedef AssetA Table;
  ::flatbuffers::FlatBufferBuilder &fbb_;
  ::flatbuffers::uoffset_t start_;
  void add_asset_header(::flatbuffers::Offset<Bigfoot::Flat::AssetHeader> asset_header) {
    fbb_.AddOffset(AssetA::VT_ASSET_HEADER, asset_header);
  }
  void add_health(uint32_t health) {
    fbb_.AddElement<uint32_t>(AssetA::VT_HEALTH, health, 0);
  }
  void add_mana(uint32_t mana) {
    fbb_.AddElement<uint32_t>(AssetA::VT_MANA, mana, 0);
  }
  void add_refs(::flatbuffers::Offset<::flatbuffers::Vector<const Bigfoot::Flat::Ref *>> refs) {
    fbb_.AddOffset(AssetA::VT_REFS, refs);
  }
  void add_ref(const Bigfoot::Flat::Ref *ref) {
    fbb_.AddStruct(AssetA::VT_REF, ref);
  }
  explicit AssetABuilder(::flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  ::flatbuffers::Offset<AssetA> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = ::flatbuffers::Offset<AssetA>(end);
    return o;
  }
};

inline ::flatbuffers::Offset<AssetA> CreateAssetA(
    ::flatbuffers::FlatBufferBuilder &_fbb,
    ::flatbuffers::Offset<Bigfoot::Flat::AssetHeader> asset_header = 0,
    uint32_t health = 0,
    uint32_t mana = 0,
    ::flatbuffers::Offset<::flatbuffers::Vector<const Bigfoot::Flat::Ref *>> refs = 0,
    const Bigfoot::Flat::Ref *ref = nullptr) {
  AssetABuilder builder_(_fbb);
  builder_.add_ref(ref);
  builder_.add_refs(refs);
  builder_.add_mana(mana);
  builder_.add_health(health);
  builder_.add_asset_header(asset_header);
  return builder_.Finish();
}

struct AssetA::Traits {
  using type = AssetA;
  static auto constexpr Create = CreateAssetA;
};

::flatbuffers::Offset<AssetA> CreateAssetA(::flatbuffers::FlatBufferBuilder &_fbb, const AssetAT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);

inline AssetAT::AssetAT(const AssetAT &o)
      : asset_header((o.asset_header) ? new Bigfoot::Flat::AssetHeaderT(*o.asset_header) : nullptr),
        health(o.health),
        mana(o.mana),
        refs(o.refs),
        ref((o.ref) ? new Bigfoot::Flat::Ref(*o.ref) : nullptr) {
}

inline AssetAT &AssetAT::operator=(AssetAT o) FLATBUFFERS_NOEXCEPT {
  std::swap(asset_header, o.asset_header);
  std::swap(health, o.health);
  std::swap(mana, o.mana);
  std::swap(refs, o.refs);
  std::swap(ref, o.ref);
  return *this;
}

inline AssetAT *AssetA::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
  auto _o = std::make_unique<AssetAT>();
  UnPackTo(_o.get(), _resolver);
  return _o.release();
}

inline void AssetA::UnPackTo(AssetAT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
  (void)_o;
  (void)_resolver;
  { auto _e = asset_header(); if (_e) { if(_o->asset_header) { _e->UnPackTo(_o->asset_header.get(), _resolver); } else { _o->asset_header = eastl::unique_ptr<Bigfoot::Flat::AssetHeaderT>(_e->UnPack(_resolver)); } } else if (_o->asset_header) { _o->asset_header.reset(); } }
  { auto _e = health(); _o->health = _e; }
  { auto _e = mana(); _o->mana = _e; }
  { auto _e = refs(); if (_e) { _o->refs.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->refs[_i] = *_e->Get(_i); } } else { _o->refs.resize(0); } }
  { auto _e = ref(); if (_e) _o->ref = eastl::unique_ptr<Bigfoot::Flat::Ref>(new Bigfoot::Flat::Ref(*_e)); }
}

inline ::flatbuffers::Offset<AssetA> CreateAssetA(::flatbuffers::FlatBufferBuilder &_fbb, const AssetAT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  return AssetA::Pack(_fbb, _o, _rehasher);
}

inline ::flatbuffers::Offset<AssetA> AssetA::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const AssetAT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
  (void)_rehasher;
  (void)_o;
  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const AssetAT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
  auto _asset_header = _o->asset_header ? CreateAssetHeader(_fbb, _o->asset_header.get(), _rehasher) : 0;
  auto _health = _o->health;
  auto _mana = _o->mana;
  auto _refs = _fbb.CreateVectorOfStructs(_o->refs);
  auto _ref = _o->ref ? _o->ref.get() : nullptr;
  return Bigfoot::Flat::CreateAssetA(
      _fbb,
      _asset_header,
      _health,
      _mana,
      _refs,
      _ref);
}

inline const ::flatbuffers::TypeTable *RefTypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SEQUENCE, 0, 0 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    Bigfoot::Flat::UUIDTypeTable
  };
  static const int64_t values[] = { 0, 16 };
  static const char * const names[] = {
    "uuid"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_STRUCT, 1, type_codes, type_refs, nullptr, values, names
  };
  return &tt;
}

inline const ::flatbuffers::TypeTable *AssetATypeTable() {
  static const ::flatbuffers::TypeCode type_codes[] = {
    { ::flatbuffers::ET_SEQUENCE, 0, 0 },
    { ::flatbuffers::ET_UINT, 0, -1 },
    { ::flatbuffers::ET_UINT, 0, -1 },
    { ::flatbuffers::ET_SEQUENCE, 1, 1 },
    { ::flatbuffers::ET_SEQUENCE, 0, 1 }
  };
  static const ::flatbuffers::TypeFunction type_refs[] = {
    Bigfoot::Flat::AssetHeaderTypeTable,
    Bigfoot::Flat::RefTypeTable
  };
  static const char * const names[] = {
    "asset_header",
    "health",
    "mana",
    "refs",
    "ref"
  };
  static const ::flatbuffers::TypeTable tt = {
    ::flatbuffers::ST_TABLE, 5, type_codes, type_refs, nullptr, nullptr, names
  };
  return &tt;
}

inline const Bigfoot::Flat::AssetA *GetAssetA(const void *buf) {
  return ::flatbuffers::GetRoot<Bigfoot::Flat::AssetA>(buf);
}

inline const Bigfoot::Flat::AssetA *GetSizePrefixedAssetA(const void *buf) {
  return ::flatbuffers::GetSizePrefixedRoot<Bigfoot::Flat::AssetA>(buf);
}

template <bool B = false>
inline bool VerifyAssetABuffer(
    ::flatbuffers::VerifierTemplate<B> &verifier) {
  return verifier.template VerifyBuffer<Bigfoot::Flat::AssetA>(nullptr);
}

template <bool B = false>
inline bool VerifySizePrefixedAssetABuffer(
    ::flatbuffers::VerifierTemplate<B> &verifier) {
  return verifier.template VerifySizePrefixedBuffer<Bigfoot::Flat::AssetA>(nullptr);
}

inline const char *AssetAExtension() {
  return "bfbs";
}

inline void FinishAssetABuffer(
    ::flatbuffers::FlatBufferBuilder &fbb,
    ::flatbuffers::Offset<Bigfoot::Flat::AssetA> root) {
  fbb.Finish(root);
}

inline void FinishSizePrefixedAssetABuffer(
    ::flatbuffers::FlatBufferBuilder &fbb,
    ::flatbuffers::Offset<Bigfoot::Flat::AssetA> root) {
  fbb.FinishSizePrefixed(root);
}

inline eastl::unique_ptr<Bigfoot::Flat::AssetAT> UnPackAssetA(
    const void *buf,
    const ::flatbuffers::resolver_function_t *res = nullptr) {
  return eastl::unique_ptr<Bigfoot::Flat::AssetAT>(GetAssetA(buf)->UnPack(res));
}

inline eastl::unique_ptr<Bigfoot::Flat::AssetAT> UnPackSizePrefixedAssetA(
    const void *buf,
    const ::flatbuffers::resolver_function_t *res = nullptr) {
  return eastl::unique_ptr<Bigfoot::Flat::AssetAT>(GetSizePrefixedAssetA(buf)->UnPack(res));
}

}  // namespace Flat
}  // namespace Bigfoot

#endif  // FLATBUFFERS_GENERATED_ASSETA_BIGFOOT_FLAT_H_
