#ifndef TESDATA_ASSOCIATEDENTRY_H #define TESDATA_ASSOCIATEDENTRY_H #include #include #include #include #include #include #include namespace cont = boost::container; namespace TESData { using TESFileHandle = int; struct AuxMember { std::string path; std::set alternatives; }; class AuxItem final { public: explicit AuxItem(const std::string& name, const AuxItem* parent = nullptr); [[nodiscard]] const std::string& name() const { return m_Name; } [[nodiscard]] const AuxItem* parent() const { return m_Parent; } [[nodiscard]] int numChildren() const { return static_cast(m_Children.size()); } [[nodiscard]] std::shared_ptr getByIndex(int index) const; [[nodiscard]] std::shared_ptr getByName(const std::string& name) const; [[nodiscard]] int indexOf(const AuxItem* item) const; std::shared_ptr insert(const std::string& name); [[nodiscard]] const auto& member() const { return m_Member; } std::shared_ptr createMember(const std::string& path); void setMember(std::shared_ptr item); private: std::string m_Name; const AuxItem* m_Parent; cont::flat_map> m_Children; std::shared_ptr m_Member; mutable std::shared_mutex m_Mutex; }; class AssociatedEntry final { public: explicit AssociatedEntry(const std::string& rootName = {}); [[nodiscard]] std::shared_ptr root() { return m_Root; } [[nodiscard]] std::shared_ptr root() const { return m_Root; } void forEachMember( std::function&)> func) const; private: std::shared_ptr m_Root; }; } // namespace TESData #endif // TESDATA_ASSOCIATEDENTRY_H