#ifndef TESDATA_FILEENTRY_H #define TESDATA_FILEENTRY_H #include "Record.h" #include "RecordPath.h" #include "TESFile/Type.h" #include #include #include #include #include #include #include #include #include namespace cont = boost::container; namespace TESData { using TESFileHandle = int; class FileEntry final { public: struct TreeItem { using Key = std::variant; const TreeItem* parent{nullptr}; std::string name; TESFile::Type formType{}; std::optional group; std::shared_ptr record; cont::flat_map> children; }; FileEntry(TESFileHandle handle, const std::string& name); [[nodiscard]] TESFileHandle handle() const { return m_Handle; } [[nodiscard]] const std::string& name() const { return m_Name; } [[nodiscard]] TreeItem* dataRoot() const { return m_Root.get(); } [[nodiscard]] const std::vector& files() const { return m_Files; } void forEachRecord(std::function&)> func) const; std::shared_ptr createRecord(const RecordPath& path, const std::string& name, TESFile::Type formType); void addRecord(const RecordPath& path, const std::string& name, TESFile::Type formType, std::shared_ptr record); void addChildGroup(const RecordPath&); [[nodiscard]] std::shared_ptr findRecord(const RecordPath& path) const; [[nodiscard]] std::shared_ptr findItem(const RecordPath& path) const; private: std::shared_ptr createHierarchy(const RecordPath& path); TESFileHandle m_Handle; std::string m_Name; std::shared_ptr m_Root; std::vector m_Files; mutable std::shared_mutex m_Mutex; }; } // namespace TESData #endif // TESDATA_FILEENTRY_H