Vuo  2.0.0
VuoNodeRegistry.hh
Go to the documentation of this file.
1 
10 #pragma once
11 
13 #include "VuoCompositionState.h"
14 #include "VuoCompositionDiff.hh"
15 #include "VuoRuntimeContext.hh"
16 
21 {
22 private:
26  struct PortMetadata
27  {
28  string identifier;
29  string name;
30  unsigned long typeIndex;
31  string initialValue;
32  };
33 
37  struct NodeMetadata
38  {
39  string identifier;
40  vector<PortMetadata> portMetadatas;
41 
42  NodeContext *(*compositionCreateContextForNode)(unsigned long);
43  void (*compositionSetPortValue)(VuoCompositionState *, const char *, const char *, bool, bool, bool, bool, bool);
44  char * (*compositionGetPortValue)(VuoCompositionState *, const char *, int, bool);
45  void (*compositionFireTriggerPortEvent)(VuoCompositionState *, const char *);
46  void (*compositionReleasePortData)(void *, unsigned long);
47  };
48 
49  map<string, vector<NodeMetadata> > nodeMetadatas;
50 
51  map<unsigned long, map<unsigned long, NodeContext *> > nodeContextForIndex;
52  map<unsigned long, string> compositionIdentifierForHash;
53  map<string, map<string, void *> > dataForPort;
54  map<string, map<string, dispatch_semaphore_t> > nodeSemaphoreForPort;
55  map<string, map<string, unsigned long> > nodeIndexForPort;
56  map<string, map<string, unsigned long> > typeIndexForPort;
57 
58  map<string, map<string, NodeContext *> > carriedOverNodeContextForIdentifier;
59  map<string, map<string, void *> > carriedOverDataForPort;
60  map<string, map<string, dispatch_semaphore_t> > carriedOverNodeSemaphoreForPort;
61  map<string, map<string, unsigned long> > carriedOverNodeIndexForPort;
62  map<string, map<string, unsigned long> > carriedOverTypeIndexForPort;
63 
64  static const unsigned long topLevelCompositionIndex;
65  static const unsigned long invalidCompositionIndex;
66 
67  VuoRuntimePersistentState *persistentState;
68 
69  static void splitCompositionIdentifier(const string &compositionIdentifier, string &parentCompositionIdentifier, string &nodeIdentifier);
70  static string buildCompositionIdentifier(const string &parentCompositionIdentifier, const string &nodeIdentifier);
71  static void splitPortIdentifier(const string &portIdentifier, string &nodeIdentifier, string &portName);
72 
73  string getNodeIdentifierForIndex(const char *compositionIdentifier, unsigned long nodeIndex);
74  unsigned long getNodeIndexForIdentifier(const string &compositionIdentifier, const string &nodeIdentifier);
75  const NodeMetadata * getNodeMetadataForPort(const string &compositionIdentifier, const string &portIdentifier);
76  string getCompositionIdentifierForHash(unsigned long compositionIdentifierHash);
77  void addNodeContext(const char *compositionIdentifier, unsigned long nodeIndex, struct NodeContext *nodeContext);
78  void removeNodeContext(const char *compositionIdentifier, unsigned long nodeIndex);
79  void relocateNodeContext(const char *compositionIdentifier, unsigned long nodeIndex);
80  NodeContext * carryOverNodeContext(const char *oldCompositionIdentifier, const char *newCompositionIdentifier, unsigned long nodeIndex);
81 
82  template<typename T>
83  static bool findCachedInfoForPort(const map<string, map<string, T> > &cachedInfoForPort, const string &compositionIdentifier, const string &portIdentifier, typename map<string, T>::const_iterator &foundIter);
84  void addPortIdentifier(const char *compositionIdentifier, const string &portIdentifier, void *data, dispatch_semaphore_t nodeSemaphore, unsigned long nodeIndex, unsigned long typeIndex);
85  void removePortIdentifier(const char *compositionIdentifier, const string &portIdentifier);
86  void relocatePortIdentifier(const char *compositionIdentifier, const string &portIdentifier);
87  void carryOverPortIdentifier(const char *oldCompositionIdentifier, const char *newCompositionIdentifier, const string &portIdentifier, unsigned long nodeIndex, unsigned long typeIndex);
88  void carryOverPortIdentifiersForNode(const char *oldCompositionIdentifier, const char *newCompositionIdentifier, const string &nodeIdentifier, unsigned long nodeIndex, const vector<string> &portIdentifiers, const vector<unsigned long> typeIndexes);
89  void removeCarriedOverPortIdentifier(const char *compositionIdentifier, const string &oldPortIdentifier);
90  void carryOverPortData(const char *oldCompositionIdentifier, const char *newCompositionIdentifier, const string &oldPortIdentifier, const string &newPortIdentifier, PortContext *newPortContext);
91 
92  void initContextsForCompositionContents(VuoCompositionState *compositionState);
93  void finiContextsForCompositionContents(VuoCompositionState *compositionState);
94 
95  void print(void);
96 
98 
101  typedef const char *vuoTopLevelCompositionIdentifierType;
102  vuoTopLevelCompositionIdentifierType vuoTopLevelCompositionIdentifier;
104 
105 public:
106  VuoNodeRegistry(VuoRuntimePersistentState *persistentState);
107  void updateCompositionSymbols(void *compositionBinaryHandle);
108 
109  const char * defaultToTopLevelCompositionIdentifier(const char *compositionIdentifier);
110 
111  void addNodeMetadata(const char *compositionIdentifier, const char *nodeIdentifier,
112  NodeContext *(*compositionCreateContextForNode)(unsigned long),
113  void (*compositionSetPortValue)(VuoCompositionState *, const char *, const char *, bool, bool, bool, bool, bool),
114  char * (*compositionGetPortValue)(VuoCompositionState *, const char *, int, bool),
115  void (*compositionFireTriggerPortEvent)(VuoCompositionState *, const char *),
116  void (*compositionReleasePortData)(void *, unsigned long));
117  void addPortMetadata(const char *compositionIdentifier, const char *portIdentifier, const char *portName,
118  unsigned long typeIndex, const char *initialValue);
119  NodeContext * getNodeContext(const char *compositionIdentifier, unsigned long nodeIndex);
120  NodeContext * getCompositionContext(const char *compositionIdentifier);
121  void * getDataForPort(const char *compositionIdentifier, const char *portIdentifier);
122  dispatch_semaphore_t getNodeSemaphoreForPort(const char *compositionIdentifier, const char *portIdentifier);
123  unsigned long getNodeIndexForPort(const char *compositionIdentifier, const char *portIdentifier);
124  unsigned long getTypeIndexForPort(const char *compositionIdentifier, const char *portIdentifier);
125 
126  void initContextForTopLevelComposition(VuoCompositionState *compositionState, bool hasInstanceData, unsigned long publishedOutputPortCount);
128 
129  void setPortValue(VuoCompositionState *compositionState, const char *portIdentifier, const char *valueAsString);
130  char * getPortValue(VuoCompositionState *compositionState, const char *portIdentifier, bool shouldUseInterprocessSerialization);
131  char * getPortSummary(VuoCompositionState *compositionState, const char *portIdentifier);
132  void fireTriggerPortEvent(VuoCompositionState *compositionState, const char *portIdentifier);
133 };
134 
135 extern "C"
136 {
137 void vuoAddNodeMetadata(VuoCompositionState *compositionState, const char *nodeIdentifier,
138  NodeContext *(*compositionCreateContextForNode)(unsigned long),
139  void (*compositionSetPortValue)(VuoCompositionState *, const char *, const char *, bool, bool, bool, bool, bool),
140  char * (*compositionGetPortValue)(VuoCompositionState *, const char *, int, bool),
141  void (*compositionFireTriggerPortEvent)(VuoCompositionState *, const char *),
142  void (*compositionReleasePortData)(void *, unsigned long));
143 void vuoAddPortMetadata(VuoCompositionState *compositionState, const char *portIdentifier, const char *portName,
144  unsigned long typeIndex, const char *initialValue);
145 NodeContext * vuoGetNodeContext(VuoCompositionState *compositionState, unsigned long nodeIndex);
147 void * vuoGetDataForPort(VuoCompositionState *compositionState, const char *portIdentifier);
148 dispatch_semaphore_t vuoGetNodeSemaphoreForPort(VuoCompositionState *compositionState, const char *portIdentifier);
149 unsigned long vuoGetNodeIndexForPort(VuoCompositionState *compositionState, const char *portIdentifier);
150 unsigned long vuoGetTypeIndexForPort(VuoCompositionState *compositionState, const char *portIdentifier);
151 void vuoInitContextForTopLevelComposition(VuoCompositionState *compositionState, bool hasInstanceData, unsigned long publishedOutputPortCount);
153 }