#ifndef HIERARCHY_CACHE_H #define HIERARCHY_CACHE_H #include #include #include #include #include "utility/types.h" class HierarchyCache { public: void clear(); void createConnection(Id edgeId, Id fromId, Id toId, bool sourceVisible, bool sourceImplicit, bool targetImplicit); void createInheritance(Id edgeId, Id fromId, Id toId); Id getLastVisibleParentNodeId(Id nodeId) const; size_t getIndexOfLastVisibleParentNode(Id nodeId) const; void addAllVisibleParentIdsForNodeId(Id nodeId, std::set* nodeIds, std::set* edgeIds) const; void addAllChildIdsForNodeId(Id nodeId, std::set* nodeIds, std::set* edgeIds) const; void addFirstChildIdsForNodeId(Id nodeId, std::vector* nodeIds, std::vector* edgeIds) const; size_t getFirstChildIdsCountForNodeId(Id nodeId) const; bool isChildOfVisibleNodeOrInvisible(Id nodeId) const; bool nodeHasChildren(Id nodeId) const; bool nodeIsVisible(Id nodeId) const; bool nodeIsImplicit(Id nodeId) const; std::vector>> getInheritanceEdgesForNodeId(Id nodeId, const std::set& nodeIds) 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 addBase(HierarchyNode* base, Id edgeId); void addChild(HierarchyNode* child); size_t getChildrenCount() const; size_t getNonImplicitChildrenCount() const; void addChildIds(std::vector* nodeIds, std::vector* edgeIds) const; void addNonImplicitChildIds(std::vector* nodeIds, std::vector* edgeIds) const; void addChildIdsRecursive(std::set* nodeIds, std::set* edgeIds) const; bool isVisible() const; void setIsVisible(bool isVisible); bool isImplicit() const; void setIsImplicit(bool isImplicit); void addInheritanceEdgesRecursive( Id startId, std::vector inheritanceEdgeIds, const std::set& nodeIds, std::vector>>* inheritanceEdges); private: const Id m_nodeId; Id m_edgeId; HierarchyNode* m_parent; std::vector m_bases; std::vector m_baseEdgeIds; std::vector m_children; bool m_isVisible; bool m_isImplicit; }; HierarchyNode* getNode(Id nodeId) const; HierarchyNode* createNode(Id nodeId); std::map> m_nodes; }; #endif // HIERARCHY_CACHE_H