Skip to content

Commit

Permalink
mods.cpp/h: little performance improvement in getModsInPath (+ codest…
Browse files Browse the repository at this point in the history
…yle) (#7108)

* mods.cpp/h: little performance improvement in getModsInPath
  • Loading branch information
nerzhul committed Mar 8, 2018
1 parent 6cfd699 commit f35236a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 7 deletions.
17 changes: 12 additions & 5 deletions src/mods.cpp
Expand Up @@ -85,24 +85,31 @@ void parseModContents(ModSpec &spec)
}
}

std::map<std::string, ModSpec> getModsInPath(std::string path, bool part_of_modpack)
std::map<std::string, ModSpec> getModsInPath(const std::string &path,
bool part_of_modpack)
{
// NOTE: this function works in mutual recursion with parseModContents

std::map<std::string, ModSpec> result;
std::vector<fs::DirListNode> dirlist = fs::GetDirListing(path);
std::string modpath;

for (const fs::DirListNode &dln : dirlist) {
if(!dln.dir)
if (!dln.dir)
continue;

const std::string &modname = dln.name;
// Ignore all directories beginning with a ".", especially
// VCS directories like ".git" or ".svn"
if (modname[0] == '.')
continue;
std::string modpath = path + DIR_DELIM + modname;

ModSpec spec(modname, modpath);
spec.part_of_modpack = part_of_modpack;
modpath.clear();
modpath.append(path)
.append(DIR_DELIM)
.append(modname);

ModSpec spec(modname, modpath, part_of_modpack);
parseModContents(spec);
result.insert(std::make_pair(modname, spec));
}
Expand Down
10 changes: 8 additions & 2 deletions src/mods.h
Expand Up @@ -45,16 +45,22 @@ struct ModSpec
bool is_modpack = false;
// if modpack:
std::map<std::string,ModSpec> modpack_content;
ModSpec(const std::string &name_="", const std::string &path_=""):
ModSpec(const std::string &name_ = "", const std::string &path_ = ""):
name(name_),
path(path_)
{}
ModSpec(const std::string &name_, const std::string &path_, bool part_of_modpack_):
name(name_),
path(path_),
part_of_modpack(part_of_modpack_)
{}
};

// Retrieves depends, optdepends, is_modpack and modpack_content
void parseModContents(ModSpec &mod);

std::map<std::string,ModSpec> getModsInPath(std::string path, bool part_of_modpack = false);
std::map<std::string,ModSpec> getModsInPath(const std::string &path,
bool part_of_modpack = false);

// replaces modpack Modspecs with their content
std::vector<ModSpec> flattenMods(std::map<std::string,ModSpec> mods);
Expand Down

0 comments on commit f35236a

Please sign in to comment.