diff options
Diffstat (limited to 'src/dotnode.cpp')
-rw-r--r-- | src/dotnode.cpp | 448 |
1 files changed, 172 insertions, 276 deletions
diff --git a/src/dotnode.cpp b/src/dotnode.cpp index 06de5f4..a6703b3 100644 --- a/src/dotnode.cpp +++ b/src/dotnode.cpp @@ -302,9 +302,6 @@ DotNode::DotNode(int n,const char *lab,const char *tip, const char *url, DotNode::~DotNode() { - delete m_children; - delete m_parents; - delete m_edgeInfo; } void DotNode::addChild(DotNode *n, @@ -315,72 +312,48 @@ void DotNode::addChild(DotNode *n, int edgeLabCol ) { - if (m_children==0) - { - m_children = new QList<DotNode>; - m_edgeInfo = new QList<EdgeInfo>; - m_edgeInfo->setAutoDelete(TRUE); - } - m_children->append(n); - EdgeInfo *ei = new EdgeInfo( + m_children.push_back(n); + m_edgeInfo.emplace_back( edgeColor, edgeStyle, edgeLab, edgeURL, edgeLabCol==-1 ? edgeColor : edgeLabCol); - m_edgeInfo->append(ei); } void DotNode::addParent(DotNode *n) { - if (m_parents==0) - { - m_parents = new QList<DotNode>; - } - m_parents->append(n); + m_parents.push_back(n); } void DotNode::removeChild(DotNode *n) { - if (m_children) m_children->remove(n); + auto it = std::find(m_children.begin(),m_children.end(),n); + if (it!=m_children.end()) m_children.erase(it); } void DotNode::removeParent(DotNode *n) { - if (m_parents) m_parents->remove(n); + auto it = std::find(m_parents.begin(),m_parents.end(),n); + if (it!=m_parents.end()) m_parents.erase(it); } -void DotNode::deleteNode(DotNodeList &deletedList,SDict<DotNode> *skipNodes) +void DotNode::deleteNode(DotNodeRefVector &deletedList) { if (m_deleted) return; // avoid recursive loops in case the graph has cycles m_deleted=TRUE; - if (m_parents!=0) // delete all parent nodes of this node + // delete all parent nodes of this node + for (const auto &pn : m_parents) { - QListIterator<DotNode> dnlip(*m_parents); - DotNode *pn; - for (dnlip.toFirst();(pn=dnlip.current());++dnlip) - { - //pn->removeChild(this); - pn->deleteNode(deletedList,skipNodes); - } + pn->deleteNode(deletedList); } - if (m_children!=0) // delete all child nodes of this node + // delete all child nodes of this node + for (const auto &cn : m_children) { - QListIterator<DotNode> dnlic(*m_children); - DotNode *cn; - for (dnlic.toFirst();(cn=dnlic.current());++dnlic) - { - //cn->removeParent(this); - cn->deleteNode(deletedList,skipNodes); - } + cn->deleteNode(deletedList); } // add this node to the list of deleted nodes. - //printf("skipNodes=%p find(%p)=%p\n",skipNodes,this,skipNodes ? skipNodes->find((int)this) : 0); - if (skipNodes==0 || skipNodes->find((char*)this)==0) - { - //printf("deleting\n"); - deletedList.append(this); - } + deletedList.push_back(this); } void DotNode::setDistance(int distance) @@ -390,20 +363,21 @@ void DotNode::setDistance(int distance) inline int DotNode::findParent( DotNode *n ) { - if ( !m_parents ) return -1; - return m_parents->find(n); + auto it = std::find(m_parents.begin(),m_parents.end(),n); + return it!=m_parents.end() ? it-m_parents.begin() : -1; } /*! helper function that deletes all nodes in a connected graph, given * one of the graph's nodes */ -void DotNode::deleteNodes(DotNode *node,SDict<DotNode> *skipNodes) +void DotNode::deleteNodes(DotNode *node) { - //printf("deleteNodes skipNodes=%p\n",skipNodes); - static DotNodeList deletedNodes; - deletedNodes.setAutoDelete(TRUE); - node->deleteNode(deletedNodes,skipNodes); // collect nodes to be deleted. - deletedNodes.clear(); // actually remove the nodes. + DotNodeRefVector deletedNodes; + node->deleteNode(deletedNodes); // collect nodes to be deleted. + for (const auto &dotNode : deletedNodes) + { + delete dotNode; + } } void DotNode::writeBox(FTextStream &t, @@ -421,27 +395,22 @@ void DotNode::writeBox(FTextStream &t, // add names shown as relations to a set, so we don't show // them as attributes as well StringUnorderedSet arrowNames; - if (m_edgeInfo) + // for each edge + for (const auto &ei : m_edgeInfo) { - // for each edge - QListIterator<EdgeInfo> li(*m_edgeInfo); - EdgeInfo *ei; - for (li.toFirst();(ei=li.current());++li) + if (!ei.label().isEmpty()) // labels joined by \n { - if (!ei->label().isEmpty()) // labels joined by \n + int i=ei.label().find('\n'); + int p=0; + QCString lab; + while ((i=ei.label().find('\n',p))!=-1) { - int i=ei->label().find('\n'); - int p=0; - QCString lab; - while ((i=ei->label().find('\n',p))!=-1) - { - lab = stripProtectionPrefix(ei->label().mid(p,i-p)); - arrowNames.insert(lab.str()); - p=i+1; - } - lab = stripProtectionPrefix(ei->label().right(ei->label().length()-p)); + lab = stripProtectionPrefix(ei.label().mid(p,i-p)); arrowNames.insert(lab.str()); + p=i+1; } + lab = stripProtectionPrefix(ei.label().right(ei.label().length()-p)); + arrowNames.insert(lab.str()); } } @@ -597,44 +566,40 @@ void DotNode::write(FTextStream &t, if (!m_visible) return; // node is not visible writeBox(t,gt,format,m_truncated==Truncated); m_written=TRUE; - QList<DotNode> *nl = toChildren ? m_children : m_parents; - if (nl) + if (toChildren) { - if (toChildren) + auto it = m_edgeInfo.begin(); + for (const auto &cn : m_children) { - QListIterator<DotNode> dnli1(*nl); - QListIterator<EdgeInfo> dnli2(*m_edgeInfo); - const DotNode *cn; - for (dnli1.toFirst();(cn=dnli1.current());++dnli1,++dnli2) + if (cn->isVisible()) { - if (cn->isVisible()) - { - //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",cn->label().data()); - writeArrow(t,gt,format,cn,dnli2.current(),topDown,backArrows); - } - cn->write(t,gt,format,topDown,toChildren,backArrows); + //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",cn->label().data()); + writeArrow(t,gt,format,cn,&(*it),topDown,backArrows); } + cn->write(t,gt,format,topDown,toChildren,backArrows); + ++it; } - else // render parents + } + else // render parents + { + for (const auto &pn : m_parents) { - QListIterator<DotNode> dnli(*nl); - DotNode *pn; - for (dnli.toFirst();(pn=dnli.current());++dnli) + if (pn->isVisible()) { - if (pn->isVisible()) - { - //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",pn->label().data()); - writeArrow(t, - gt, - format, - pn, - pn->edgeInfo()->at(pn->children()->findRef(this)), - FALSE, - backArrows - ); - } - pn->write(t,gt,format,TRUE,FALSE,backArrows); + const auto &children = pn->children(); + auto child_it = std::find(children.begin(),children.end(),this); + int index = child_it - children.begin(); + //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",pn->label().data()); + writeArrow(t, + gt, + format, + pn, + &pn->edgeInfo()[index], + FALSE, + backArrows + ); } + pn->write(t,gt,format,TRUE,FALSE,backArrows); } } //printf("end DotNode::write(%d) name=%s\n",distance,m_label.data()); @@ -660,51 +625,46 @@ void DotNode::writeXML(FTextStream &t,bool isClassGraph) const t << "/>" << endl; } } - if (m_children) + auto it = m_edgeInfo.begin(); + for (const auto &childNode : m_children) { - QListIterator<DotNode> nli(*m_children); - QListIterator<EdgeInfo> eli(*m_edgeInfo); - DotNode *childNode; - EdgeInfo *edgeInfo; - for (;(childNode=nli.current());++nli,++eli) - { - edgeInfo=eli.current(); - t << " <childnode refid=\"" << childNode->number() << "\" relation=\""; - if (isClassGraph) - { - switch(edgeInfo->color()) - { - case EdgeInfo::Blue: t << "public-inheritance"; break; - case EdgeInfo::Green: t << "protected-inheritance"; break; - case EdgeInfo::Red: t << "private-inheritance"; break; - case EdgeInfo::Purple: t << "usage"; break; - case EdgeInfo::Orange: t << "template-instance"; break; - case EdgeInfo::Orange2: t << "type-constraint"; break; - case EdgeInfo::Grey: ASSERT(0); break; - } - } - else // include graph + const EdgeInfo &edgeInfo = *it; + t << " <childnode refid=\"" << childNode->number() << "\" relation=\""; + if (isClassGraph) + { + switch(edgeInfo.color()) { - t << "include"; + case EdgeInfo::Blue: t << "public-inheritance"; break; + case EdgeInfo::Green: t << "protected-inheritance"; break; + case EdgeInfo::Red: t << "private-inheritance"; break; + case EdgeInfo::Purple: t << "usage"; break; + case EdgeInfo::Orange: t << "template-instance"; break; + case EdgeInfo::Orange2: t << "type-constraint"; break; + case EdgeInfo::Grey: ASSERT(0); break; } - t << "\">" << endl; - if (!edgeInfo->label().isEmpty()) + } + else // include graph + { + t << "include"; + } + t << "\">" << endl; + if (!edgeInfo.label().isEmpty()) + { + int p=0; + int ni; + while ((ni=edgeInfo.label().find('\n',p))!=-1) { - int p=0; - int ni; - while ((ni=edgeInfo->label().find('\n',p))!=-1) - { - t << " <edgelabel>" - << convertToXML(edgeInfo->label().mid(p,ni-p)) - << "</edgelabel>" << endl; - p=ni+1; - } t << " <edgelabel>" - << convertToXML(edgeInfo->label().right(edgeInfo->label().length()-p)) + << convertToXML(edgeInfo.label().mid(p,ni-p)) << "</edgelabel>" << endl; + p=ni+1; } - t << " </childnode>" << endl; + t << " <edgelabel>" + << convertToXML(edgeInfo.label().right(edgeInfo.label().length()-p)) + << "</edgelabel>" << endl; } + t << " </childnode>" << endl; + ++it; } t << " </node>" << endl; } @@ -729,51 +689,46 @@ void DotNode::writeDocbook(FTextStream &t,bool isClassGraph) const t << "/>" << endl; } } - if (m_children) + auto it = m_edgeInfo.begin(); + for (const auto &childNode : m_children) { - QListIterator<DotNode> nli(*m_children); - QListIterator<EdgeInfo> eli(*m_edgeInfo); - DotNode *childNode; - EdgeInfo *edgeInfo; - for (;(childNode=nli.current());++nli,++eli) - { - edgeInfo=eli.current(); - t << " <childnode refid=\"" << childNode->number() << "\" relation=\""; - if (isClassGraph) - { - switch(edgeInfo->color()) - { - case EdgeInfo::Blue: t << "public-inheritance"; break; - case EdgeInfo::Green: t << "protected-inheritance"; break; - case EdgeInfo::Red: t << "private-inheritance"; break; - case EdgeInfo::Purple: t << "usage"; break; - case EdgeInfo::Orange: t << "template-instance"; break; - case EdgeInfo::Orange2: t << "type-constraint"; break; - case EdgeInfo::Grey: ASSERT(0); break; - } - } - else // include graph + const EdgeInfo &edgeInfo = *it; + t << " <childnode refid=\"" << childNode->number() << "\" relation=\""; + if (isClassGraph) + { + switch(edgeInfo.color()) { - t << "include"; + case EdgeInfo::Blue: t << "public-inheritance"; break; + case EdgeInfo::Green: t << "protected-inheritance"; break; + case EdgeInfo::Red: t << "private-inheritance"; break; + case EdgeInfo::Purple: t << "usage"; break; + case EdgeInfo::Orange: t << "template-instance"; break; + case EdgeInfo::Orange2: t << "type-constraint"; break; + case EdgeInfo::Grey: ASSERT(0); break; } - t << "\">" << endl; - if (!edgeInfo->label().isEmpty()) + } + else // include graph + { + t << "include"; + } + t << "\">" << endl; + if (!edgeInfo.label().isEmpty()) + { + int p=0; + int ni; + while ((ni=edgeInfo.label().find('\n',p))!=-1) { - int p=0; - int ni; - while ((ni=edgeInfo->label().find('\n',p))!=-1) - { - t << " <edgelabel>" - << convertToXML(edgeInfo->label().mid(p,ni-p)) - << "</edgelabel>" << endl; - p=ni+1; - } t << " <edgelabel>" - << convertToXML(edgeInfo->label().right(edgeInfo->label().length()-p)) + << convertToXML(edgeInfo.label().mid(p,ni-p)) << "</edgelabel>" << endl; + p=ni+1; } - t << " </childnode>" << endl; + t << " <edgelabel>" + << convertToXML(edgeInfo.label().right(edgeInfo.label().length()-p)) + << "</edgelabel>" << endl; } + t << " </childnode>" << endl; + ++it; } t << " </node>" << endl; } @@ -806,21 +761,16 @@ void DotNode::writeDEF(FTextStream &t) const t << " };" << endl; } } - if (m_children) + auto it = m_edgeInfo.begin(); + for (const auto &childNode : m_children) { - QListIterator<DotNode> nli(*m_children); - QListIterator<EdgeInfo> eli(*m_edgeInfo); - DotNode *childNode; - EdgeInfo *edgeInfo; - for (;(childNode=nli.current());++nli,++eli) - { - edgeInfo=eli.current(); - t << " node-child = {" << endl; - t << " child-id = '" << childNode->number() << "';" << endl; - t << " relation = "; - - switch(edgeInfo->color()) - { + const EdgeInfo &edgeInfo = *it; + t << " node-child = {" << endl; + t << " child-id = '" << childNode->number() << "';" << endl; + t << " relation = "; + + switch (edgeInfo.color()) + { case EdgeInfo::Blue: t << "public-inheritance"; break; case EdgeInfo::Green: t << "protected-inheritance"; break; case EdgeInfo::Red: t << "private-inheritance"; break; @@ -828,17 +778,17 @@ void DotNode::writeDEF(FTextStream &t) const case EdgeInfo::Orange: t << "template-instance"; break; case EdgeInfo::Orange2: t << "type-constraint"; break; case EdgeInfo::Grey: ASSERT(0); break; - } - t << ';' << endl; + } + t << ';' << endl; - if (!edgeInfo->label().isEmpty()) - { - t << " edgelabel = <<_EnD_oF_dEf_TeXt_" << endl - << edgeInfo->label() << endl - << "_EnD_oF_dEf_TeXt_;" << endl; - } - t << " }; /* node-child */" << endl; - } /* for (;childNode...) */ + if (!edgeInfo.label().isEmpty()) + { + t << " edgelabel = <<_EnD_oF_dEf_TeXt_" << endl + << edgeInfo.label() << endl + << "_EnD_oF_dEf_TeXt_;" << endl; + } + t << " }; /* node-child */" << endl; + ++it; } t << " }; /* node */" << endl; } @@ -847,63 +797,31 @@ void DotNode::writeDEF(FTextStream &t) const void DotNode::clearWriteFlag() { m_written=FALSE; - if (m_parents!=0) - { - QListIterator<DotNode> dnlip(*m_parents); - DotNode *pn; - for (dnlip.toFirst();(pn=dnlip.current());++dnlip) - { - if (pn->isWritten()) - { - pn->clearWriteFlag(); - } - } - } - if (m_children!=0) - { - QListIterator<DotNode> dnlic(*m_children); - DotNode *cn; - for (dnlic.toFirst();(cn=dnlic.current());++dnlic) - { - if (cn->isWritten()) - { - cn->clearWriteFlag(); - } - } - } + for (const auto &pn : m_parents) if (pn->isWritten()) pn->clearWriteFlag(); + for (const auto &cn : m_children) if (cn->isWritten()) cn->clearWriteFlag(); } void DotNode::colorConnectedNodes(int curColor) { - if (m_children) + for (const auto &cn : m_children) { - QListIterator<DotNode> dnlic(*m_children); - DotNode *cn; - for (dnlic.toFirst();(cn=dnlic.current());++dnlic) + if (cn->subgraphId()==-1) // uncolored child node { - if (cn->subgraphId()==-1) // uncolored child node - { - cn->setSubgraphId(curColor); - cn->markAsVisible(); - cn->colorConnectedNodes(curColor); - //printf("coloring node %s (%p): %d\n",cn->label().data(),cn,cn->subgraphId()); - } + cn->setSubgraphId(curColor); + cn->markAsVisible(); + cn->colorConnectedNodes(curColor); + //printf("coloring node %s (%p): %d\n",cn->label().data(),cn,cn->subgraphId()); } } - if (m_parents) + for (const auto &pn : m_parents) { - QListIterator<DotNode> dnlip(*m_parents); - DotNode *pn; - for (dnlip.toFirst();(pn=dnlip.current());++dnlip) + if (pn->subgraphId()==-1) // uncolored parent node { - if (pn->subgraphId()==-1) // uncolored parent node - { - pn->setSubgraphId(curColor); - pn->markAsVisible(); - pn->colorConnectedNodes(curColor); - //printf("coloring node %s (%p): %d\n",pn->label().data(),pn,pn->subgraphId()); - } + pn->setSubgraphId(curColor); + pn->markAsVisible(); + pn->colorConnectedNodes(curColor); + //printf("coloring node %s (%p): %d\n",pn->label().data(),pn,pn->subgraphId()); } } } @@ -911,17 +829,12 @@ void DotNode::colorConnectedNodes(int curColor) void DotNode::renumberNodes(int &number) { m_number = number++; - if (m_children) + for (const auto &cn : m_children) { - QListIterator<DotNode> dnlic(*m_children); - DotNode *cn; - for (dnlic.toFirst();(cn=dnlic.current());++dnlic) + if (!cn->isRenumbered()) { - if (!cn->isRenumbered()) - { - cn->markRenumbered(); - cn->renumberNodes(number); - } + cn->markRenumbered(); + cn->renumberNodes(number); } } } @@ -930,43 +843,26 @@ const DotNode *DotNode::findDocNode() const { if (!m_url.isEmpty()) return this; //printf("findDocNode(): '%s'\n",m_label.data()); - if (m_parents) + for (const auto &pn : m_parents) { - QListIterator<DotNode> dnli(*m_parents); - DotNode *pn; - for (dnli.toFirst();(pn=dnli.current());++dnli) + if (!pn->hasDocumentation()) { - if (!pn->hasDocumentation()) - { - pn->markHasDocumentation(); - const DotNode *dn = pn->findDocNode(); - if (dn) return dn; - } + pn->markHasDocumentation(); + const DotNode *dn = pn->findDocNode(); + if (dn) return dn; } } - if (m_children) + for (const auto &cn : m_children) { - QListIterator<DotNode> dnli(*m_children); - DotNode *cn; - for (dnli.toFirst();(cn=dnli.current());++dnli) + if (!cn->hasDocumentation()) { - if (!cn->hasDocumentation()) - { - cn->markHasDocumentation(); - const DotNode *dn = cn->findDocNode(); - if (dn) return dn; - } + cn->markHasDocumentation(); + const DotNode *dn = cn->findDocNode(); + if (dn) return dn; } } return 0; } -//-------------------------------------------------------------- - -int DotNodeList::compareValues(const DotNode *n1,const DotNode *n2) const -{ - return qstricmp(n1->label(),n2->label()); -} - |