#ifndef TESDATA_RECORD_H #define TESDATA_RECORD_H #include "TESFile/Type.h" #include #include #include namespace TESData { using TESFileHandle = int; class Record final { public: using Identifier = std::variant; [[nodiscard]] TESFile::Type formType() const { return m_FormType; } [[nodiscard]] const std::string& file() const { return m_File; } [[nodiscard]] const Identifier& identifier() const { return m_Identifier; } [[nodiscard]] bool hasFormId() const { return std::holds_alternative(m_Identifier); } [[nodiscard]] bool hasEditorId() const { return std::holds_alternative(m_Identifier); } [[nodiscard]] bool hasTypeId() const { return std::holds_alternative(m_Identifier); } [[nodiscard]] std::uint32_t formId() const { return std::get(m_Identifier); } [[nodiscard]] const std::string& editorId() const { return std::get(m_Identifier); } [[nodiscard]] TESFile::Type typeId() const { return std::get(m_Identifier); } [[nodiscard]] const std::set& alternatives() const { return m_Alternatives; } [[nodiscard]] bool ignored() const { return m_Ignored; } void setIgnored(bool value) { m_Ignored = value; } void setIdentifier(const Identifier& identifier, std::span files) { m_Identifier = identifier; if (std::holds_alternative(m_Identifier)) { std::uint32_t& formId = std::get(m_Identifier); const std::uint8_t localIndex = formId >> 24U; formId &= ~0xFF000000U; m_File = files[localIndex]; } } void addAlternative(TESFileHandle origin) { m_Alternatives.insert(origin); } private: TESFile::Type m_FormType; std::string m_File; Identifier m_Identifier; std::set m_Alternatives; bool m_Ignored = false; }; } // namespace TESData #endif // TESDATA_RECORD_H