Add an API to traverse the process graph downstream
This commit is contained in:
parent
aa2f946476
commit
45019517d7
@ -44,6 +44,7 @@ public:
|
||||
|
||||
void add (GraphVertex from, GraphVertex to, bool via_sends_only);
|
||||
bool has (GraphVertex from, GraphVertex to, bool* via_sends_only);
|
||||
bool feeds (GraphVertex from, GraphVertex to);
|
||||
std::set<GraphVertex> from (GraphVertex r) const;
|
||||
void remove (GraphVertex from, GraphVertex to);
|
||||
bool has_none_to (GraphVertex to) const;
|
||||
@ -56,6 +57,7 @@ private:
|
||||
typedef std::multimap<GraphVertex, std::pair<GraphVertex, bool> > EdgeMapWithSends;
|
||||
|
||||
EdgeMapWithSends::iterator find_in_from_to_with_sends (GraphVertex, GraphVertex);
|
||||
EdgeMapWithSends::iterator find_recursively_in_from_to_with_sends (GraphVertex, GraphVertex);
|
||||
|
||||
/** map of edges with from as `first' and to as `second' */
|
||||
EdgeMap _from_to;
|
||||
|
@ -59,6 +59,24 @@ GraphEdges::find_in_from_to_with_sends (GraphVertex from, GraphVertex to)
|
||||
return _from_to_with_sends.end ();
|
||||
}
|
||||
|
||||
GraphEdges::EdgeMapWithSends::iterator
|
||||
GraphEdges::find_recursively_in_from_to_with_sends (GraphVertex from, GraphVertex to)
|
||||
{
|
||||
typedef EdgeMapWithSends::iterator Iter;
|
||||
pair<Iter, Iter> r = _from_to_with_sends.equal_range (from);
|
||||
for (Iter i = r.first; i != r.second; ++i) {
|
||||
if (i->second.first == to) {
|
||||
return i;
|
||||
}
|
||||
GraphEdges::EdgeMapWithSends::iterator t = find_recursively_in_from_to_with_sends (i->second.first, to);
|
||||
if (t != _from_to_with_sends.end ()) {
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
return _from_to_with_sends.end ();
|
||||
}
|
||||
|
||||
/** @param via_sends_only if non-0, filled in with true if the edge is a
|
||||
* path via a send only.
|
||||
* @return true if the given edge is present.
|
||||
@ -78,6 +96,16 @@ GraphEdges::has (GraphVertex from, GraphVertex to, bool* via_sends_only)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
GraphEdges::feeds (GraphVertex from, GraphVertex to)
|
||||
{
|
||||
EdgeMapWithSends::iterator i = find_recursively_in_from_to_with_sends (from, to);
|
||||
if (i == _from_to_with_sends.end ()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/** @return the vertices that are fed from `r' */
|
||||
set<GraphVertex>
|
||||
GraphEdges::from (GraphVertex r) const
|
||||
|
Loading…
Reference in New Issue
Block a user