Vuo  2.3.2
VuoDirectedAcyclicGraph.hh
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <mutex>
13 
18 {
19 public:
23  class Vertex
24  {
25  public:
29  virtual string key(void) = 0;
30 
31  virtual ~Vertex(void);
32  };
33 
36  void addVertex(Vertex *vertex);
37  void removeVertex(Vertex *vertex);
38  Vertex * findVertex(const string &key);
39  void addEdge(Vertex *fromVertex, Vertex *toVertex);
40  vector<Vertex *> getDownstreamVertices(Vertex *vertex);
41  vector<Vertex *> getUpstreamVertices(Vertex *vertex);
42  set<Vertex *> getCycleVertices(void);
43  int getLongestDownstreamPath(Vertex *vertex);
44  string toString(bool showVertexAddresses=false);
45 
46 private:
47  vector<Vertex *> getDownstreamVerticesInternal(Vertex *vertex);
48  int getLongestDownstreamPathInternal(Vertex *vertex);
49  static vector<Vertex *> getReachableVertices(Vertex *vertex, const map< Vertex *, vector<Vertex *> > &edges, set<Vertex *> &cycleVertices);
50 
51  map< Vertex *, vector<Vertex *> > edges;
52  map< Vertex *, vector<Vertex *> > downstreamVerticesCache;
53  map< Vertex *, vector<Vertex *> > upstreamVerticesCache;
54  bool cycleVerticesCacheReady;
55  set<Vertex *> cycleVerticesCache;
56  map< Vertex *, int > longestDownstreamPathsCache;
57  std::mutex graphMutex;
58 
59  friend class VuoDirectedAcyclicNetwork;
60 };
61 
69 {
70 public:
71  vector<VuoDirectedAcyclicGraph::Vertex *> findVertex(const string &key);
72  void addEdge(VuoDirectedAcyclicGraph *fromGraph, VuoDirectedAcyclicGraph *toGraph);
73  vector<VuoDirectedAcyclicGraph::Vertex *> getDownstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
74  vector<VuoDirectedAcyclicGraph::Vertex *> getUpstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
75  string toString(bool showVertexAddresses=false);
76 
77 private:
78  static vector<VuoDirectedAcyclicGraph::Vertex *> getReachableVertices(VuoDirectedAcyclicGraph::Vertex *vertex, const map< VuoDirectedAcyclicGraph *, vector<VuoDirectedAcyclicGraph *> > &edges, bool isDownstream);
79 
80  map< VuoDirectedAcyclicGraph *, vector<VuoDirectedAcyclicGraph *> > edges;
81 };