/** @cond doxygenLibsbmlInternal */ void CompModelPlugin::findUniqueSubmodPrefixes(vector<string>& submodids, List* allElements) { vector<int> suffixes(submodids.size(), 0); bool done=false; while (!done) { done = true; for (size_t str=0; str<submodids.size(); str++) { stringstream fullprefix; fullprefix << submodids[str]; if (suffixes[str] > 0) { fullprefix << suffixes[str]; } fullprefix << getDivider(); for (unsigned long el=0; el<allElements->getSize(); ++el) { SBase* element = static_cast<SBase*>(allElements->get((unsigned int)el)); if (element==NULL) { assert(false); continue; } if (element->isSetId() && element->getId().find(fullprefix.str())==0) { done = false; continue; } else if (element->isSetMetaId() && element->getMetaId().find(fullprefix.str())==0) { done = false; continue; } else if (element->hasNonstandardIdentifierBeginningWith(fullprefix.str())) { done = false; continue; } else { for (unsigned int p=0; p<element->getNumPlugins(); p++) { if (element->getPlugin(p)->hasIdentifierBeginningWith(fullprefix.str())) { done = false; continue; } } } } if (!done) { suffixes[str]++; continue; //Start over from the first ID; otherwise we end up checking a lot of things twice. } } } //Now change the submodid's: for (size_t str=0; str<submodids.size(); str++) { stringstream fullprefix; fullprefix << submodids[str]; if (suffixes[str] > 0) { fullprefix << suffixes[str]; } fullprefix << getDivider(); submodids[str] = fullprefix.str(); } }