13#ifndef LLVM_XRAY_GRAPH_H
14#define LLVM_XRAY_GRAPH_H
16#include <initializer_list>
72template <
typename VertexAttribute,
typename EdgeAttribute,
73 typename VI = int32_t>
127 template <
bool IsConst,
bool IsOut,
130 std::conditional_t<IsConst, const EdgeValueType, EdgeValueType>>
131 class NeighborEdgeIteratorT
133 NeighborEdgeIteratorT<IsConst, IsOut>, BaseIt,
134 typename std::iterator_traits<BaseIt>::iterator_category, T> {
135 using InternalEdgeMapT =
136 std::conditional_t<IsConst, const EdgeMapT, EdgeMapT>;
139 friend class NeighborEdgeIteratorT<
true, IsOut, BaseIt,
142 InternalEdgeMapT *MP;
146 template <
bool IsConstDest,
147 typename = std::enable_if_t<IsConstDest && !IsConst>>
148 operator NeighborEdgeIteratorT<IsConstDest, IsOut, BaseIt,
150 return NeighborEdgeIteratorT<IsConstDest, IsOut, BaseIt,
154 NeighborEdgeIteratorT() =
default;
155 NeighborEdgeIteratorT(BaseIt _I, InternalEdgeMapT *_MP,
158 NeighborEdgeIteratorT<IsConst, IsOut>, BaseIt,
159 typename std::iterator_traits<BaseIt>::iterator_category,
T>(_I),
164 return *(MP->find({*(this->
I), SI}));
166 return *(MP->find({
SI, *(this->
I)}));
200 using iterator = NeighborEdgeIteratorT<isConst, isOut>;
202 using GraphT = std::conditional_t<isConst, const Graph, Graph>;
204 std::conditional_t<isConst, const EdgeMapT, EdgeMapT>;
213 auto It =
NL.find(A);
216 return iterator(It->second.begin(), &M, A);
220 auto It =
NL.find(A);
229 auto It =
NL.find(A);
232 return iterator(It->second.end(), &M, A);
235 auto It =
NL.find(A);
248 return I->second.size();
251 bool empty()
const {
return NL.count(A) == 0; };
254 : M(
G.Edges), A(A),
NL(isOut ?
G.OutNeighbors :
G.InNeighbors) {}
276 std::conditional_t<isConst, ConstVertexIterator, VertexIterator>;
278 using GraphT = std::conditional_t<isConst, const Graph, Graph>;
291 bool empty()
const {
return G.Vertices.empty(); }
313 std::conditional_t<isConst, ConstEdgeIterator, EdgeIterator>;
315 using GraphT = std::conditional_t<isConst, const Graph, Graph>;
328 bool empty()
const {
return G.Edges.empty(); }
344 OutNeighbors.
clear();
392 InNeighbors[
I.second].
insert(
I.first);
393 OutNeighbors[
I.first].
insert(
I.second);
399 auto It = Vertices.
find(
I);
400 if (It == Vertices.
end())
401 return make_error<StringError>(
402 "Vertex Identifier Does Not Exist",
403 std::make_error_code(std::errc::invalid_argument));
408 auto It = Vertices.
find(
I);
409 if (It == Vertices.
end())
410 return make_error<StringError>(
411 "Vertex Identifier Does Not Exist",
412 std::make_error_code(std::errc::invalid_argument));
418 auto It = Edges.
find(
I);
419 if (It == Edges.
end())
420 return make_error<StringError>(
421 "Edge Identifier Does Not Exist",
422 std::make_error_code(std::errc::invalid_argument));
427 auto It = Edges.
find(
I);
428 if (It == Edges.
end())
429 return make_error<StringError>(
430 "Edge Identifier Does Not Exist",
431 std::make_error_code(std::errc::invalid_argument));
447 std::pair<VertexIterator, bool>
448 insert(
const std::pair<VertexIdentifier, VertexAttribute> &Val) {
449 return Vertices.
insert(Val);
452 std::pair<VertexIterator, bool>
453 insert(std::pair<VertexIdentifier, VertexAttribute> &&Val) {
454 return Vertices.
insert(std::move(Val));
460 std::pair<EdgeIterator, bool>
461 insert(
const std::pair<EdgeIdentifier, EdgeAttribute> &Val) {
462 const auto &p = Edges.
insert(Val);
464 const auto &EI = Val.first;
467 InNeighbors[EI.second].
insert(EI.first);
468 OutNeighbors[EI.first].
insert(EI.second);
477 std::pair<EdgeIterator, bool>
478 insert(std::pair<EdgeIdentifier, EdgeAttribute> &&Val) {
480 const auto &p = Edges.
insert(std::move(Val));
484 InNeighbors[EI.second].
insert(EI.first);
485 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)
iterator find(const_arg_type_t< KeyT > Val)
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
value_type & FindAndConstruct(const KeyT &Key)
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
Tagged union holding either a T or a Error.
ConstIterator const_iterator
CRTP base class for adapting an iterator to a different type.
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 Graph, Graph > GraphT
std::conditional_t< isConst, const EdgeMapT, EdgeMapT > InternalEdgeMapT
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.
ConstVertexIterator const_iterator
const_iterator end() const
const_iterator begin() const
std::conditional_t< isConst, ConstVertexIterator, VertexIterator > iterator
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.
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
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.
This is an optimization pass for GlobalISel generic memory operations.
APInt operator*(APInt a, uint64_t RHS)