Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // DFS Recursive topological sort to load mods in order of dependencies.
- StringSet workingSet;
- StringSet visitedSet;
- StringList dependencySortedMods;
- function<void(String const&)> dependencySortVisit;
- dependencySortVisit = [&](String const& modName) {
- if (workingSet.contains(modName))
- throw StarException("Mod dependencies form a cycle");
- if (!visitedSet.contains(modName)) {
- workingSet.add(modName);
- for (auto const& depName : mods.get(modName).includes) {
- if (!mods.contains(depName))
- continue;
- dependencySortVisit(depName);
- }
- for (auto const& depName : mods.get(modName).requires) {
- if (!mods.contains(depName))
- throw StarException(strf("Mod '%s' is missing dependency '%s'", modName, depName));
- dependencySortVisit(depName);
- }
- workingSet.remove(modName);
- visitedSet.add(modName);
- dependencySortedMods.append(modName);
- }
- };
- for (auto const& modName : mods.keys())
- dependencySortVisit(modName);
- StringList dependencySortedPaths;
- for (auto const& modName : dependencySortedMods) {
- Logger::info("Detected mod '%s' at '%s'", modName, mods.get(modName).path);
- dependencySortedPaths.append(mods.get(modName).path);
- }
- return dependencySortedPaths;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement