| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #pragma once |
| |
| #include <map> |
| #include <set> |
| #include <string> |
| #include <utility> |
| |
| #include "cmLinkItem.h" |
| |
| class cmGeneratorTarget; |
| |
| /** \class cmLinkItemGraphVisitor |
| * \brief Visits a graph of linked items. |
| * |
| * Allows to visit items and dependency links (direct and indirect) between |
| * those items. |
| * This abstract class takes care of the graph traversal, making sure that: |
| * - it terminates even in the presence of cycles; |
| * - it visits every object once (and only once); |
| * - it visits the objects in the same order every time. |
| * |
| * Children classes only have to implement OnItem() etc. to handle whatever |
| * logic they care about. |
| */ |
| class cmLinkItemGraphVisitor |
| { |
| public: |
| virtual ~cmLinkItemGraphVisitor() = default; |
| |
| virtual void VisitGraph(std::string const& name) = 0; |
| |
| void VisitItem(cmLinkItem const& item); |
| |
| protected: |
| enum class DependencyType |
| { |
| LinkInterface, |
| LinkPublic, |
| LinkPrivate, |
| Object, |
| Utility |
| }; |
| |
| virtual void OnItem(cmLinkItem const& item) = 0; |
| |
| virtual void OnDirectLink(cmLinkItem const& depender, |
| cmLinkItem const& dependee, DependencyType dt) = 0; |
| |
| virtual void OnIndirectLink(cmLinkItem const& depender, |
| cmLinkItem const& dependee) = 0; |
| |
| private: |
| std::set<std::string> VisitedItems; |
| |
| std::set<std::pair<std::string, std::string>> VisitedLinks; |
| |
| void VisitLinks(cmLinkItem const& item, cmLinkItem const& rootItem); |
| void VisitLinks(cmLinkItem const& item, cmLinkItem const& rootItem, |
| std::string const& config); |
| |
| using Dependency = std::pair<DependencyType, cmLinkItem>; |
| using DependencyMap = std::map<std::string, Dependency>; |
| |
| bool ItemVisited(cmLinkItem const& item); |
| bool LinkVisited(cmLinkItem const& depender, cmLinkItem const& dependee); |
| |
| static void GetDependencies(cmGeneratorTarget const& target, |
| std::string const& config, |
| DependencyMap& dependencies); |
| }; |