data: Fixed endless recursion on cyclic inheritance edges

Fixed an endless recursion that happenes when the index contains cyclic inheritance relationships,
which might accidentally appear due to name collisions.
This commit is contained in:
Eberhard Graether
2020-01-14 00:14:05 +01:00
parent c8dcb193ff
commit dedbc2eb27
2 changed files with 13 additions and 13 deletions
+12 -12
View File
@@ -1,5 +1,7 @@
#include "HierarchyCache.h"
#include "utility.h"
HierarchyCache::HierarchyNode::HierarchyNode(Id nodeId)
: m_nodeId(nodeId), m_edgeId(0), m_parent(nullptr), m_isVisible(true), m_isImplicit(false)
{
@@ -114,26 +116,26 @@ void HierarchyCache::HierarchyNode::setIsImplicit(bool isImplicit)
void HierarchyCache::HierarchyNode::addInheritanceEdgesRecursive(
Id startId,
std::vector<Id> inheritanceEdgeIds,
const std::set<Id>& inheritanceEdgeIds,
const std::set<Id>& nodeIds,
std::vector<std::tuple<Id, Id, std::vector<Id>>>* inheritanceEdges)
{
for (size_t i = 0; i < m_bases.size(); i++)
{
if (inheritanceEdgeIds.find(m_baseEdgeIds[i]) != inheritanceEdgeIds.end())
{
continue;
}
HierarchyNode* base = m_bases[i];
Id baseId = base->getNodeId();
std::vector<Id> inheritanceEdgeIds2 = inheritanceEdgeIds;
inheritanceEdgeIds2.push_back(m_baseEdgeIds[i]);
std::set<Id> inheritanceEdgeIds2 = inheritanceEdgeIds;
inheritanceEdgeIds2.insert(m_baseEdgeIds[i]);
if (nodeIds.find(baseId) != nodeIds.end())
{
std::vector<Id> inheritanceEdgeIds3 = inheritanceEdgeIds2;
inheritanceEdges->push_back(std::make_tuple<Id, Id, std::vector<Id>>(
std::forward<Id>(startId),
std::forward<Id>(baseId),
std::forward<std::vector<Id>>(inheritanceEdgeIds3)));
inheritanceEdges->push_back({startId, baseId, utility::toVector(inheritanceEdgeIds2)});
}
base->addInheritanceEdgesRecursive(startId, inheritanceEdgeIds2, nodeIds, inheritanceEdges);
@@ -346,9 +348,7 @@ std::vector<std::tuple<Id, Id, std::vector<Id>>> HierarchyCache::getInheritanceE
HierarchyNode* node = getNode(nodeId);
if (node)
{
std::vector<Id> inheritanceEdgeIds;
node->addInheritanceEdgesRecursive(
node->getNodeId(), inheritanceEdgeIds, nodeIds, &inheritanceEdges);
node->addInheritanceEdgesRecursive(node->getNodeId(), {}, nodeIds, &inheritanceEdges);
}
return inheritanceEdges;
+1 -1
View File
@@ -69,7 +69,7 @@ private:
void addInheritanceEdgesRecursive(
Id startId,
std::vector<Id> inheritanceEdgeIds,
const std::set<Id>& inheritanceEdgeIds,
const std::set<Id>& nodeIds,
std::vector<std::tuple<Id, Id, std::vector<Id>>>* inheritanceEdges);