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  int getLongestDownstreamPath(Vertex *vertex);
42  string toString(bool showVertexAddresses=false);
43 
44 private:
45  static vector<Vertex *> getReachableVertices(Vertex *vertex, const map< Vertex *, vector<Vertex *> > &edges, set<Vertex *> &cycleVertices);
46 
47  map< Vertex *, vector<Vertex *> > edges;
48  map< Vertex *, vector<Vertex *> > downstreamVerticesCache;
49  map< Vertex *, vector<Vertex *> > upstreamVerticesCache;
50  bool cycleVerticesCacheReady;
51  set<Vertex *> cycleVerticesCache;
52  map< Vertex *, int > longestDownstreamPathsCache;
53 
54  friend class VuoDirectedAcyclicNetwork;
55 };
56 
64 {
65 public:
66  vector<VuoDirectedAcyclicGraph::Vertex *> findVertex(const string &key);
67  void addEdge(VuoDirectedAcyclicGraph *fromGraph, VuoDirectedAcyclicGraph *toGraph);
68  vector<VuoDirectedAcyclicGraph::Vertex *> getDownstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
69  vector<VuoDirectedAcyclicGraph::Vertex *> getUpstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
70  string toString(bool showVertexAddresses=false);
71 
72 private:
73  static vector<VuoDirectedAcyclicGraph::Vertex *> getReachableVertices(VuoDirectedAcyclicGraph::Vertex *vertex, const map< VuoDirectedAcyclicGraph *, vector<VuoDirectedAcyclicGraph *> > &edges, bool isDownstream);
74 
75  map< VuoDirectedAcyclicGraph *, vector<VuoDirectedAcyclicGraph *> > edges;
76 };