30 const string VuoCompilerMakeListNodeClass::makeListNodeClassNamePrefix =
"vuo.list.make.";
33 const string VuoCompilerMakeListNodeClass::makeListNodeClassDescription =
"Creates a list from the given items.";
39 VuoCompilerMakeListNodeClass::VuoCompilerMakeListNodeClass(
string nodeClassName, Module *module) :
57 VuoCompilerMakeListNodeClass::VuoCompilerMakeListNodeClass(
VuoNodeClass *baseNodeClass) :
66 void VuoCompilerMakeListNodeClass::initialize(
void)
83 unsigned long itemCount;
85 bool parsedOk = parseNodeClassName(nodeClassName, itemCount, itemTypeStr);
91 if (! itemType || ! listType)
119 vector<VuoPort *> modelInputPorts;
120 for (
unsigned long i = 0; i < itemCount; ++i)
124 string portName = oss.str();
132 modelInputPorts.push_back( modelItemPort->
getBase() );
140 vector<VuoPort *> modelOutputPorts( 1, modelListPort->
getBase() );
141 map<VuoPort *, size_t> indexOfParameter;
142 map<VuoPort *, size_t> indexOfEventParameter;
146 nullptr, modelInputPorts, modelOutputPorts,
147 map<VuoPort *, json_object *>(), map<VuoPort *, string>(),
148 map<VuoPort *, string>(), map<VuoPort *, VuoPortClass::EventBlocking>(),
149 indexOfParameter, indexOfEventParameter, &constantsCache);
159 BasicBlock *block = &(eventFunction->getEntryBlock());
161 string itemBackingTypeName;
168 itemBackingTypeName = itemTypeStr;
171 string listCreateFunctionName =
"VuoListCreate_" + itemBackingTypeName;
172 Function *listCreateFunctionSrc = listType->
getModule()->getFunction(listCreateFunctionName);
175 string listAppendFunctionName =
"VuoListAppendValue_" + itemBackingTypeName;
176 Function *listAppendFunctionSrc = listType->
getModule()->getFunction(listAppendFunctionName);
179 vector<Value *> itemValues;
180 for (
VuoPort *itemPort : modelInputPorts)
182 size_t argIndex = indexOfParameter[itemPort];
184 itemValues.push_back(itemValue);
185 if (itemParamTypes.size() > 1)
188 itemValues.push_back(itemSecondValue);
191 size_t listArgIndex = indexOfParameter[modelListPort->
getBase()];
194 CallInst *listValue = CallInst::Create(listCreateFunction,
"", block);
198 for (
unsigned long i = 0; i < itemCount; ++i)
200 vector<Value *> listAppendArgs;
201 listAppendArgs.push_back(listValue);
203 int itemValuesIndex = (itemParamTypes.size() > 1 ? 2*i : i);
205 Value *itemArg = itemValues[itemValuesIndex];
208 itemArg =
new BitCastInst(itemArg, listAppendFunction->getFunctionType()->getParamType(1),
"", block);
210 listAppendArgs.push_back(itemArg);
212 if (itemParamTypes.size() > 1)
213 listAppendArgs.push_back(itemValues[itemValuesIndex + 1]);
215 CallInst *call = CallInst::Create(listAppendFunction, listAppendArgs,
"", block);
220 ReturnInst::Create(
module->getContext(), block);
223 for (vector<VuoPort *>::iterator i = modelInputPorts.begin(); i != modelInputPorts.end(); ++i)
225 delete (*i)->getClass()->getCompiler();
228 delete modelListPort;
229 delete modelListPortClass;
236 delete dummyNodeClass;
245 vector<VuoPortClass *> inputPortClasses;
246 inputPortClasses.push_back(refreshPortClass);
247 for (
int i = 1; i <= itemCount; ++i)
255 inputPortClasses.push_back(portClass->
getBase());
258 vector<VuoPortClass *> outputPortClasses;
264 outputPortClasses.push_back(portClass->
getBase());
267 VuoNodeClass *baseNodeClass =
new VuoNodeClass(nodeClassName, refreshPortClass, inputPortClasses, outputPortClasses);
271 nodeClass->itemCount = itemCount;
272 nodeClass->listType = listType;
276 nodeClass->getBase()->setDescription(makeListNodeClassDescription);
277 nodeClass->getBase()->setVersion(
"2.0.0");
279 return nodeClass->getBase();
306 bool VuoCompilerMakeListNodeClass::parseNodeClassName(
string nodeClassName,
unsigned long &itemCount,
string &itemTypeName)
309 size_t dotPos = itemCountAndType.find(
".");
310 if (dotPos == string::npos || dotPos == 0 || dotPos == itemCountAndType.length() - 1)
313 string itemCountStr = itemCountAndType.substr(0, dotPos);
314 itemCount = atol(itemCountStr.c_str());
315 itemTypeName = itemCountAndType.substr(dotPos + 1);
326 string itemCountStr = oss.str();
328 return makeListNodeClassNamePrefix + itemCountStr +
"." + itemTypeName;
364 return "vuo.list.make";
372 return makeListNodeClassDescription;
389 bool foundDataAndEvent =
false;
390 for (set<VuoPortClass *>::iterator i = portClassesToUnspecialize.begin(); i != portClassesToUnspecialize.end(); ++i)
392 foundDataAndEvent =
true;
394 if (! foundDataAndEvent)
406 unsigned long itemCount = 0;
408 parseNodeClassName(
getBase()->getClassName(), itemCount, itemTypeName);
410 string specializedItemTypeName = (itemTypeName == genericTypeName ? specializedTypeName : itemTypeName);