15const string VuoGenericType::genericTypeNamePrefix =
"VuoGenericType";
23 this->compatibleSpecializedTypes = compatibleSpecializedTypes;
25 string compatiblesDescription;
29 compatiblesDescription =
"any type";
31 compatiblesDescription =
"any list type";
34 for (
size_t i = 0; i < compatibles.size(); ++i)
36 compatiblesDescription += compatibles[i];
37 if (compatibles.size() >= 3)
39 if (i < compatibles.size() - 2)
40 compatiblesDescription +=
", ";
41 else if (i == compatibles.size() - 2)
42 compatiblesDescription +=
", or ";
44 else if (compatibles.size() == 2 && i == 0)
45 compatiblesDescription +=
" or ";
48 string suffix = extractSuffixStringFromGenericTypeName(typeName);
50 setDefaultTitle(
"(" + typeDescription +
" — can connect to " + compatiblesDescription +
")" );
65 return find(compatibles.cbegin(), compatibles.cend(), typeName) != compatibles.cend();
84 std::sort(thisCompatibles.begin(), thisCompatibles.end());
85 std::sort(otherCompatibles.begin(), otherCompatibles.end());
87 set<string> bothCompatibles;
88 set_intersection(thisCompatibles.begin(), thisCompatibles.end(),
89 otherCompatibles.begin(), otherCompatibles.end(),
90 std::insert_iterator<set<string> >(bothCompatibles, bothCompatibles.begin() ));
91 return (! bothCompatibles.empty());
105 compatibility = (compatibleSpecializedTypes.empty() ?
111 return compatibleSpecializedTypes;
119 string genericTypeName;
120 findGenericTypeName(typeName, 0, genericTypeName);
121 return genericTypeName == typeName;
129 vector<string> genericTypeNames;
132 string genericTypeName;
133 while ((pos = VuoGenericType::findGenericTypeName(stringToSearch, pos, genericTypeName)) != string::npos)
135 pos += genericTypeName.length();
137 if (find(genericTypeNames.begin(), genericTypeNames.end(), genericTypeName) == genericTypeNames.end())
138 genericTypeNames.push_back(genericTypeName);
141 return genericTypeNames;
154size_t VuoGenericType::findGenericTypeName(
string stringToSearch,
size_t startPos,
string &genericTypeName)
156 size_t genericStartPos = startPos;
160 genericStartPos = stringToSearch.find(genericTypeNamePrefix, genericStartPos);
161 if (genericStartPos == string::npos)
163 genericTypeName =
"";
168 for (
size_t i = genericStartPos + genericTypeNamePrefix.length(); i < stringToSearch.length(); ++i)
170 if (
'0' <= stringToSearch[i] && stringToSearch[i] <=
'9')
171 suffix += stringToSearch[i];
176 if (! suffix.empty())
185 genericStartPos = listPrefixStartPos;
189 genericTypeName = listPrefix + genericTypeNamePrefix + suffix;
193 genericStartPos += genericTypeNamePrefix.length();
196 return genericStartPos;
207 return genericTypeName;
209 string typeName = genericTypeName;
211 size_t innermostTypeNamePos = typeName.find(innermostTypeName);
212 typeName.replace(innermostTypeNamePos, innermostTypeName.length(), replacementTypeName);
228 vector<string> &orderedGenericTypeNames)
230 if (orderedGenericTypeNames.empty())
232 std::transform(specializedForGenericTypeName.begin(), specializedForGenericTypeName.end(),
233 std::inserter(orderedGenericTypeNames, orderedGenericTypeNames.end()),
234 [](
const pair<string, string> &p) { return p.first; });
236 std::sort(orderedGenericTypeNames.begin(), orderedGenericTypeNames.end(),
237 [](
const string &name1,
const string &name2) { return name1.length() > name2.length(); });
240 size_t replacementCount = 0;
241 for (
const string &genericTypeName : orderedGenericTypeNames)
243 auto specializedTypeNameIter = specializedForGenericTypeName.find(genericTypeName);
244 if (specializedTypeNameIter != specializedForGenericTypeName.end())
248 return replacementCount > 0;
257 oss << genericTypeNamePrefix << suffix;
266 sort(genericTypeNames.begin(), genericTypeNames.end(), isPairOfGenericTypesSorted);
272bool VuoGenericType::isPairOfGenericTypesSorted(
string type1,
string type2)
274 unsigned int suffix1 = extractSuffixFromGenericTypeName(type1);
275 unsigned int suffix2 = extractSuffixFromGenericTypeName(type2);
276 return (suffix1 < suffix2);
282string VuoGenericType::extractSuffixStringFromGenericTypeName(
string genericTypeName)
287 size_t prefixStartPos = genericTypeName.find(genericTypeNamePrefix);
288 size_t suffixStartPos = prefixStartPos + genericTypeNamePrefix.length();
289 return genericTypeName.substr(suffixStartPos);
295unsigned int VuoGenericType::extractSuffixFromGenericTypeName(
string genericTypeName)
297 string suffixStr = extractSuffixStringFromGenericTypeName(genericTypeName);
298 unsigned int suffix = 0;
299 istringstream iss(suffixStr);