//===-- Graph.h - XRay Graph Class ------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // A Graph Datatype for XRay. // //===----------------------------------------------------------------------===// #ifndef LLVM_XRAY_GRAPH_H #define LLVM_XRAY_GRAPH_H #include <initializer_list> #include <stdint.h> #include <type_traits> #include <utility> #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/iterator.h" #include "llvm/Support/Error.h" namespace llvm { namespace xray { /// A Graph object represents a Directed Graph and is used in XRay to compute /// and store function call graphs and associated statistical information. /// /// The graph takes in four template parameters, these are: /// - VertexAttribute, this is a structure which is stored for each vertex. /// Must be DefaultConstructible, CopyConstructible, CopyAssignable and /// Destructible. /// - EdgeAttribute, this is a structure which is stored for each edge /// Must be DefaultConstructible, CopyConstructible, CopyAssignable and /// Destructible. /// - EdgeAttribute, this is a structure which is stored for each variable /// - VI, this is a type over which DenseMapInfo is defined and is the type /// used look up strings, available as VertexIdentifier. /// - If the built in DenseMapInfo is not defined, provide a specialization /// class type here. /// /// Graph is CopyConstructible, CopyAssignable, MoveConstructible and /// MoveAssignable but is not EqualityComparible or LessThanComparible. /// /// Usage Example Graph with weighted edges and vertices: /// Graph<int, int, int> G; /// /// G[1] = 0; /// G[2] = 2; /// G[{1,2}] = 1; /// G[{2,1}] = -1; /// for(const auto &v : G.vertices()){ /// // Do something with the vertices in the graph; /// } /// for(const auto &e : G.edges()){ /// // Do something with the edges in the graph; /// } /// /// Usage Example with StrRef keys. /// Graph<int, double, StrRef> StrG; /// char va[] = "Vertex A"; /// char vaa[] = "Vertex A"; /// char vb[] = "Vertex B"; // Vertices are referenced by String Refs. /// G[va] = 0; /// G[vb] = 1; /// G[{va, vb}] = 1.0; /// cout() << G[vaa] << " " << G[{vaa, vb}]; //prints "0 1.0". /// template <typename VertexAttribute, typename EdgeAttribute, typename VI = int32_t> class Graph { … }; } } #endif