The nightly WTF
Начинаю публиковать избранные особо непонятные куски кода своего LeechCraft. Сегодня в роли жертвы - код, вычисляющий зависимости между плагинами.
void PluginManager::CalculateDependencies () { for (PluginsContainer_t::const_iterator i = Plugins_.begin (); i != Plugins_.end (); ++i) { QObject *pEntity = (*i)->instance (); IInfo *info = qobject_cast<IInfo*> (pEntity); QStringList needs = info->Needs (), uses = info->Uses (); DependenciesMet_ [i] = true; if (!needs.isEmpty ()) { for (PluginsContainer_t::const_iterator j = Plugins_.begin (); j != Plugins_.end (); ++j) { if (j == i) continue; QObject *qpEntity = (*j)->instance (); IInfo *qinfo = qobject_cast<IInfo*> (qpEntity); QStringList qprovides = qinfo->Provides (); for (int k = 0; k < needs.size (); ++k) if (qprovides.contains (needs [i])) { info->SetProvider (qpEntity, needs [k]); needs.removeAt (k--); } } if (!needs.isEmpty ()) { DependenciesMet_ [i] = false; FailedDependencies_ [i] = needs; qWarning () << Q_FUNC_INFO << "not all plugins providing needs of" << info->GetName () << "are found. The remaining ones are:" << needs; } } if (!uses.isEmpty ()) { QMap<QString, bool> usesMet; for (int j = 0; j < uses.size (); ++j) usesMet [uses.at (j)] = false; for (PluginsContainer_t::const_iterator j = Plugins_.begin (); j != Plugins_.end (); ++j) { if (j == i) continue; QObject *qpEntity = (*j)->instance (); IInfo *qinfo = qobject_cast<IInfo*> (qpEntity); QStringList qprovides = qinfo->Provides (); for (int k = 0; k < uses.size (); ++k) if (qprovides.contains (uses [i])) { info->SetProvider (qpEntity, uses [k]); usesMet [uses [i]] = true; } } } } }