#pragma once #include "Node.hpp" class Directory : public Node { typedef std::map> DirectoryTree; public: Directory(); Directory(const Directory& node); ~Directory() override; NodeType getType() const override { return DIRECTORY; } [[nodiscard]] std::shared_ptr clone() const override; bool detachNode(const Key& key) override; bool attachNode(const Key &newKey, std::shared_ptr newNode) override; std::shared_ptr findNode(const std::vector& path, ui32 currentDepth = 0) override; std::shared_ptr findNode(const Key& path) override; [[nodiscard]] ui64 size() const override; void clearFlags(std::shared_ptr& directory) override; bool isHardNode() const override; void removeIncomingDynamicLinks() override; void removeOutgoingLinks() override; template static void traverse(std::shared_ptr& node, tFunctor functor) { functor(node); if (std::shared_ptr directory = std::dynamic_pointer_cast(node)) { for (auto& member : directory->mMembers) { traverse(member.second, functor); } } } private: void getMaxDepthUtil(ui32 depth, ui32& maxDepth) const; void dumpUtil(std::ostream& ss, const Key& key, ui32 currentDepth, std::vector& indents) override; public: DirectoryTree mMembers; };