Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2015
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.35 KB | None | 0 0
  1.   // DFS Recursive topological sort to load mods in order of dependencies.
  2.  
  3.   StringSet workingSet;
  4.   StringSet visitedSet;
  5.   StringList dependencySortedMods;
  6.  
  7.   function<void(String const&)> dependencySortVisit;
  8.   dependencySortVisit = [&](String const& modName) {
  9.       if (workingSet.contains(modName))
  10.         throw StarException("Mod dependencies form a cycle");
  11.       if (!visitedSet.contains(modName)) {
  12.         workingSet.add(modName);
  13.         for (auto const& depName : mods.get(modName).includes) {
  14.           if (!mods.contains(depName))
  15.             continue;
  16.           dependencySortVisit(depName);
  17.         }
  18.  
  19.         for (auto const& depName : mods.get(modName).requires) {
  20.           if (!mods.contains(depName))
  21.             throw StarException(strf("Mod '%s' is missing dependency '%s'", modName, depName));
  22.           dependencySortVisit(depName);
  23.         }
  24.  
  25.         workingSet.remove(modName);
  26.         visitedSet.add(modName);
  27.         dependencySortedMods.append(modName);
  28.       }
  29.     };
  30.  
  31.   for (auto const& modName : mods.keys())
  32.     dependencySortVisit(modName);
  33.  
  34.   StringList dependencySortedPaths;
  35.   for (auto const& modName : dependencySortedMods) {
  36.     Logger::info("Detected mod '%s' at '%s'", modName, mods.get(modName).path);
  37.     dependencySortedPaths.append(mods.get(modName).path);
  38.   }
  39.   return dependencySortedPaths;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement