/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include #include #include #include #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 VisitedItems; std::set> 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; using DependencyMap = std::map; 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); };