13#ifndef LLVM_XRAY_GRAPH_H
14#define LLVM_XRAY_GRAPH_H
16#include <initializer_list>
71template <
typename VertexAttribute,
typename EdgeAttribute,
72 typename VI = int32_t>
117 NeighborLookupT InNeighbors;
120 NeighborLookupT OutNeighbors;
126 template <
bool IsConst,
bool IsOut,
129 std::conditional_t<IsConst, const EdgeValueType, EdgeValueType>>
130 class NeighborEdgeIteratorT
132 NeighborEdgeIteratorT<IsConst, IsOut>, BaseIt,
133 typename std::iterator_traits<BaseIt>::iterator_category, T> {
134 using InternalEdgeMapT =
135 std::conditional_t<IsConst, const EdgeMapT, EdgeMapT>;
138 friend class NeighborEdgeIteratorT<
true, IsOut, BaseIt,
141 InternalEdgeMapT *MP;
145 template <
bool IsConstDest,
146 typename = std::enable_if_t<IsConstDest && !IsConst>>
147 operator NeighborEdgeIteratorT<IsConstDest, IsOut, BaseIt,
149 return NeighborEdgeIteratorT<IsConstDest, IsOut, BaseIt,
153 NeighborEdgeIteratorT() =
default;
154 NeighborEdgeIteratorT(BaseIt _I, InternalEdgeMapT *_MP,
157 NeighborEdgeIteratorT<IsConst, IsOut>, BaseIt,
158 typename std::iterator_traits<BaseIt>::iterator_category,
T>(_I),
163 return *(MP->find({*(this->
I),
SI}));
165 return *(MP->find({
SI, *(this->
I)}));
199 using iterator = NeighborEdgeIteratorT<isConst, isOut>;
201 using GraphT = std::conditional_t<isConst, const Graph, Graph>;
203 std::conditional_t<isConst, const EdgeMapT, EdgeMapT>;
208 const NeighborLookupT &NL;
212 auto It = NL.find(A);
215 return iterator(It->second.begin(), &M, A);
219 auto It = NL.find(A);
228 auto It = NL.find(A);
231 return iterator(It->second.end(), &M, A);
234 auto It = NL.find(A);
247 return I->second.size();
250 bool empty()
const {
return NL.count(A) == 0; };
253 : M(
G.Edges), A(A), NL(isOut ?
G.OutNeighbors :
G.InNeighbors) {}
275 std::conditional_t<isConst, ConstVertexIterator, VertexIterator>;
277 using GraphT = std::conditional_t<isConst, const Graph, Graph>;
290 bool empty()
const {
return G.Vertices.empty(); }
312 std::conditional_t<isConst, ConstEdgeIterator, EdgeIterator>;
314 using GraphT = std::conditional_t<isConst, const Graph, Graph>;
327 bool empty()
const {
return G.Edges.empty(); }
343 OutNeighbors.clear();
386 Vertices.try_emplace(
I.first);
387 Vertices.try_emplace(
I.second);
388 InNeighbors[
I.second].insert(
I.first);
389 OutNeighbors[
I.first].insert(
I.second);
395 auto It = Vertices.find(
I);
396 if (It == Vertices.end())
398 "Vertex Identifier Does Not Exist",
399 std::make_error_code(std::errc::invalid_argument));
404 auto It = Vertices.find(
I);
405 if (It == Vertices.end())
407 "Vertex Identifier Does Not Exist",
408 std::make_error_code(std::errc::invalid_argument));
414 auto It = Edges.find(
I);
415 if (It == Edges.end())
417 "Edge Identifier Does Not Exist",
418 std::make_error_code(std::errc::invalid_argument));
423 auto It = Edges.find(
I);
424 if (It == Edges.end())
426 "Edge Identifier Does Not Exist",
427 std::make_error_code(std::errc::invalid_argument));
434 return Vertices.count(
I);
443 std::pair<VertexIterator, bool>
444 insert(
const std::pair<VertexIdentifier, VertexAttribute> &Val) {
445 return Vertices.insert(Val);
448 std::pair<VertexIterator, bool>
449 insert(std::pair<VertexIdentifier, VertexAttribute> &&Val) {
450 return Vertices.insert(std::move(Val));
456 std::pair<EdgeIterator, bool>
457 insert(
const std::pair<EdgeIdentifier, EdgeAttribute> &Val) {
458 const auto &p = Edges.insert(Val);
460 const auto &EI = Val.first;
461 Vertices.FindAndConstruct(EI.first);
462 Vertices.FindAndConstruct(EI.second);
463 InNeighbors[EI.second].insert(EI.first);
464 OutNeighbors[EI.first].insert(EI.second);
473 std::pair<EdgeIterator, bool>
474 insert(std::pair<EdgeIdentifier, EdgeAttribute> &&Val) {
476 const auto &p = Edges.insert(std::move(Val));
478 Vertices.try_emplace(EI.first);
479 Vertices.try_emplace(EI.second);
480 InNeighbors[EI.second].insert(EI.first);
481 OutNeighbors[EI.first].insert(EI.second);
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Implements a dense probed hash-table based set.
Tagged union holding either a T or a Error.
DenseSetIterator< true > const_iterator
CRTP base class for adapting an iterator to a different type.
ReferenceT operator*() const
A class for ranging over all the edges in the graph.
const_iterator cend() const
const_iterator end() const
ConstEdgeIterator const_iterator
std::conditional_t< isConst, const Graph, Graph > GraphT
const_iterator cbegin() const
std::conditional_t< isConst, ConstEdgeIterator, EdgeIterator > iterator
const_iterator begin() const
A class for ranging over the incoming edges incident to a vertex.
NeighborEdgeIteratorT< isConst, isOut > iterator
const_iterator end() const
const_iterator cbegin() const
std::conditional_t< isConst, const EdgeMapT, EdgeMapT > InternalEdgeMapT
std::conditional_t< isConst, const Graph, Graph > GraphT
const_iterator begin() const
NeighborEdgeIteratorT< true, isOut > const_iterator
const_iterator cend() const
InOutEdgeView(GraphT &G, VertexIdentifier A)
A class for ranging over the vertices in the graph.
std::conditional_t< isConst, ConstVertexIterator, VertexIterator > iterator
ConstVertexIterator const_iterator
const_iterator end() const
const_iterator begin() const
const_iterator cend() const
std::conditional_t< isConst, const Graph, Graph > GraphT
const_iterator cbegin() const
A Graph object represents a Directed Graph and is used in XRay to compute and store function call gra...
std::pair< EdgeIterator, bool > insert(std::pair< EdgeIdentifier, EdgeAttribute > &&Val)
Inserts an edge into the graph with Identifier Val.first, and Attribute Val.second.
std::pair< EdgeIterator, bool > insert(const std::pair< EdgeIdentifier, EdgeAttribute > &Val)
Inserts an edge into the graph with Identifier Val.first, and Attribute Val.second.
EdgeAttribute & operator[](const EdgeIdentifier &I)
Looks up the edge with identifier I, if it does not exist it default constructs it,...
std::pair< VertexIterator, bool > insert(std::pair< VertexIdentifier, VertexAttribute > &&Val)
VertexView< false > vertices()
Returns a view object allowing iteration over the vertices of the graph.
NeighborEdgeIteratorT< false, true > OutEdgeIterator
An iterator type for iterating through the set of edges leaving a vertex.
InOutEdgeView< true, true > outEdges(const VertexIdentifier I) const
size_type count(const EdgeIdentifier &I) const
Looks for an edge with Identifier I, returns 1 if one exists and 0 otherwise.
void clear()
Empty the Graph.
EdgeView< true > edges() const
size_type count(const VertexIdentifier &I) const
Looks for a vertex with identifier I, returns 1 if one exists, and 0 otherwise.
NeighborEdgeIteratorT< true, false > ConstInEdgeIterator
A const iterator type for iterating through the set of edges entering a vertex.
EdgeView< false > edges()
Returns a view object allowing iteration over the edges of the graph.
NeighborEdgeIteratorT< true, true > ConstOutEdgeIterator
A const iterator type for iterating through the set of edges entering a vertex.
NeighborEdgeIteratorT< false, false > InEdgeIterator
An iterator type for iterating through the set of edges leaving a vertex.
typename VertexMapT::iterator VertexIterator
An iterator type for iterating through the whole vertex set of the graph.
InOutEdgeView< false, false > inEdges(const VertexIdentifier I)
Returns a view object allowing iteration over the edges which point to a vertex I.
typename EdgeMapT::const_iterator ConstEdgeIterator
A const iterator for iterating through the entire edge set of the graph.
std::pair< VertexIterator, bool > insert(const std::pair< VertexIdentifier, VertexAttribute > &Val)
Inserts a vertex into the graph with Identifier Val.first, and Attribute Val.second.
detail::DenseMapPair< VertexIdentifier, VertexAttribute > VertexValueType
This type is the value_type of all iterators which range over vertices, Determined by the Vertices De...
Expected< const VertexAttribute & > at(const VertexIdentifier &I) const
VI VertexIdentifier
These objects are used to name edges and vertices in the graph.
Expected< VertexAttribute & > at(const VertexIdentifier &I)
Looks up a vertex with Identifier I, or an error if it does not exist.
VertexAttribute & operator[](const VertexIdentifier &I)
Looks up the vertex with identifier I, if it does not exist it default constructs it.
VertexView< true > vertices() const
InOutEdgeView< true, false > inEdges(const VertexIdentifier I) const
typename VertexMapT::const_iterator ConstVertexIterator
A const iterator type for iterating through the whole vertex set of the graph.
typename EdgeMapT::iterator EdgeIterator
An iterator for iterating through the entire edge set of the graph.
std::pair< VI, VI > EdgeIdentifier
detail::DenseMapPair< EdgeIdentifier, EdgeAttribute > EdgeValueType
This type is the value_type of all iterators which range over edges, Determined by the Edges DenseMap...
Expected< const EdgeAttribute & > at(const EdgeIdentifier &I) const
Expected< EdgeAttribute & > at(const EdgeIdentifier &I)
Looks up an edge with Identifier I, or an error if it does not exist.
InOutEdgeView< false, true > outEdges(const VertexIdentifier I)
Returns a view object allowing iteration over the edges which start at a vertex I.
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.