mirror of
https://github.com/reactos/CMake.git
synced 2025-01-07 03:30:27 +00:00
96afb12087
This converts the CMake license to a pure 3-clause OSI-approved BSD License. We drop the previous license clause requiring modified versions to be plainly marked. We also update the CMake copyright to cover the full development time range.
83 lines
2.4 KiB
C++
83 lines
2.4 KiB
C++
/*============================================================================
|
|
CMake - Cross Platform Makefile Generator
|
|
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
|
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
see accompanying file Copyright.txt for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the License for more information.
|
|
============================================================================*/
|
|
#ifndef cmComputeComponentGraph_h
|
|
#define cmComputeComponentGraph_h
|
|
|
|
#include "cmStandardIncludes.h"
|
|
|
|
#include "cmGraphAdjacencyList.h"
|
|
|
|
#include <stack>
|
|
|
|
/** \class cmComputeComponentGraph
|
|
* \brief Analyze a graph to determine strongly connected components.
|
|
*
|
|
* Convert a directed graph into a directed acyclic graph whose nodes
|
|
* correspond to strongly connected components of the original graph.
|
|
*
|
|
* We use Tarjan's algorithm to enumerate the components efficiently.
|
|
* An advantage of this approach is that the components are identified
|
|
* in a topologically sorted order.
|
|
*/
|
|
class cmComputeComponentGraph
|
|
{
|
|
public:
|
|
// Represent the graph with an adjacency list.
|
|
typedef cmGraphNodeList NodeList;
|
|
typedef cmGraphAdjacencyList Graph;
|
|
|
|
cmComputeComponentGraph(Graph const& input);
|
|
~cmComputeComponentGraph();
|
|
|
|
/** Get the adjacency list of the component graph. */
|
|
Graph const& GetComponentGraph() const
|
|
{ return this->ComponentGraph; }
|
|
NodeList const& GetComponentGraphEdges(int c) const
|
|
{ return this->ComponentGraph[c]; }
|
|
|
|
/** Get map from component index to original node indices. */
|
|
std::vector<NodeList> const& GetComponents() const
|
|
{ return this->Components; }
|
|
NodeList const& GetComponent(int c) const
|
|
{ return this->Components[c]; }
|
|
|
|
/** Get map from original node index to component index. */
|
|
std::vector<int> const& GetComponentMap() const
|
|
{ return this->TarjanComponents; }
|
|
|
|
private:
|
|
void TransferEdges();
|
|
|
|
Graph const& InputGraph;
|
|
Graph ComponentGraph;
|
|
|
|
// Tarjan's algorithm.
|
|
struct TarjanEntry
|
|
{
|
|
int Root;
|
|
int VisitIndex;
|
|
};
|
|
int TarjanWalkId;
|
|
std::vector<int> TarjanVisited;
|
|
std::vector<int> TarjanComponents;
|
|
std::vector<TarjanEntry> TarjanEntries;
|
|
std::stack<int> TarjanStack;
|
|
int TarjanIndex;
|
|
void Tarjan();
|
|
void TarjanVisit(int i);
|
|
|
|
// Connected components.
|
|
std::vector<NodeList> Components;
|
|
};
|
|
|
|
#endif
|