Merge pull request #1349 from isanae/master

Handle category cycles by putting parent ids in a set
This commit is contained in:
isanae
2021-01-09 15:12:56 -05:00
committed by GitHub
3 changed files with 20 additions and 5 deletions
+16 -2
View File
@@ -282,9 +282,23 @@ bool CategoryFactory::categoryExists(int id) const
}
bool CategoryFactory::isDecendantOf(int id, int parentID) const
bool CategoryFactory::isDescendantOf(int id, int parentID) const
{
// handles cycles
std::set<int> seen;
return isDescendantOfImpl(id, parentID, seen);
}
bool CategoryFactory::isDescendantOfImpl(
int id, int parentID, std::set<int>& seen) const
{
if (!seen.insert(id).second) {
log::error("cycle in category: {}", id);
return false;
}
std::map<int, unsigned int>::const_iterator iter = m_IDMap.find(id);
if (iter != m_IDMap.end()) {
unsigned int index = iter->second;
if (m_Categories[index].m_ParentID == 0) {
@@ -292,7 +306,7 @@ bool CategoryFactory::isDecendantOf(int id, int parentID) const
} else if (m_Categories[index].m_ParentID == parentID) {
return true;
} else {
return isDecendantOf(m_Categories[index].m_ParentID, parentID);
return isDescendantOfImpl(m_Categories[index].m_ParentID, parentID, seen);
}
} else {
log::warn("{} is no valid category id", id);
+3 -2
View File
@@ -124,7 +124,7 @@ public:
* @param parentID the parent id to test for
* @return true if id is a child of parentID
**/
bool isDecendantOf(int id, int parentID) const;
bool isDescendantOf(int id, int parentID) const;
/**
* @brief test if the specified category has child categories
@@ -209,7 +209,8 @@ private:
std::map<int, unsigned int> m_NexusMap;
private:
// called by isDescendantOf()
bool isDescendantOfImpl(int id, int parentID, std::set<int>& seen) const;
};
+1 -1
View File
@@ -516,7 +516,7 @@ bool ModInfo::categorySet(int categoryID) const
{
for (std::set<int>::const_iterator iter = m_Categories.begin(); iter != m_Categories.end(); ++iter) {
if ((*iter == categoryID) ||
(CategoryFactory::instance().isDecendantOf(*iter, categoryID))) {
(CategoryFactory::instance().isDescendantOf(*iter, categoryID))) {
return true;
}
}