| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst 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); | |
| }; |