summaryrefslogtreecommitdiffstats
path: root/src/dotnode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotnode.cpp')
-rw-r--r--src/dotnode.cpp448
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());
-}
-