Vuo  2.3.2
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, unsigned long> > nodeIndexForPort;
55  map<string, map<string, unsigned long> > typeIndexForPort;
56 
57  map<string, map<string, NodeContext *> > carriedOverNodeContextForIdentifier;
58  map<string, map<string, void *> > carriedOverDataForPort;
59  map<string, map<string, dispatch_semaphore_t> > carriedOverNodeSemaphoreForPort;
60  map<string, map<string, unsigned long> > carriedOverNodeIndexForPort;
61  map<string, map<string, unsigned long> > carriedOverTypeIndexForPort;
62 
63  static const unsigned long topLevelCompositionIndex;
64  static const unsigned long invalidCompositionIndex;
65 
66  VuoRuntimePersistentState *persistentState;
67 
68  static void splitCompositionIdentifier(const string &compositionIdentifier, string &parentCompositionIdentifier, string &nodeIdentifier);
69  static string buildCompositionIdentifier(const string &parentCompositionIdentifier, const string &nodeIdentifier);
70  static void splitPortIdentifier(const string &portIdentifier, string &nodeIdentifier, string &portName);
71 
72  string getNodeIdentifierForIndex(const char *compositionIdentifier, unsigned long nodeIndex);
73  unsigned long getNodeIndexForIdentifier(const string &compositionIdentifier, const string &nodeIdentifier);
74  const NodeMetadata * getNodeMetadataForPort(const string &compositionIdentifier, const string &portIdentifier);
75  string getCompositionIdentifierForHash(unsigned long compositionIdentifierHash);
76  void addNodeContext(const char *compositionIdentifier, unsigned long nodeIndex, struct NodeContext *nodeContext);
77  void removeNodeContext(const char *compositionIdentifier, unsigned long nodeIndex);
78  void relocateNodeContext(const char *compositionIdentifier, unsigned long nodeIndex);
79  NodeContext * carryOverNodeContext(const char *oldCompositionIdentifier, const char *newCompositionIdentifier, unsigned long nodeIndex);
80 
81  template<typename T>
82  static bool findCachedInfoForPort(const map<string, map<string, T> > &cachedInfoForPort, const string &compositionIdentifier, const string &portIdentifier, typename map<string, T>::const_iterator &foundIter);
83  void addPortIdentifier(const char *compositionIdentifier, const string &portIdentifier, void *data, unsigned long nodeIndex, unsigned long typeIndex);
84  void removePortIdentifier(const char *compositionIdentifier, const string &portIdentifier);
85  void relocatePortIdentifier(const char *compositionIdentifier, const string &portIdentifier);
86  void carryOverPortIdentifier(const char *oldCompositionIdentifier, const char *newCompositionIdentifier, const string &portIdentifier, unsigned long nodeIndex, unsigned long typeIndex);
87  void carryOverPortIdentifiersForNode(const char *oldCompositionIdentifier, const char *newCompositionIdentifier, const string &nodeIdentifier, unsigned long nodeIndex, const vector<string> &portIdentifiers, const vector<unsigned long> typeIndexes);
88  void removeCarriedOverPortIdentifier(const char *compositionIdentifier, const string &oldPortIdentifier);
89  void carryOverPortData(const char *oldCompositionIdentifier, const char *newCompositionIdentifier, const string &oldPortIdentifier, const string &newPortIdentifier, PortContext *newPortContext);
90 
91  void initContextsForCompositionContents(VuoCompositionState *compositionState);
92  void finiContextsForCompositionContents(VuoCompositionState *compositionState);
93 
94  void print(void);
95 
97 
100  typedef const char *vuoTopLevelCompositionIdentifierType;
101  vuoTopLevelCompositionIdentifierType vuoTopLevelCompositionIdentifier;
103 
104 public:
105  VuoNodeRegistry(VuoRuntimePersistentState *persistentState);
106  void updateCompositionSymbols(void *compositionBinaryHandle);
107 
108  const char * defaultToTopLevelCompositionIdentifier(const char *compositionIdentifier);
109 
110  void addNodeMetadata(const char *compositionIdentifier, const char *nodeIdentifier,
111  NodeContext *(*compositionCreateContextForNode)(unsigned long),
112  void (*compositionSetPortValue)(VuoCompositionState *, const char *, const char *, bool, bool, bool, bool, bool),
113  char * (*compositionGetPortValue)(VuoCompositionState *, const char *, int, bool),
114  void (*compositionFireTriggerPortEvent)(VuoCompositionState *, const char *),
115  void (*compositionReleasePortData)(void *, unsigned long));
116  void addPortMetadata(const char *compositionIdentifier, const char *portIdentifier, const char *portName,
117  unsigned long typeIndex, const char *initialValue);
118  NodeContext * getNodeContext(const char *compositionIdentifier, unsigned long nodeIndex);
119  NodeContext * getCompositionContext(const char *compositionIdentifier);
120  void * getDataForPort(const char *compositionIdentifier, const char *portIdentifier);
121  unsigned long getNodeIndexForPort(const char *compositionIdentifier, const char *portIdentifier);
122  unsigned long getTypeIndexForPort(const char *compositionIdentifier, const char *portIdentifier);
123 
124  void initContextForTopLevelComposition(VuoCompositionState *compositionState, bool hasInstanceData, unsigned long publishedOutputPortCount);
126 
127  void setPortValue(VuoCompositionState *compositionState, const char *portIdentifier, const char *valueAsString);
128  char * getPortValue(VuoCompositionState *compositionState, const char *portIdentifier, bool shouldUseInterprocessSerialization);
129  char * getPortSummary(VuoCompositionState *compositionState, const char *portIdentifier);
130  void fireTriggerPortEvent(VuoCompositionState *compositionState, const char *portIdentifier);
131 };
132 
133 extern "C"
134 {
135 void vuoAddNodeMetadata(VuoCompositionState *compositionState, const char *nodeIdentifier,
136  NodeContext *(*compositionCreateContextForNode)(unsigned long),
137  void (*compositionSetPortValue)(VuoCompositionState *, const char *, const char *, bool, bool, bool, bool, bool),
138  char * (*compositionGetPortValue)(VuoCompositionState *, const char *, int, bool),
139  void (*compositionFireTriggerPortEvent)(VuoCompositionState *, const char *),
140  void (*compositionReleasePortData)(void *, unsigned long));
141 void vuoAddPortMetadata(VuoCompositionState *compositionState, const char *portIdentifier, const char *portName,
142  unsigned long typeIndex, const char *initialValue);
143 NodeContext * vuoGetNodeContext(VuoCompositionState *compositionState, unsigned long nodeIndex);
145 void * vuoGetDataForPort(VuoCompositionState *compositionState, const char *portIdentifier);
146 unsigned long vuoGetNodeIndexForPort(VuoCompositionState *compositionState, const char *portIdentifier);
147 unsigned long vuoGetTypeIndexForPort(VuoCompositionState *compositionState, const char *portIdentifier);
148 void vuoInitContextForTopLevelComposition(VuoCompositionState *compositionState, bool hasInstanceData, unsigned long publishedOutputPortCount);
150 }