mirror of
https://github.com/ModOrganizer2/modorganizer.git
synced 2026-07-27 13:58:24 -07:00
Merge pull request #1349 from isanae/master
Handle category cycles by putting parent ids in a set
This commit is contained in:
+16
-2
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user