Vuo  2.0.0
VuoDirectedAcyclicGraph.hh
Go to the documentation of this file.
1 
10 #pragma once
11 
16 {
17 public:
21  class Vertex
22  {
23  public:
27  virtual string key(void) = 0;
28 
29  virtual ~Vertex(void);
30  };
31 
34  void addVertex(Vertex *vertex);
35  void removeVertex(Vertex *vertex);
36  Vertex * findVertex(const string &key);
37  void addEdge(Vertex *fromVertex, Vertex *toVertex);
38  vector<Vertex *> getDownstreamVertices(Vertex *vertex);
39  vector<Vertex *> getUpstreamVertices(Vertex *vertex);
40  set<Vertex *> getCycleVertices(void);
41  string toString(bool showVertexAddresses=false);
42 
43 private:
44  static vector<Vertex *> getReachableVertices(Vertex *vertex, const map< Vertex *, vector<Vertex *> > &edges, set<Vertex *> &cycleVertices);
45 
46  map< Vertex *, vector<Vertex *> > edges; // Adjacency list. Every vertex has a key in this map, even if it doesn't have any outgoing edges.
47  map< Vertex *, vector<Vertex *> > downstreamVerticesCache;
48  map< Vertex *, vector<Vertex *> > upstreamVerticesCache;
49  bool cycleVerticesCacheReady;
50  set<Vertex *> cycleVerticesCache;
51 
52  friend class VuoDirectedAcyclicNetwork;
53 };
54 
62 {
63 public:
64  vector<VuoDirectedAcyclicGraph::Vertex *> findVertex(const string &key);
65  void addEdge(VuoDirectedAcyclicGraph *fromGraph, VuoDirectedAcyclicGraph *toGraph);
66  vector<VuoDirectedAcyclicGraph::Vertex *> getDownstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
67  vector<VuoDirectedAcyclicGraph::Vertex *> getUpstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
68  string toString(bool showVertexAddresses=false);
69 
70 private:
71  static vector<VuoDirectedAcyclicGraph::Vertex *> getReachableVertices(VuoDirectedAcyclicGraph::Vertex *vertex, const map< VuoDirectedAcyclicGraph *, vector<VuoDirectedAcyclicGraph *> > &edges, bool isDownstream);
72 
73  map< VuoDirectedAcyclicGraph *, vector<VuoDirectedAcyclicGraph *> > edges;
74 };