/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #ifndef cmComputeComponentGraph_h #define cmComputeComponentGraph_h #include "cmConfigure.h" // IWYU pragma: keep #include "cmGraphAdjacencyList.h" #include #include /** \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 cmGraphEdgeList EdgeList; typedef cmGraphAdjacencyList Graph; cmComputeComponentGraph(Graph const& input); ~cmComputeComponentGraph(); /** Get the adjacency list of the component graph. */ Graph const& GetComponentGraph() const { return this->ComponentGraph; } EdgeList const& GetComponentGraphEdges(int c) const { return this->ComponentGraph[c]; } /** Get map from component index to original node indices. */ std::vector 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 const& GetComponentMap() const { return this->TarjanComponents; } private: void TransferEdges(); Graph const& InputGraph; Graph ComponentGraph; // Tarjan's algorithm. struct TarjanEntry { int Root; int VisitIndex; }; std::vector TarjanVisited; std::vector TarjanComponents; std::vector TarjanEntries; std::vector Components; std::stack TarjanStack; int TarjanWalkId; int TarjanIndex; void Tarjan(); void TarjanVisit(int i); // Connected components. }; #endif rce/CTest/cmCTestMemCheckCommand.cxx'>
blob: d0e2974524f1805e334b9bd667fc5c0d96f44f82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#include "cmCTestMemCheckCommand.h"

#include <cmext/string_view>

#include "cmCTest.h"
#include "cmCTestMemCheckHandler.h"
#include "cmMakefile.h"

void cmCTestMemCheckCommand::BindArguments()
{
  this->cmCTestTestCommand::BindArguments();
  this->Bind("DEFECT_COUNT"_s, this->DefectCount);
}

cmCTestGenericHandler* cmCTestMemCheckCommand::InitializeActualHandler()
{
  cmCTestMemCheckHandler* handler = this->CTest->GetMemCheckHandler();
  handler->Initialize();

  this->CTest->SetCTestConfigurationFromCMakeVariable(
    this->Makefile, "MemoryCheckType", "CTEST_MEMORYCHECK_TYPE", this->Quiet);
  this->CTest->SetCTestConfigurationFromCMakeVariable(
    this->Makefile, "MemoryCheckSanitizerOptions",
    "CTEST_MEMORYCHECK_SANITIZER_OPTIONS", this->Quiet);
  this->CTest->SetCTestConfigurationFromCMakeVariable(
    this->Makefile, "MemoryCheckCommand", "CTEST_MEMORYCHECK_COMMAND",
    this->Quiet);
  this->CTest->SetCTestConfigurationFromCMakeVariable(
    this->Makefile, "MemoryCheckCommandOptions",
    "CTEST_MEMORYCHECK_COMMAND_OPTIONS", this->Quiet);
  this->CTest->SetCTestConfigurationFromCMakeVariable(
    this->Makefile, "MemoryCheckSuppressionFile",
    "CTEST_MEMORYCHECK_SUPPRESSIONS_FILE", this->Quiet);

  handler->SetQuiet(this->Quiet);
  return handler;
}

void cmCTestMemCheckCommand::ProcessAdditionalValues(
  cmCTestGenericHandler* handler)
{
  if (!this->DefectCount.empty()) {
    this->Makefile->AddDefinition(
      this->DefectCount,
      std::to_string(
        static_cast<cmCTestMemCheckHandler*>(handler)->GetDefectCount()));
  }
}