#ifndef HIERARCHY_CACHE_H #define HIERARCHY_CACHE_H #include #include #include #include "utility/types.h" class HierarchyCache { public: void clear(); void createConnection(Id edgeId, Id fromId, Id toId, bool fromVisible); Id getLastVisibleParentNodeId(Id nodeId) const; void addAllChildIdsForNodeId(Id nodeId, std::vector* nodeIds, std::vector* edgeIds) const; void addFirstChildIdsForNodeId(Id nodeId, std::vector* nodeIds) const; void addFirstVisibleChildIdsForNodeId(Id nodeId, std::vector* nodeIds) const; bool isChildOfVisibleNodeOrInvisible(Id nodeId) const; private: class HierarchyNode { public: HierarchyNode(Id nodeId); Id getNodeId() const; Id getEdgeId() const; void setEdgeId(Id edgeId); HierarchyNode* getParent() const; void setParent(HierarchyNode* parent); void addChild(HierarchyNode* child); const std::vector& getChildren() const; void addChildIds(std::vector* nodeIds) const; void addChildIdsRecursive(std::vector* nodeIds, std::vector* edgeIds) const; void addVisibleNodeIdsRecursive(std::vector* nodeIds) const; bool isVisible() const; void setIsVisible(bool isVisible); private: const Id m_nodeId; Id m_edgeId; HierarchyNode* m_parent; std::vector m_children; bool m_isVisible; }; HierarchyNode* getNode(Id nodeId) const; HierarchyNode* createNode(Id nodeId); std::map> m_nodes; }; #endif // HIERARCHY_CACHE_H