Vuo  2.3.2
VuoCompilerPublishedOutputNodeClass.cc
Go to the documentation of this file.
1 
11 #include "VuoCompiler.hh"
18 #include "VuoCompilerType.hh"
19 #include "VuoGenericType.hh"
20 #include "VuoNode.hh"
21 #include "VuoNodeClass.hh"
22 #include "VuoPublishedPort.hh"
23 #include "VuoStringUtilities.hh"
24 
25 
26 VuoCompilerPublishedOutputNodeClass * VuoCompilerPublishedOutputNodeClass::singleton = nullptr;
27 
31 VuoCompilerPublishedOutputNodeClass * VuoCompilerPublishedOutputNodeClass::getSingleton(void)
32 {
33  if (! singleton)
34  singleton = new VuoCompilerPublishedOutputNodeClass(new VuoNodeClass(VuoNodeClass::publishedOutputNodeClassName, vector<string>(), vector<string>()));
35 
36  return singleton;
37 }
38 
42 VuoCompilerPublishedOutputNodeClass::VuoCompilerPublishedOutputNodeClass(string nodeClassName, Module *module) :
43  VuoCompilerPublishedNodeClass(nodeClassName, module)
44 {
45 }
46 
50 VuoCompilerPublishedOutputNodeClass::VuoCompilerPublishedOutputNodeClass(VuoCompilerPublishedOutputNodeClass *compilerNodeClass) :
51  VuoCompilerPublishedNodeClass(compilerNodeClass)
52 {
53 }
54 
58 VuoCompilerPublishedOutputNodeClass::VuoCompilerPublishedOutputNodeClass(VuoNodeClass *baseNodeClass) :
59  VuoCompilerPublishedNodeClass(baseNodeClass)
60 {
61 }
62 
67 VuoNodeClass * VuoCompilerPublishedOutputNodeClass::newNodeClass(string nodeClassName, VuoCompiler *compiler, dispatch_queue_t llvmQueue)
68 {
69  return VuoCompilerPublishedNodeClass::newNodeClass(nodeClassName, compiler, llvmQueue, getSingleton());
70 }
71 
75 VuoNodeClass * VuoCompilerPublishedOutputNodeClass::newNodeClass(vector<VuoPublishedPort *> publishedOutputPorts, dispatch_queue_t llvmQueue)
76 {
77  return VuoCompilerPublishedNodeClass::newNodeClass(publishedOutputPorts, llvmQueue, getSingleton());
78 }
79 
84 VuoNodeClass * VuoCompilerPublishedOutputNodeClass::newNodeClassWithImplementation(const string &nodeClassName,
85  const vector<string> &portNames, const vector<VuoType *> &types)
86 {
87  Module *module = new Module(nodeClassName, *VuoCompiler::globalLLVMContext);
88 
89  // VuoModuleMetadata({});
91 
92  // For published ports a (data+event) and b (event):
93  //
94  // void nodeEvent
95  // (
96  // VuoInputData(<data type>) a,
97  // VuoInputEvent() b,
98  // VuoInputEvent() gather
99  // )
100  // {
101  // }
102 
103 
104  vector<VuoPort *> modelInputPorts;
105  for (size_t i = 0; i < portNames.size(); ++i)
106  {
107  VuoCompilerPublishedPort *modelPort = VuoCompilerPublishedPort::newPort(portNames.at(i), types.at(i));
108  modelInputPorts.push_back(modelPort->getBase());
109  }
110 
111  VuoCompilerInputEventPortClass *gatherPortClass = new VuoCompilerInputEventPortClass("gather");
112  VuoCompilerPort *gatherPort = gatherPortClass->newPort();
113  modelInputPorts.push_back(gatherPort->getBase());
114 
115  map<VuoPort *, size_t> indexOfDataParameter;
116  map<VuoPort *, size_t> indexOfEventParameter;
117  VuoCompilerConstantsCache constantsCache(module);
118 
119  Function *eventFunction = VuoCompilerCodeGenUtilities::getNodeEventFunction(module, "", false, false,
120  nullptr, modelInputPorts, vector<VuoPort *>(),
121  map<VuoPort *, json_object *>(), map<VuoPort *, string>(),
122  map<VuoPort *, string>(), map<VuoPort *, VuoPortClass::EventBlocking>(),
123  indexOfDataParameter, indexOfEventParameter, &constantsCache);
124 
125  BasicBlock *block = &(eventFunction->getEntryBlock());
126  ReturnInst::Create(module->getContext(), block);
127 
128 
130  VuoCompilerNodeClass *nodeClass = new VuoCompilerPublishedOutputNodeClass(dummyNodeClass);
131  delete dummyNodeClass;
132 
134  nodeClass->getBase()->setVersion("1.0.0");
135 
136  return nodeClass->getBase();
137 }
138 
143 VuoNodeClass * VuoCompilerPublishedOutputNodeClass::newNodeClassWithoutImplementation(const string &nodeClassName,
144  const vector<string> &portNames, const vector<VuoType *> &types)
145 {
146  vector<VuoPortClass *> inputPortClasses;
147  vector<VuoPortClass *> outputPortClasses;
148 
149  VuoPortClass *refreshPortClass = (new VuoCompilerInputEventPortClass("refresh"))->getBase();
150  inputPortClasses.push_back(refreshPortClass);
151 
152  for (size_t i = 0; i < portNames.size(); ++i)
153  {
154  VuoCompilerInputEventPortClass *inputPortClass = new VuoCompilerInputEventPortClass(portNames.at(i));
155  if (types.at(i))
156  {
157  VuoCompilerInputDataClass *inputDataClass = new VuoCompilerInputDataClass("");
158  inputPortClass->setDataClass(inputDataClass);
159  inputPortClass->setDataVuoType(types.at(i));
160  }
161 
162  inputPortClasses.push_back(inputPortClass->getBase());
163  }
164 
165  VuoPortClass *gatherPortClass = (new VuoCompilerInputEventPortClass("gather"))->getBase();
166  inputPortClasses.push_back(gatherPortClass);
167 
168  VuoNodeClass *baseNodeClass = new VuoNodeClass(nodeClassName, refreshPortClass, inputPortClasses, outputPortClasses);
169  VuoCompilerNodeClass *nodeClass = new VuoCompilerPublishedOutputNodeClass(baseNodeClass);
170 
172 
173  return nodeClass->getBase();
174 }
175 
180 {
181  return VuoNodeClass::unreservedInputPortStartIndex + publishedOutputPortIndex;
182 }
183 
188 {
189  return getBase()->getInputPortClasses().size() - 1;
190 }
191 
195 string VuoCompilerPublishedOutputNodeClass::buildNodeClassName(const vector<VuoPublishedPort *> &publishedOutputPorts)
196 {
197  return getSingleton()->buildNodeClassNameFromPorts(publishedOutputPorts);
198 }
199 
203 string VuoCompilerPublishedOutputNodeClass::getNodeClassNamePrefix(void)
204 {
206 }
207 
211 set<string> VuoCompilerPublishedOutputNodeClass::getReservedPortNames(void)
212 {
213  set<string> names;
214  names.insert("refresh");
215  names.insert("gather");
216  return names;
217 }