summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addon/doxyparse/doxyparse.cpp9
-rw-r--r--doc/doxygen_manual.tex1
-rw-r--r--doc/manual.sty35
-rw-r--r--src/classdef.cpp685
-rw-r--r--src/classdef.h102
-rw-r--r--src/code.l18
-rw-r--r--src/context.cpp79
-rw-r--r--src/context.h13
-rw-r--r--src/defgen.cpp82
-rw-r--r--src/diagram.cpp132
-rw-r--r--src/dotclassgraph.cpp15
-rw-r--r--src/dotgfxhierarchytable.cpp119
-rw-r--r--src/doxygen.cpp14
-rw-r--r--src/index.cpp13
-rw-r--r--src/latexgen.cpp31
-rw-r--r--src/markdown.cpp3
-rw-r--r--src/perlmodgen.cpp28
-rw-r--r--src/searchindex.cpp10
-rw-r--r--src/sqlite3gen.cpp44
-rw-r--r--src/util.cpp70
-rw-r--r--src/util.h4
-rw-r--r--src/vhdldocgen.cpp96
-rw-r--r--src/xmlgen.cpp110
23 files changed, 765 insertions, 948 deletions
diff --git a/addon/doxyparse/doxyparse.cpp b/addon/doxyparse/doxyparse.cpp
index 1637dd0..db05d89 100644
--- a/addon/doxyparse/doxyparse.cpp
+++ b/addon/doxyparse/doxyparse.cpp
@@ -360,13 +360,10 @@ static void classInformation(ClassDef* cd) {
cModule(cd);
} else {
printModule(cd->name().data());
- BaseClassList* baseClasses = cd->baseClasses();
- if (baseClasses) {
+ if (!cd->baseClasses().empty()) {
printInherits();
- BaseClassListIterator bci(*baseClasses);
- BaseClassDef* bcd;
- for (bci.toFirst(); (bcd = bci.current()); ++bci) {
- printInheritance(bcd->classDef->name().data());
+ for (const auto &bcd : cd->baseClasses()) {
+ printInheritance(bcd.classDef->name().data());
}
}
if(cd->isAbstract()) {
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
index 0148379..aacb573 100644
--- a/doc/doxygen_manual.tex
+++ b/doc/doxygen_manual.tex
@@ -171,6 +171,7 @@ Written by Dimitri van Heesch\\[2ex]
\chapter{Perl Module Output}\label{perlmod}\hypertarget{perlmod}{}\input{perlmod}
\chapter{Doxygen's internals}\label{arch}\hypertarget{arch}{}\input{arch}
\renewcommand{\thepart}{}
+\renewcommand{\partname}{}
\part{Appendices}
\appendix
%mean that subinputfrom requires a / at the end of the path
diff --git a/doc/manual.sty b/doc/manual.sty
index 643bd40..fd9fd0e 100644
--- a/doc/manual.sty
+++ b/doc/manual.sty
@@ -8,7 +8,6 @@
% Setup fancy headings
\RequirePackage{fancyhdr}
-\pagestyle{fancyplain}
\newcommand{\clearemptydoublepage}{%
\newpage{\pagestyle{empty}\cleardoublepage}%
}
@@ -18,18 +17,28 @@
\renewcommand{\sectionmark}[1]{%
\markright{\thesection\ #1}%
}
-\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
-\fancyhead[CE]{\fancyplain{}{}}
-\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
-\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
-\fancyhead[CO]{\fancyplain{}{}}
-\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
-\fancyfoot[LE]{\fancyplain{}{}}
-\fancyfoot[CE]{\fancyplain{}{}}
-\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen @VERSION@ }}
-\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen @VERSION@ }}
-\fancyfoot[CO]{\fancyplain{}{}}
-\fancyfoot[RO]{\fancyplain{}{}}
+
+% Headers & footers
+\pagestyle{fancyplain}
+\renewcommand{\footrulewidth}{0.4pt}
+%
+\fancypagestyle{fancyplain}{
+\fancyhf{}
+\fancyhead[LE, RO]{\bfseries\thepage}
+\fancyhead[LO]{\bfseries\rightmark}
+\fancyhead[RE]{\bfseries\leftmark}
+\fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen @VERSION@ }
+}
+%
+\fancypagestyle{plain}{
+\fancyhf{}
+\fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen @VERSION@ }
+\renewcommand{\headrulewidth}{0pt}}
+%
+\pagestyle{fancyplain}
+%
+\usepackage{xpatch}
+\xpatchcmd{\part}{plain}{empty}{}{}
% Define caption that is also suitable in a table
\makeatletter
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 5e2b2fa..e797b05e 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -81,8 +81,10 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
virtual QCString displayName(bool includeScope=TRUE) const;
virtual CompoundType compoundType() const;
virtual QCString compoundTypeString() const;
- virtual BaseClassList *baseClasses() const;
- virtual BaseClassList *subClasses() const;
+ virtual BaseClassList baseClasses() const;
+ virtual void updateBaseClasses(BaseClassList bcd);
+ virtual BaseClassList subClasses() const;
+ virtual void updateSubClasses(BaseClassList bcd);
virtual const MemberNameInfoLinkedMap &memberNameInfoLinkedMap() const;
virtual Protection protection() const;
virtual bool isLinkableInProject() const;
@@ -318,9 +320,9 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
{ return getCdAlias()->compoundType(); }
virtual QCString compoundTypeString() const
{ return getCdAlias()->compoundTypeString(); }
- virtual BaseClassList *baseClasses() const
+ virtual BaseClassList baseClasses() const
{ return getCdAlias()->baseClasses(); }
- virtual BaseClassList *subClasses() const
+ virtual BaseClassList subClasses() const
{ return getCdAlias()->subClasses(); }
virtual const MemberNameInfoLinkedMap &memberNameInfoLinkedMap() const
{ return getCdAlias()->memberNameInfoLinkedMap(); }
@@ -510,6 +512,8 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
virtual void addGroupedInheritedMembers(OutputList &,MemberListType,
const ClassDef *,const QCString &) const {}
virtual void writeTagFile(FTextStream &) {}
+ virtual void updateBaseClasses(BaseClassList) {}
+ virtual void updateSubClasses(BaseClassList) {}
virtual void setVisited(bool visited) const { m_visited = visited; }
virtual bool isVisited() const { return m_visited; }
@@ -567,11 +571,11 @@ class ClassDefImpl::IMPL
/*! List of base class (or super-classes) from which this class derives
* directly.
*/
- BaseClassList *inherits = 0;
+ BaseClassList inherits;
/*! List of sub-classes that directly derive from this class
*/
- BaseClassList *inheritedBy = 0;
+ BaseClassList inheritedBy;
/*! Namespace this class is part of
* (this is the inner most namespace in case of nested namespaces)
@@ -703,8 +707,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
fileName=ctStr+name;
}
exampleSDict = 0;
- inherits = 0;
- inheritedBy = 0;
incInfo=0;
prot=Public;
nspace=0;
@@ -756,8 +758,6 @@ ClassDefImpl::IMPL::IMPL() : vhdlSummaryTitles(17)
ClassDefImpl::IMPL::~IMPL()
{
- delete inherits;
- delete inheritedBy;
delete exampleSDict;
delete usesImplClassDict;
delete usedByImplClassDict;
@@ -855,13 +855,7 @@ void ClassDefImpl::insertBaseClass(ClassDef *cd,const char *n,Protection p,
Specifier s,const char *t)
{
//printf("*** insert base class %s into %s\n",cd->name().data(),name().data());
- //inherits->inSort(new BaseClassDef(cd,p,s,t));
- if (m_impl->inherits==0)
- {
- m_impl->inherits = new BaseClassList;
- m_impl->inherits->setAutoDelete(TRUE);
- }
- m_impl->inherits->append(new BaseClassDef(cd,n,p,s,t));
+ m_impl->inherits.push_back(BaseClassDef(cd,n,p,s,t));
m_impl->isSimple = FALSE;
}
@@ -872,12 +866,7 @@ void ClassDefImpl::insertSubClass(ClassDef *cd,Protection p,
//printf("*** insert sub class %s into %s\n",cd->name().data(),name().data());
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
if (!extractPrivate && cd->protection()==Private) return;
- if (m_impl->inheritedBy==0)
- {
- m_impl->inheritedBy = new BaseClassList;
- m_impl->inheritedBy->setAutoDelete(TRUE);
- }
- m_impl->inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t));
+ m_impl->inheritedBy.push_back(BaseClassDef(cd,0,p,s,t));
m_impl->isSimple = FALSE;
}
@@ -1287,22 +1276,22 @@ void ClassDefImpl::insertUsedFile(FileDef *fd)
}
}
-static void writeInheritanceSpecifier(OutputList &ol,BaseClassDef *bcd)
+static void writeInheritanceSpecifier(OutputList &ol,const BaseClassDef &bcd)
{
- if (bcd->prot!=Public || bcd->virt!=Normal)
+ if (bcd.prot!=Public || bcd.virt!=Normal)
{
ol.startTypewriter();
ol.docify(" [");
- QStrList sl;
- if (bcd->prot==Protected) sl.append("protected");
- else if (bcd->prot==Private) sl.append("private");
- if (bcd->virt==Virtual) sl.append("virtual");
- const char *s=sl.first();
- while (s)
+ StringVector sl;
+ if (bcd.prot==Protected) sl.push_back("protected");
+ else if (bcd.prot==Private) sl.push_back("private");
+ if (bcd.virt==Virtual) sl.push_back("virtual");
+ bool first=true;
+ for (const auto &s : sl)
{
- ol.docify(s);
- s=sl.next();
- if (s) ol.docify(", ");
+ if (!first) ol.docify(", ");
+ ol.docify(s.c_str());
+ first=false;
}
ol.docify("]");
ol.endTypewriter();
@@ -1660,24 +1649,15 @@ void ClassDefImpl::showUsedFiles(OutputList &ol) const
int ClassDefImpl::countInheritanceNodes() const
{
int count=0;
- BaseClassDef *ibcd;
- if (m_impl->inheritedBy)
+ for (const auto &ibcd : m_impl->inheritedBy)
{
- BaseClassListIterator it(*m_impl->inheritedBy);
- for (;(ibcd=it.current());++it)
- {
- ClassDef *icd=ibcd->classDef;
- if ( icd->isVisibleInHierarchy()) count++;
- }
+ const ClassDef *icd=ibcd.classDef;
+ if ( icd->isVisibleInHierarchy()) count++;
}
- if (m_impl->inherits)
+ for (const auto &ibcd : m_impl->inherits)
{
- BaseClassListIterator it(*m_impl->inherits);
- for (;(ibcd=it.current());++it)
- {
- ClassDef *icd=ibcd->classDef;
- if ( icd->isVisibleInHierarchy()) count++;
- }
+ const ClassDef *icd=ibcd.classDef;
+ if ( icd->isVisibleInHierarchy()) count++;
}
return count;
}
@@ -1727,12 +1707,12 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
ol.disableAllBut(OutputGenerator::Man);
}
- if (m_impl->inherits && m_impl->inherits->count()>0)
+ if (!m_impl->inherits.empty())
{
ol.startParagraph();
//parseText(ol,theTranslator->trInherits()+" ");
- QCString inheritLine = theTranslator->trInheritsList((int)m_impl->inherits->count());
+ QCString inheritLine = theTranslator->trInheritsList((int)m_impl->inherits.size());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
@@ -1741,15 +1721,15 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
ol.parseText(inheritLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- BaseClassDef *bcd=m_impl->inherits->at(entryIndex);
- if (ok && bcd)
+ BaseClassDef &bcd=m_impl->inherits.at(entryIndex);
+ if (ok)
{
- ClassDef *cd=bcd->classDef;
+ ClassDef *cd=bcd.classDef;
// use the class name but with the template arguments as given
// in the inheritance relation
QCString displayName = insertTemplateSpecifierInScope(
- cd->displayName(),bcd->templSpecifiers);
+ cd->displayName(),bcd.templSpecifiers);
if (cd->isLinkable())
{
@@ -1774,10 +1754,10 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
}
// write subclasses
- if (m_impl->inheritedBy && m_impl->inheritedBy->count()>0)
+ if (!m_impl->inheritedBy.empty())
{
ol.startParagraph();
- QCString inheritLine = theTranslator->trInheritedByList((int)m_impl->inheritedBy->count());
+ QCString inheritLine = theTranslator->trInheritedByList((int)m_impl->inheritedBy.size());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
@@ -1786,10 +1766,10 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
ol.parseText(inheritLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- BaseClassDef *bcd=m_impl->inheritedBy->at(entryIndex);
- if (ok && bcd)
+ BaseClassDef &bcd=m_impl->inheritedBy.at(entryIndex);
+ if (ok)
{
- ClassDef *cd=bcd->classDef;
+ ClassDef *cd=bcd.classDef;
if (cd->isLinkable())
{
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),cd->anchor(),cd->displayName());
@@ -1935,35 +1915,30 @@ void ClassDefImpl::writeIncludeFilesForSlice(OutputList &ol) const
ol.docify("class ");
}
ol.docify(stripScope(name()));
- if (m_impl->inherits)
+ if (!m_impl->inherits.empty())
{
if (m_impl->spec & (Entry::Interface|Entry::Exception))
{
ol.docify(" extends ");
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (;(ibcd=it.current());++it)
+ bool first=true;
+ for (const auto &ibcd : m_impl->inherits)
{
- ClassDef *icd = ibcd->classDef;
+ if (!first) ol.docify(", ");
+ ClassDef *icd = ibcd.classDef;
ol.docify(icd->name());
- if (!it.atLast())
- {
- ol.docify(", ");
- }
+ first=false;
}
}
else
{
// Must be a class.
- bool implements = FALSE;
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (;(ibcd=it.current());++it)
+ bool implements = false;
+ for (const auto &ibcd : m_impl->inherits)
{
- ClassDef *icd = ibcd->classDef;
+ ClassDef *icd = ibcd.classDef;
if (icd->isInterface())
{
- implements = TRUE;
+ implements = true;
}
else
{
@@ -1974,20 +1949,14 @@ void ClassDefImpl::writeIncludeFilesForSlice(OutputList &ol) const
if (implements)
{
ol.docify(" implements ");
- bool first = TRUE;
- for (ibcd=it.toFirst();(ibcd=it.current());++it)
+ bool first = true;
+ for (const auto &ibcd : m_impl->inherits)
{
- ClassDef *icd = ibcd->classDef;
+ ClassDef *icd = ibcd.classDef;
if (icd->isInterface())
{
- if (!first)
- {
- ol.docify(", ");
- }
- else
- {
- first = FALSE;
- }
+ if (!first) ol.docify(", ");
+ first = false;
ol.docify(icd->name());
}
}
@@ -2223,32 +2192,27 @@ void ClassDefImpl::writeTagFile(FTextStream &tagFile)
{
tagFile << " <templarg>" << convertToXML(a.name) << "</templarg>" << endl;
}
- if (m_impl->inherits)
+ for (const auto &ibcd : m_impl->inherits)
{
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (it.toFirst();(ibcd=it.current());++it)
+ ClassDef *cd=ibcd.classDef;
+ if (cd && cd->isLinkable())
{
- ClassDef *cd=ibcd->classDef;
- if (cd && cd->isLinkable())
+ if (!Config_getString(GENERATE_TAGFILE).isEmpty())
{
- if (!Config_getString(GENERATE_TAGFILE).isEmpty())
+ tagFile << " <base";
+ if (ibcd.prot==Protected)
{
- tagFile << " <base";
- if (ibcd->prot==Protected)
- {
- tagFile << " protection=\"protected\"";
- }
- else if (ibcd->prot==Private)
- {
- tagFile << " protection=\"private\"";
- }
- if (ibcd->virt==Virtual)
- {
- tagFile << " virtualness=\"virtual\"";
- }
- tagFile << ">" << convertToXML(cd->name()) << "</base>" << endl;
+ tagFile << " protection=\"protected\"";
+ }
+ else if (ibcd.prot==Private)
+ {
+ tagFile << " protection=\"private\"";
}
+ if (ibcd.virt==Virtual)
+ {
+ tagFile << " virtualness=\"virtual\"";
+ }
+ tagFile << ">" << convertToXML(cd->name()) << "</base>" << endl;
}
}
}
@@ -3338,29 +3302,29 @@ bool ClassDefImpl::hasNonReferenceSuperClass() const
{
return TRUE; // we're done if this class is not a reference
}
- if (m_impl->inheritedBy)
+ for (const auto &ibcd : m_impl->inheritedBy)
{
- BaseClassListIterator bcli(*m_impl->inheritedBy);
- for ( ; bcli.current() && !found ; ++bcli ) // for each super class
+ ClassDef *bcd=ibcd.classDef;
+ // recurse into the super class branch
+ found = found || bcd->hasNonReferenceSuperClass();
+ if (!found)
{
- ClassDef *bcd=bcli.current()->classDef;
- // recurse into the super class branch
- found = found || bcd->hasNonReferenceSuperClass();
- if (!found)
+ // look for template instances that might have non-reference super classes
+ QDict<ClassDef> *cil = bcd->getTemplateInstances();
+ if (cil)
{
- // look for template instances that might have non-reference super classes
- QDict<ClassDef> *cil = bcd->getTemplateInstances();
- if (cil)
+ QDictIterator<ClassDef> tidi(*cil);
+ for ( ; tidi.current() && !found ; ++tidi) // for each template instance
{
- QDictIterator<ClassDef> tidi(*cil);
- for ( ; tidi.current() && !found ; ++tidi) // for each template instance
- {
- // recurse into the template instance branch
- found = found || tidi.current()->hasNonReferenceSuperClass();
- }
+ // recurse into the template instance branch
+ found = found || tidi.current()->hasNonReferenceSuperClass();
}
}
}
+ else
+ {
+ break;
+ }
}
return found;
}
@@ -3497,21 +3461,12 @@ bool ClassDefImpl::isBaseClass(const ClassDef *bcd, bool followInstances,int lev
err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name()));
return FALSE;
}
- if (baseClasses())
+ for (const auto &bclass : baseClasses())
{
- // Beware: trying to optimise the iterator away using ->first() & ->next()
- // causes bug 625531
- BaseClassListIterator bcli(*baseClasses());
- for ( ; bcli.current() && !found ; ++bcli)
- {
- const ClassDef *ccd=bcli.current()->classDef;
- if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
- //printf("isBaseClass() baseclass %s\n",ccd->name().data());
- if (ccd==bcd)
- found=TRUE;
- else
- found=ccd->isBaseClass(bcd,followInstances,level+1);
- }
+ const ClassDef *ccd = bclass.classDef;
+ if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
+ found = (ccd==bcd) || ccd->isBaseClass(bcd,followInstances,level+1);
+ if (found) break;
}
return found;
}
@@ -3526,17 +3481,11 @@ bool ClassDefImpl::isSubClass(ClassDef *cd,int level) const
err("Possible recursive class relation while inside %s and looking for derived class %s\n",qPrint(name()),qPrint(cd->name()));
return FALSE;
}
- if (subClasses())
+ for (const auto &iscd : subClasses())
{
- BaseClassListIterator bcli(*subClasses());
- for ( ; bcli.current() && !found ; ++bcli)
- {
- ClassDef *ccd=bcli.current()->classDef;
- if (ccd==cd)
- found=TRUE;
- else
- found=ccd->isSubClass(cd,level+1);
- }
+ ClassDef *ccd=iscd.classDef;
+ found = (ccd==cd) || ccd->isSubClass(cd,level+1);
+ if (found) break;
}
return found;
}
@@ -3569,212 +3518,206 @@ void ClassDefImpl::mergeMembers()
//printf(" mergeMembers for %s\n",name().data());
static bool inlineInheritedMembers = Config_getBool(INLINE_INHERITED_MEMB);
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
- if (baseClasses())
+ for (const auto &bcd : baseClasses())
{
- //printf(" => has base classes!\n");
- BaseClassListIterator bcli(*baseClasses());
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
- {
- ClassDef *bClass=bcd->classDef;
+ ClassDef *bClass=bcd.classDef;
- // merge the members in the base class of this inheritance branch first
- bClass->mergeMembers();
+ // merge the members in the base class of this inheritance branch first
+ bClass->mergeMembers();
- const MemberNameInfoLinkedMap &srcMnd = bClass->memberNameInfoLinkedMap();
- MemberNameInfoLinkedMap &dstMnd = m_impl->allMemberNameInfoLinkedMap;
+ const MemberNameInfoLinkedMap &srcMnd = bClass->memberNameInfoLinkedMap();
+ MemberNameInfoLinkedMap &dstMnd = m_impl->allMemberNameInfoLinkedMap;
- for (auto &srcMni : srcMnd)
+ for (auto &srcMni : srcMnd)
+ {
+ //printf(" Base member name %s\n",srcMni->memberName());
+ MemberNameInfo *dstMni;
+ if ((dstMni=dstMnd.find(srcMni->memberName())))
+ // a member with that name is already in the class.
+ // the member may hide or reimplement the one in the sub class
+ // or there may be another path to the base class that is already
+ // visited via another branch in the class hierarchy.
{
- //printf(" Base member name %s\n",srcMni->memberName());
- MemberNameInfo *dstMni;
- if ((dstMni=dstMnd.find(srcMni->memberName())))
- // a member with that name is already in the class.
- // the member may hide or reimplement the one in the sub class
- // or there may be another path to the base class that is already
- // visited via another branch in the class hierarchy.
+ for (auto &srcMi : *srcMni)
{
- for (auto &srcMi : *srcMni)
+ MemberDef *srcMd = srcMi->memberDef();
+ bool found=FALSE;
+ bool ambiguous=FALSE;
+ bool hidden=FALSE;
+ const ClassDef *srcCd = srcMd->getClassDef();
+ for (auto &dstMi : *dstMni)
{
- MemberDef *srcMd = srcMi->memberDef();
- bool found=FALSE;
- bool ambiguous=FALSE;
- bool hidden=FALSE;
- const ClassDef *srcCd = srcMd->getClassDef();
- for (auto &dstMi : *dstMni)
+ MemberDef *dstMd = dstMi->memberDef();
+ if (srcMd!=dstMd) // different members
{
- MemberDef *dstMd = dstMi->memberDef();
- if (srcMd!=dstMd) // different members
+ const ClassDef *dstCd = dstMd->getClassDef();
+ //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data());
+ if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE))
+ // member is in the same or a base class
{
- const ClassDef *dstCd = dstMd->getClassDef();
- //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data());
- if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE))
- // member is in the same or a base class
- {
- ArgumentList &srcAl = srcMd->argumentList();
- ArgumentList &dstAl = dstMd->argumentList();
- found=matchArguments2(
- srcMd->getOuterScope(),srcMd->getFileDef(),&srcAl,
- dstMd->getOuterScope(),dstMd->getFileDef(),&dstAl,
- TRUE
- );
- //printf(" Yes, matching (%s<->%s): %d\n",
- // argListToString(srcMd->argumentList()).data(),
- // argListToString(dstMd->argumentList()).data(),
- // found);
- hidden = hidden || !found;
- }
- else // member is in a non base class => multiple inheritance
- // using the same base class.
- {
- //printf("$$ Existing member %s %s add scope %s\n",
- // dstMi->ambiguityResolutionScope.data(),
- // dstMd->name().data(),
- // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
-
- QCString scope=dstMi->scopePath().left((uint)dstMi->scopePath().find(sep)+sepLen);
- if (scope!=dstMi->ambiguityResolutionScope().left(scope.length()))
- {
- dstMi->setAmbiguityResolutionScope(scope+dstMi->ambiguityResolutionScope());
- }
- ambiguous=TRUE;
- }
+ ArgumentList &srcAl = srcMd->argumentList();
+ ArgumentList &dstAl = dstMd->argumentList();
+ found=matchArguments2(
+ srcMd->getOuterScope(),srcMd->getFileDef(),&srcAl,
+ dstMd->getOuterScope(),dstMd->getFileDef(),&dstAl,
+ TRUE
+ );
+ //printf(" Yes, matching (%s<->%s): %d\n",
+ // argListToString(srcMd->argumentList()).data(),
+ // argListToString(dstMd->argumentList()).data(),
+ // found);
+ hidden = hidden || !found;
}
- else // same members
+ else // member is in a non base class => multiple inheritance
+ // using the same base class.
{
- // do not add if base class is virtual or
- // if scope paths are equal or
- // if base class is an interface (and thus implicitly virtual).
- //printf("same member found srcMi->virt=%d dstMi->virt=%d\n",srcMi->virt,dstMi->virt);
- if ((srcMi->virt()!=Normal && dstMi->virt()!=Normal) ||
- bClass->name()+sep+srcMi->scopePath() == dstMi->scopePath() ||
- dstMd->getClassDef()->compoundType()==Interface
- )
- {
- found=TRUE;
- }
- else // member can be reached via multiple paths in the
- // inheritance tree
+ //printf("$$ Existing member %s %s add scope %s\n",
+ // dstMi->ambiguityResolutionScope.data(),
+ // dstMd->name().data(),
+ // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
+
+ QCString scope=dstMi->scopePath().left((uint)dstMi->scopePath().find(sep)+sepLen);
+ if (scope!=dstMi->ambiguityResolutionScope().left(scope.length()))
{
- //printf("$$ Existing member %s %s add scope %s\n",
- // dstMi->ambiguityResolutionScope.data(),
- // dstMd->name().data(),
- // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
-
- QCString scope=dstMi->scopePath().left((uint)dstMi->scopePath().find(sep)+sepLen);
- if (scope!=dstMi->ambiguityResolutionScope().left(scope.length()))
- {
- dstMi->setAmbiguityResolutionScope(dstMi->ambiguityResolutionScope()+scope);
- }
- ambiguous=TRUE;
+ dstMi->setAmbiguityResolutionScope(scope+dstMi->ambiguityResolutionScope());
}
+ ambiguous=TRUE;
}
- if (found) break;
}
- //printf("member %s::%s hidden %d ambiguous %d srcMi->ambigClass=%p\n",
- // srcCd->name().data(),srcMd->name().data(),hidden,ambiguous,srcMi->ambigClass);
-
- // TODO: fix the case where a member is hidden by inheritance
- // of a member with the same name but with another prototype,
- // while there is more than one path to the member in the
- // base class due to multiple inheritance. In this case
- // it seems that the member is not reachable by prefixing a
- // scope name either (according to my compiler). Currently,
- // this case is shown anyway.
- if (!found && srcMd->protection()!=Private && !srcMd->isFriend())
+ else // same members
{
- Protection prot=srcMd->protection();
- if (bcd->prot==Protected && prot==Public) prot=bcd->prot;
- else if (bcd->prot==Private) prot=bcd->prot;
-
- if (inlineInheritedMembers)
+ // do not add if base class is virtual or
+ // if scope paths are equal or
+ // if base class is an interface (and thus implicitly virtual).
+ //printf("same member found srcMi->virt=%d dstMi->virt=%d\n",srcMi->virt,dstMi->virt);
+ if ((srcMi->virt()!=Normal && dstMi->virt()!=Normal) ||
+ bClass->name()+sep+srcMi->scopePath() == dstMi->scopePath() ||
+ dstMd->getClassDef()->compoundType()==Interface
+ )
{
- if (!isStandardFunc(srcMd))
- {
- //printf(" insertMember '%s'\n",srcMd->name().data());
- internalInsertMember(srcMd,prot,FALSE);
- }
+ found=TRUE;
}
-
- Specifier virt=srcMi->virt();
- if (virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
-
- std::unique_ptr<MemberInfo> newMi = std::make_unique<MemberInfo>(srcMd,prot,virt,TRUE);
- newMi->setScopePath(bClass->name()+sep+srcMi->scopePath());
- if (ambiguous)
+ else // member can be reached via multiple paths in the
+ // inheritance tree
{
- //printf("$$ New member %s %s add scope %s::\n",
- // srcMi->ambiguityResolutionScope.data(),
- // srcMd->name().data(),
- // bClass->name().data());
+ //printf("$$ Existing member %s %s add scope %s\n",
+ // dstMi->ambiguityResolutionScope.data(),
+ // dstMd->name().data(),
+ // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
- QCString scope=bClass->name()+sep;
- if (scope!=srcMi->ambiguityResolutionScope().left(scope.length()))
+ QCString scope=dstMi->scopePath().left((uint)dstMi->scopePath().find(sep)+sepLen);
+ if (scope!=dstMi->ambiguityResolutionScope().left(scope.length()))
{
- newMi->setAmbiguityResolutionScope(scope+srcMi->ambiguityResolutionScope());
+ dstMi->setAmbiguityResolutionScope(dstMi->ambiguityResolutionScope()+scope);
}
+ ambiguous=TRUE;
}
- if (hidden)
+ }
+ if (found) break;
+ }
+ //printf("member %s::%s hidden %d ambiguous %d srcMi->ambigClass=%p\n",
+ // srcCd->name().data(),srcMd->name().data(),hidden,ambiguous,srcMi->ambigClass);
+
+ // TODO: fix the case where a member is hidden by inheritance
+ // of a member with the same name but with another prototype,
+ // while there is more than one path to the member in the
+ // base class due to multiple inheritance. In this case
+ // it seems that the member is not reachable by prefixing a
+ // scope name either (according to my compiler). Currently,
+ // this case is shown anyway.
+ if (!found && srcMd->protection()!=Private && !srcMd->isFriend())
+ {
+ Protection prot=srcMd->protection();
+ if (bcd.prot==Protected && prot==Public) prot=bcd.prot;
+ else if (bcd.prot==Private) prot=bcd.prot;
+
+ if (inlineInheritedMembers)
+ {
+ if (!isStandardFunc(srcMd))
{
- if (srcMi->ambigClass()==0)
- {
- newMi->setAmbigClass(bClass);
- newMi->setAmbiguityResolutionScope(bClass->name()+sep);
- }
- else
- {
- newMi->setAmbigClass(srcMi->ambigClass());
- newMi->setAmbiguityResolutionScope(srcMi->ambigClass()->name()+sep);
- }
+ //printf(" insertMember '%s'\n",srcMd->name().data());
+ internalInsertMember(srcMd,prot,FALSE);
}
- dstMni->push_back(std::move(newMi));
}
- }
- }
- else // base class has a member that is not in the sub class => copy
- {
- // create a deep copy of the list (only the MemberInfo's will be
- // copied, not the actual MemberDef's)
- MemberNameInfo *newMni = dstMnd.add(srcMni->memberName());
- // copy the member(s) from the base to the sub class
- for (auto &mi : *srcMni)
- {
- if (!mi->memberDef()->isFriend()) // don't inherit friends
+ Specifier virt=srcMi->virt();
+ if (virt==Normal && bcd.virt!=Normal) virt=bcd.virt;
+
+ std::unique_ptr<MemberInfo> newMi = std::make_unique<MemberInfo>(srcMd,prot,virt,TRUE);
+ newMi->setScopePath(bClass->name()+sep+srcMi->scopePath());
+ if (ambiguous)
{
- Protection prot = mi->prot();
- if (bcd->prot==Protected)
+ //printf("$$ New member %s %s add scope %s::\n",
+ // srcMi->ambiguityResolutionScope.data(),
+ // srcMd->name().data(),
+ // bClass->name().data());
+
+ QCString scope=bClass->name()+sep;
+ if (scope!=srcMi->ambiguityResolutionScope().left(scope.length()))
{
- if (prot==Public) prot=Protected;
+ newMi->setAmbiguityResolutionScope(scope+srcMi->ambiguityResolutionScope());
}
- else if (bcd->prot==Private)
+ }
+ if (hidden)
+ {
+ if (srcMi->ambigClass()==0)
{
- prot=Private;
+ newMi->setAmbigClass(bClass);
+ newMi->setAmbiguityResolutionScope(bClass->name()+sep);
}
- //printf("%s::%s: prot=%d bcd->prot=%d result=%d\n",
- // name().data(),mi->memberDef->name().data(),mi->prot,
- // bcd->prot,prot);
-
- if (prot!=Private || extractPrivate)
+ else
{
- Specifier virt=mi->virt();
- if (virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
+ newMi->setAmbigClass(srcMi->ambigClass());
+ newMi->setAmbiguityResolutionScope(srcMi->ambigClass()->name()+sep);
+ }
+ }
+ dstMni->push_back(std::move(newMi));
+ }
+ }
+ }
+ else // base class has a member that is not in the sub class => copy
+ {
+ // create a deep copy of the list (only the MemberInfo's will be
+ // copied, not the actual MemberDef's)
+ MemberNameInfo *newMni = dstMnd.add(srcMni->memberName());
+
+ // copy the member(s) from the base to the sub class
+ for (auto &mi : *srcMni)
+ {
+ if (!mi->memberDef()->isFriend()) // don't inherit friends
+ {
+ Protection prot = mi->prot();
+ if (bcd.prot==Protected)
+ {
+ if (prot==Public) prot=Protected;
+ }
+ else if (bcd.prot==Private)
+ {
+ prot=Private;
+ }
+ //printf("%s::%s: prot=%d bcd.prot=%d result=%d\n",
+ // name().data(),mi->memberDef->name().data(),mi->prot,
+ // bcd.prot,prot);
+
+ if (prot!=Private || extractPrivate)
+ {
+ Specifier virt=mi->virt();
+ if (virt==Normal && bcd.virt!=Normal) virt=bcd.virt;
- if (inlineInheritedMembers)
+ if (inlineInheritedMembers)
+ {
+ if (!isStandardFunc(mi->memberDef()))
{
- if (!isStandardFunc(mi->memberDef()))
- {
- //printf(" insertMember '%s'\n",mi->memberDef->name().data());
- internalInsertMember(mi->memberDef(),prot,FALSE);
- }
+ //printf(" insertMember '%s'\n",mi->memberDef->name().data());
+ internalInsertMember(mi->memberDef(),prot,FALSE);
}
- //printf("Adding!\n");
- std::unique_ptr<MemberInfo> newMi = std::make_unique<MemberInfo>(mi->memberDef(),prot,virt,TRUE);
- newMi->setScopePath(bClass->name()+sep+mi->scopePath());
- newMi->setAmbigClass(mi->ambigClass());
- newMi->setAmbiguityResolutionScope(mi->ambiguityResolutionScope());
- newMni->push_back(std::move(newMi));
}
+ //printf("Adding!\n");
+ std::unique_ptr<MemberInfo> newMi = std::make_unique<MemberInfo>(mi->memberDef(),prot,virt,TRUE);
+ newMi->setScopePath(bClass->name()+sep+mi->scopePath());
+ newMi->setAmbigClass(mi->ambigClass());
+ newMi->setAmbiguityResolutionScope(mi->ambiguityResolutionScope());
+ newMni->push_back(std::move(newMi));
}
}
}
@@ -3803,28 +3746,20 @@ void ClassDefImpl::mergeCategory(ClassDef *category)
category->setArtificial(TRUE);
// copy base classes/protocols from extension
- if (category->baseClasses())
+ for (const auto &bcd : category->baseClasses())
{
- BaseClassListIterator bcli(*category->baseClasses());
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
+ insertBaseClass(bcd.classDef,bcd.usedName,bcd.prot,bcd.virt,bcd.templSpecifiers);
+ // correct bcd.classDef so that they do no longer derive from
+ // category, but from this class!
+ BaseClassList scl = bcd.classDef->subClasses();
+ for (auto &scd : scl)
{
- insertBaseClass(bcd->classDef,bcd->usedName,bcd->prot,bcd->virt,bcd->templSpecifiers);
- // correct bcd->classDef so that they do no longer derive from
- // category, but from this class!
- if (bcd->classDef->subClasses())
+ if (scd.classDef==category)
{
- BaseClassListIterator scli(*bcd->classDef->subClasses());
- BaseClassDef *scd;
- for ( ; (scd=scli.current()) ; ++scli )
- {
- if (scd->classDef==category)
- {
- scd->classDef=this;
- }
- }
+ scd.classDef=this;
}
}
+ bcd.classDef->updateSubClasses(scl);
}
}
// make methods private for categories defined in the .m file
@@ -4537,26 +4472,21 @@ int ClassDefImpl::countInheritedDecMembers(MemberListType lt,
// name().data(),lt,process,count,invert);
if ((process^invert) || showAlways)
{
- if (m_impl->inherits)
+ for (const auto &ibcd : m_impl->inherits)
{
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (it.toFirst();(ibcd=it.current());++it)
+ ClassDef *icd=ibcd.classDef;
+ int lt1,lt2;
+ if (icd->isLinkable())
{
- ClassDef *icd=ibcd->classDef;
- int lt1,lt2;
- if (icd->isLinkable())
+ convertProtectionLevel(lt,ibcd.prot,&lt1,&lt2);
+ //printf("%s: convert %d->(%d,%d) prot=%d\n",
+ // icd->name().data(),lt,lt1,lt2,ibcd->prot);
+ if (visitedClasses->find(icd)==0)
{
- convertProtectionLevel(lt,ibcd->prot,&lt1,&lt2);
- //printf("%s: convert %d->(%d,%d) prot=%d\n",
- // icd->name().data(),lt,lt1,lt2,ibcd->prot);
- if (visitedClasses->find(icd)==0)
+ visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
+ if (lt1!=-1)
{
- visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
- if (lt1!=-1)
- {
- inhCount+=icd->countMemberDeclarations((MemberListType)lt1,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
- }
+ inhCount+=icd->countMemberDeclarations((MemberListType)lt1,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
}
}
}
@@ -4678,36 +4608,31 @@ void ClassDefImpl::writeInheritedMemberDeclarations(OutputList &ol,
// name().data(),lt,process,invert,showAlways);
if ((process^invert) || showAlways)
{
- if (m_impl->inherits)
+ for (const auto &ibcd : m_impl->inherits)
{
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (it.toFirst();(ibcd=it.current());++it)
+ ClassDef *icd=ibcd.classDef;
+ if (icd->isLinkable())
{
- ClassDef *icd=ibcd->classDef;
- if (icd->isLinkable())
+ int lt1,lt3;
+ convertProtectionLevel(lt,ibcd.prot,&lt1,&lt3);
+ if (lt2==-1 && lt3!=-1)
{
- int lt1,lt3;
- convertProtectionLevel(lt,ibcd->prot,&lt1,&lt3);
- if (lt2==-1 && lt3!=-1)
- {
- lt2=lt3;
- }
- //printf("%s:convert %d->(%d,%d) prot=%d\n",icd->name().data(),lt,lt1,lt2,ibcd->prot);
- if (visitedClasses->find(icd)==0)
- {
- visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
- if (lt1!=-1)
- {
- icd->writeMemberDeclarations(ol,(MemberListType)lt1,
- title,QCString(),FALSE,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
- }
- }
- else
+ lt2=lt3;
+ }
+ //printf("%s:convert %d->(%d,%d) prot=%d\n",icd->name().data(),lt,lt1,lt2,ibcd->prot);
+ if (visitedClasses->find(icd)==0)
+ {
+ visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
+ if (lt1!=-1)
{
- //printf("%s: class already visited!\n",icd->name().data());
+ icd->writeMemberDeclarations(ol,(MemberListType)lt1,
+ title,QCString(),FALSE,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
}
}
+ else
+ {
+ //printf("%s: class already visited!\n",icd->name().data());
+ }
}
}
}
@@ -4822,16 +4747,26 @@ ClassDefImpl::CompoundType ClassDefImpl::compoundType() const
return m_impl->compType;
}
-BaseClassList *ClassDefImpl::baseClasses() const
+BaseClassList ClassDefImpl::baseClasses() const
{
return m_impl->inherits;
}
-BaseClassList *ClassDefImpl::subClasses() const
+void ClassDefImpl::updateBaseClasses(BaseClassList bcd)
+{
+ m_impl->inherits = bcd;
+}
+
+BaseClassList ClassDefImpl::subClasses() const
{
return m_impl->inheritedBy;
}
+void ClassDefImpl::updateSubClasses(BaseClassList bcd)
+{
+ m_impl->inheritedBy = bcd;
+}
+
const MemberNameInfoLinkedMap &ClassDefImpl::memberNameInfoLinkedMap() const
{
return m_impl->allMemberNameInfoLinkedMap;
diff --git a/src/classdef.h b/src/classdef.h
index d413794..bd06323 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -37,7 +37,6 @@ class ClassSDict;
class OutputList;
class FileDef;
class FileList;
-class BaseClassList;
class NamespaceDef;
class MemberDef;
class ExampleSDict;
@@ -52,6 +51,38 @@ class StringDict;
struct IncludeInfo;
class ClassDefImpl;
class FTextStream;
+class ClassDef;
+
+/** Class that contains information about an inheritance relation.
+ */
+struct BaseClassDef
+{
+ BaseClassDef(ClassDef *cd,const char *n,Protection p, Specifier v,const char *t) :
+ classDef(cd), usedName(n), prot(p), virt(v), templSpecifiers(t) {}
+
+ /** Class definition that this relation inherits from. */
+ ClassDef *classDef;
+
+ /** name used in the inheritance list
+ * (may be a typedef name instead of the class name)
+ */
+ QCString usedName;
+
+ /** Protection level of the inheritance relation:
+ * Public, Protected, or Private
+ */
+ Protection prot;
+
+ /** Virtualness of the inheritance relation:
+ * Normal, or Virtual
+ */
+ Specifier virt;
+
+ /** Template arguments used for the base class */
+ QCString templSpecifiers;
+};
+
+using BaseClassList = std::vector<BaseClassDef>;
/** A abstract class representing of a compound symbol.
*
@@ -126,11 +157,17 @@ class ClassDef : virtual public Definition
/** Returns the list of base classes from which this class directly
* inherits.
*/
- virtual BaseClassList *baseClasses() const = 0;
+ virtual BaseClassList baseClasses() const = 0;
+
+ /** Update the list of base classes to the one passed */
+ virtual void updateBaseClasses(BaseClassList bcd) = 0;
/** Returns the list of sub classes that directly derive from this class
*/
- virtual BaseClassList *subClasses() const = 0;
+ virtual BaseClassList subClasses() const = 0;
+
+ /** Update the list of sub classes to the one passed */
+ virtual void updateSubClasses(BaseClassList bcd) = 0;
/** Returns a dictionary of all members. This includes any inherited
* members. Members are sorted alphabetically.
@@ -480,65 +517,6 @@ class UsesClassDictIterator : public QDictIterator<UsesClassDef>
//------------------------------------------------------------------------
-/** Class that contains information about an inheritance relation.
- */
-struct BaseClassDef
-{
- BaseClassDef(ClassDef *cd,const char *n,Protection p, Specifier v,const char *t) :
- classDef(cd), usedName(n), prot(p), virt(v), templSpecifiers(t) {}
-
- /** Class definition that this relation inherits from. */
- ClassDef *classDef;
-
- /** name used in the inheritance list
- * (may be a typedef name instead of the class name)
- */
- QCString usedName;
-
- /** Protection level of the inheritance relation:
- * Public, Protected, or Private
- */
- Protection prot;
-
- /** Virtualness of the inheritance relation:
- * Normal, or Virtual
- */
- Specifier virt;
-
- /** Template arguments used for the base class */
- QCString templSpecifiers;
-};
-
-/** List of base classes.
- *
- * The classes are alphabetically sorted on name if inSort() is used.
- */
-class BaseClassList : public QList<BaseClassDef>
-{
- public:
- ~BaseClassList() {}
- int compareValues(const BaseClassDef *item1,const BaseClassDef *item2) const
- {
- const ClassDef *c1=item1->classDef;
- const ClassDef *c2=item2->classDef;
- if (c1==0 || c2==0)
- return FALSE;
- else
- return qstricmp(c1->name(),c2->name());
- }
-};
-
-/** Iterator for a list of base classes.
- */
-class BaseClassListIterator : public QListIterator<BaseClassDef>
-{
- public:
- BaseClassListIterator(const BaseClassList &bcl) :
- QListIterator<BaseClassDef>(bcl) {}
-};
-
-//------------------------------------------------------------------------
-
/** Class that contains information about a type constraint relations.
*/
diff --git a/src/code.l b/src/code.l
index 77b55dd..dbdaa98 100644
--- a/src/code.l
+++ b/src/code.l
@@ -2462,7 +2462,7 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
const char *text)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
+ bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
{
std::lock_guard<std::mutex> lock(g_tooltipMutex);
TooltipManager::instance()->addTooltip(d);
@@ -3502,20 +3502,14 @@ static void writeObjCMethodCall(yyscan_t yyscanner,ObjCCallCtx *ctx)
{
cd = cd->categoryOf();
}
- const BaseClassList *bcd = cd->baseClasses();
- if (bcd) // get direct base class (there should be only one)
+ for (const auto &bclass : cd->baseClasses())
{
- BaseClassListIterator bli(*bcd);
- BaseClassDef *bclass;
- for (bli.toFirst();(bclass=bli.current());++bli)
+ if (bclass.classDef->compoundType()!=ClassDef::Protocol)
{
- if (bclass->classDef->compoundType()!=ClassDef::Protocol)
+ ctx->objectType = bclass.classDef;
+ if (ctx->objectType && !ctx->methodName.isEmpty())
{
- ctx->objectType = bclass->classDef;
- if (ctx->objectType && !ctx->methodName.isEmpty())
- {
- ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
- }
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
}
}
}
diff --git a/src/context.cpp b/src/context.cpp
index ee394d4..614cc2d 100644
--- a/src/context.cpp
+++ b/src/context.cpp
@@ -6670,14 +6670,11 @@ class NestingContext::Private : public GenericNodeListContext
}
}
}
- void addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
+ void addDerivedClasses(BaseClassList bcl,bool hideSuper)
{
- if (bcl==0) return;
- BaseClassListIterator bcli(*bcl);
- BaseClassDef *bcd;
- for (bcli.toFirst() ; (bcd=bcli.current()) ; ++bcli)
+ for (const auto &bcd : bcl)
{
- const ClassDef *cd=bcd->classDef;
+ const ClassDef *cd=bcd.classDef;
if (cd->getLanguage()==SrcLangExt_VHDL && (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
{
continue;
@@ -6815,7 +6812,7 @@ void NestingContext::addClassHierarchy(const ClassSDict &classSDict,bool rootOnl
p->addClassHierarchy(classSDict,rootOnly);
}
-void NestingContext::addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
+void NestingContext::addDerivedClasses(BaseClassList bcl,bool hideSuper)
{
p->addDerivedClasses(bcl,hideSuper);
}
@@ -8536,29 +8533,24 @@ class InheritanceListContext::Private : public GenericNodeListContext
}
};
-InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) : RefCountedContext("InheritanceListContext")
+InheritanceListContext::InheritanceListContext(BaseClassList list, bool baseClasses) : RefCountedContext("InheritanceListContext")
{
p = new Private;
- if (list)
+ for (const auto &bcd : list)
{
- BaseClassListIterator li(*list);
- BaseClassDef *bcd;
- for (li.toFirst();(bcd=li.current());++li)
+ const ClassDef *cd=bcd.classDef;
+ QCString name;
+ if (baseClasses)
{
- const ClassDef *cd=bcd->classDef;
- QCString name;
- if (baseClasses)
- {
- name = insertTemplateSpecifierInScope(
- cd->displayName(),bcd->templSpecifiers);
- }
- else
- {
- name = cd->displayName();
- }
- //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses);
- p->addClass(cd,name);
+ name = insertTemplateSpecifierInScope(
+ cd->displayName(),bcd.templSpecifiers);
}
+ else
+ {
+ name = cd->displayName();
+ }
+ //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses);
+ p->addClass(cd,name);
}
}
@@ -9282,31 +9274,26 @@ class InheritedMemberInfoListContext::Private : public GenericNodeListContext
int lt2, const QCString &title,bool additionalList,
QPtrDict<void> *visitedClasses)
{
- if (cd->baseClasses())
+ for (const auto &ibcd : cd->baseClasses())
{
- BaseClassListIterator it(*cd->baseClasses());
- BaseClassDef *ibcd;
- for (it.toFirst();(ibcd=it.current());++it)
+ ClassDef *icd=ibcd.classDef;
+ if (icd->isLinkable())
{
- ClassDef *icd=ibcd->classDef;
- if (icd->isLinkable())
+ int lt1,lt3;
+ convertProtectionLevel(lt,ibcd.prot,&lt1,&lt3);
+ if (lt2==-1 && lt3!=-1)
{
- int lt1,lt3;
- convertProtectionLevel(lt,ibcd->prot,&lt1,&lt3);
- if (lt2==-1 && lt3!=-1)
- {
- lt2=lt3;
- }
- if (visitedClasses->find(icd)==0)
+ lt2=lt3;
+ }
+ if (visitedClasses->find(icd)==0)
+ {
+ visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
+ if (lt1!=-1)
{
- visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
- if (lt1!=-1)
- {
- // add member info for members of cd with list type lt
- addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList);
- // recurse down the inheritance tree
- findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses);
- }
+ // add member info for members of cd with list type lt
+ addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList);
+ // recurse down the inheritance tree
+ findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses);
}
}
}
diff --git a/src/context.h b/src/context.h
index 7256dc6..473c72f 100644
--- a/src/context.h
+++ b/src/context.h
@@ -21,15 +21,12 @@
#include <qlist.h>
#include <stdio.h>
#include "dirdef.h"
+#include "classdef.h"
class Definition;
-class ClassDef;
-class ClassSDict;
-class BaseClassList;
class PageDef;
class GroupDef;
class NamespaceDef;
-class BaseClassList;
class NamespaceSDict;
class FileDef;
class FileList;
@@ -455,7 +452,7 @@ class ClassInheritanceNodeContext : public RefCountedContext, public TemplateStr
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
- void addChildren(const BaseClassList *bcl,bool hideSuper);
+ void addChildren(BaseClassList bcl,bool hideSuper);
private:
ClassInheritanceNodeContext(const ClassDef *);
@@ -553,7 +550,7 @@ class NestingContext : public RefCountedContext, public TemplateListIntf
void addModules(const GroupSDict &modules);
void addModules(const GroupList &modules);
void addClassHierarchy(const ClassSDict &clDict,bool rootOnly);
- void addDerivedClasses(const BaseClassList *bcl,bool hideSuper);
+ void addDerivedClasses(BaseClassList bcl,bool hideSuper);
private:
NestingContext(const NestingNodeContext *parent,int level);
@@ -929,7 +926,7 @@ class InheritanceNodeContext : public RefCountedContext, public TemplateStructIn
class InheritanceListContext : public RefCountedContext, public TemplateListIntf
{
public:
- static InheritanceListContext *alloc(const BaseClassList *list,bool baseClasses)
+ static InheritanceListContext *alloc(BaseClassList list,bool baseClasses)
{ return new InheritanceListContext(list,baseClasses); }
// TemplateListIntf
@@ -940,7 +937,7 @@ class InheritanceListContext : public RefCountedContext, public TemplateListIntf
virtual int release() { return RefCountedContext::release(); }
private:
- InheritanceListContext(const BaseClassList *list,bool baseClasses);
+ InheritanceListContext(BaseClassList list,bool baseClasses);
~InheritanceListContext();
class Private;
Private *p;
diff --git a/src/defgen.cpp b/src/defgen.cpp
index 02f51c5..b01d438 100644
--- a/src/defgen.cpp
+++ b/src/defgen.cpp
@@ -358,60 +358,50 @@ void generateDEFForClass(ClassDef *cd,FTextStream &t)
t << " cp-id = '" << cd->getOutputFileBase() << "';" << endl;
t << " cp-name = '" << cd->name() << "';" << endl;
- if (cd->baseClasses())
+ for (const auto &bcd : cd->baseClasses())
{
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ t << " cp-ref = {" << endl << " ref-type = base;" << endl;
+ t << " ref-id = '"
+ << bcd.classDef->getOutputFileBase() << "';" << endl;
+ t << " ref-prot = ";
+ switch (bcd.prot)
{
- t << " cp-ref = {" << endl << " ref-type = base;" << endl;
- t << " ref-id = '"
- << bcd->classDef->getOutputFileBase() << "';" << endl;
- t << " ref-prot = ";
- switch (bcd->prot)
- {
- case Public: t << "public;" << endl; break;
- case Package: // package scope is not possible
- case Protected: t << "protected;" << endl; break;
- case Private: t << "private;" << endl; break;
- }
- t << " ref-virt = ";
- switch(bcd->virt)
- {
- case Normal: t << "non-virtual;"; break;
- case Virtual: t << "virtual;"; break;
- case Pure: t << "pure-virtual;"; break;
- }
- t << endl << " };" << endl;
+ case Public: t << "public;" << endl; break;
+ case Package: // package scope is not possible
+ case Protected: t << "protected;" << endl; break;
+ case Private: t << "private;" << endl; break;
+ }
+ t << " ref-virt = ";
+ switch(bcd.virt)
+ {
+ case Normal: t << "non-virtual;"; break;
+ case Virtual: t << "virtual;"; break;
+ case Pure: t << "pure-virtual;"; break;
}
+ t << endl << " };" << endl;
}
- if (cd->subClasses())
+ for (const auto &bcd : cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ t << " cp-ref = {" << endl << " ref-type = derived;" << endl;
+ t << " ref-id = '"
+ << bcd.classDef->getOutputFileBase() << "';" << endl;
+ t << " ref-prot = ";
+ switch (bcd.prot)
{
- t << " cp-ref = {" << endl << " ref-type = derived;" << endl;
- t << " ref-id = '"
- << bcd->classDef->getOutputFileBase() << "';" << endl;
- t << " ref-prot = ";
- switch (bcd->prot)
- {
- case Public: t << "public;" << endl; break;
- case Package: // packet scope is not possible!
- case Protected: t << "protected;" << endl; break;
- case Private: t << "private;" << endl; break;
- }
- t << " ref-virt = ";
- switch(bcd->virt)
- {
- case Normal: t << "non-virtual;"; break;
- case Virtual: t << "virtual;"; break;
- case Pure: t << "pure-virtual;"; break;
- }
- t << endl << " };" << endl;
+ case Public: t << "public;" << endl; break;
+ case Package: // packet scope is not possible!
+ case Protected: t << "protected;" << endl; break;
+ case Private: t << "private;" << endl; break;
+ }
+ t << " ref-virt = ";
+ switch (bcd.virt)
+ {
+ case Normal: t << "non-virtual;"; break;
+ case Virtual: t << "virtual;"; break;
+ case Pure: t << "pure-virtual;"; break;
}
+ t << endl << " };" << endl;
}
int numMembers = 0;
diff --git a/src/diagram.cpp b/src/diagram.cpp
index d0b7a08..f2e48d8 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -39,7 +36,7 @@
class DiagramItemList;
/** Class representing a single node in the built-in class diagram */
-class DiagramItem
+class DiagramItem
{
public:
DiagramItem(DiagramItem *p,uint number,const ClassDef *cd,
@@ -47,7 +44,7 @@ class DiagramItem
~DiagramItem();
QCString label() const;
QCString fileName() const;
- DiagramItem *parentItem() { return parent; }
+ DiagramItem *parentItem() { return parent; }
DiagramItemList *getChildren() { return children; }
void move(int dx,int dy) { x+=(uint)dx; y+=(uint)dy; }
uint xPos() const { return x; }
@@ -59,7 +56,7 @@ class DiagramItem
Protection protection() const { return prot; }
Specifier virtualness() const { return virt; }
void putInList() { inList=TRUE; }
- bool isInList() const { return inList; }
+ bool isInList() const { return inList; }
const ClassDef *getClassDef() const { return classDef; }
private:
DiagramItemList *children;
@@ -82,14 +79,14 @@ class DiagramItemList : public QList<DiagramItem>
};
/** Class representing a row in the built-in class diagram */
-class DiagramRow : public QList<DiagramItem>
+class DiagramRow : public QList<DiagramItem>
{
public:
- DiagramRow(TreeDiagram *d,uint l) : QList<DiagramItem>()
+ DiagramRow(TreeDiagram *d,uint l) : QList<DiagramItem>()
{
- diagram=d;
+ diagram=d;
level=l;
- setAutoDelete(TRUE);
+ setAutoDelete(TRUE);
}
void insertClass(DiagramItem *parent,const ClassDef *cd,bool doBases,
Protection prot,Specifier virt,const char *ts);
@@ -103,7 +100,7 @@ class DiagramRow : public QList<DiagramItem>
class DiagramRowIterator : public QListIterator<DiagramRow>
{
public:
- DiagramRowIterator(const QList<DiagramRow> &d)
+ DiagramRowIterator(const QList<DiagramRow> &d)
: QListIterator<DiagramRow>(d) {}
};
@@ -261,7 +258,7 @@ static void writeMapArea(FTextStream &t,const ClassDef *cd,QCString relPath,
{
QCString ref=cd->getReference();
t << "<area ";
- if (!ref.isEmpty())
+ if (!ref.isEmpty())
{
t << externalLinkTarget(true);
}
@@ -278,7 +275,7 @@ static void writeMapArea(FTextStream &t,const ClassDef *cd,QCString relPath,
{
t << "title=\"" << convertToHtml(tooltip) << "\" ";
}
- t << "alt=\"" << convertToXML(cd->displayName());
+ t << "alt=\"" << convertToXML(cd->displayName());
t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
t << (x+w) << "," << (y+h) << "\"/>" << endl;
}
@@ -286,7 +283,7 @@ static void writeMapArea(FTextStream &t,const ClassDef *cd,QCString relPath,
//-----------------------------------------------------------------------------
DiagramItem::DiagramItem(DiagramItem *p,uint number,const ClassDef *cd,
- Protection pr,Specifier vi,const char *ts)
+ Protection pr,Specifier vi,const char *ts)
{
parent=p;
x=y=0;
@@ -299,7 +296,7 @@ DiagramItem::DiagramItem(DiagramItem *p,uint number,const ClassDef *cd,
templSpec=ts;
}
-DiagramItem::~DiagramItem()
+DiagramItem::~DiagramItem()
{
delete children;
}
@@ -360,24 +357,18 @@ void DiagramRow::insertClass(DiagramItem *parent,const ClassDef *cd,bool doBases
{
//if (cd->visited) return; // the visit check does not work in case of
// multiple inheritance of the same class!
- DiagramItem *di=new DiagramItem(parent, diagram->at(level)->count(),
+ DiagramItem *di=new DiagramItem(parent, diagram->at(level)->count(),
cd,prot,virt,ts);
//cd->visited=TRUE;
if (parent) parent->addChild(di);
di->move((int)(count()*gridWidth),(int)(level*gridHeight));
append(di);
- BaseClassList *bcl=doBases ? cd->baseClasses() : cd->subClasses();
int count=0;
- if (bcl)
+ for (const auto &bcd : doBases ? cd->baseClasses() : cd->subClasses())
{
/* there are base/sub classes */
- BaseClassListIterator it(*bcl);
- BaseClassDef *bcd;
- for (;(bcd=it.current());++it)
- {
- ClassDef *ccd=bcd->classDef;
- if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/) count++;
- }
+ ClassDef *ccd=bcd.classDef;
+ if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/) count++;
}
if (count>0 && (prot!=Private || !doBases))
{
@@ -391,17 +382,14 @@ void DiagramRow::insertClass(DiagramItem *parent,const ClassDef *cd,bool doBases
{
row=diagram->at(level+1);
}
- /* insert base classes in the next row */
- BaseClassListIterator it(*bcl);
- BaseClassDef *bcd;
- for (;(bcd=it.current());++it)
+ for (const auto &bcd : doBases ? cd->baseClasses() : cd->subClasses())
{
- ClassDef *ccd=bcd->classDef;
+ ClassDef *ccd=bcd.classDef;
if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/)
{
- row->insertClass(di,ccd,doBases,bcd->prot,
- doBases?bcd->virt:Normal,
- doBases?bcd->templSpecifiers.data():"");
+ row->insertClass(di,ccd,doBases,bcd.prot,
+ doBases?bcd.virt:Normal,
+ doBases?bcd.templSpecifiers.data():"");
}
}
}
@@ -409,7 +397,7 @@ void DiagramRow::insertClass(DiagramItem *parent,const ClassDef *cd,bool doBases
TreeDiagram::TreeDiagram(const ClassDef *root,bool doBases)
{
- setAutoDelete(TRUE);
+ setAutoDelete(TRUE);
DiagramRow *row=new DiagramRow(this,0);
append(row);
row->insertClass(0,root,doBases,Public,Normal,0);
@@ -437,7 +425,7 @@ bool TreeDiagram::layoutTree(DiagramItem *root,uint r)
bool moved=FALSE;
//printf("layoutTree(%s,%d)\n",root->label().data(),r);
- DiagramItemList *dil=root->getChildren();
+ DiagramItemList *dil=root->getChildren();
if (dil->count()>0)
{
uint k;
@@ -543,7 +531,7 @@ uint TreeDiagram::computeRows()
DiagramItem *di;
for (;(di=rit.current());++rit)
{
- if (di->parentItem()!=opi) curListLen=1; else curListLen++;
+ if (di->parentItem()!=opi) curListLen=1; else curListLen++;
if (curListLen>maxListLen) maxListLen=curListLen;
opi=di->parentItem();
}
@@ -574,7 +562,7 @@ void TreeDiagram::computeExtremes(uint *maxLabelLen,uint *maxXPos)
if (maxXPos) *maxXPos=mx;
}
-void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
+void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
bool doBase,bool bitmap,
uint baseRows,uint superRows,
uint cellWidth,uint cellHeight,
@@ -643,20 +631,20 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
}
}
opi=di->parentItem();
-
+
if (bitmap)
{
bool hasDocs=di->getClassDef()->isLinkable();
writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,
- hasDocs,di->getChildren()->count()>0);
- if (!firstRow && generateMap)
+ hasDocs,di->getChildren()->count()>0);
+ if (!firstRow && generateMap)
writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
}
else
{
writeVectorBox(t,di,xf,yf,di->getChildren()->count()>0);
}
-
+
if (doBase) --rit; else ++rit;
}
done=TRUE;
@@ -681,8 +669,8 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
}
bool hasDocs=di->getClassDef()->isLinkable();
- writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,hasDocs);
- if (!firstRow && generateMap)
+ writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,hasDocs);
+ if (!firstRow && generateMap)
writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
}
else
@@ -754,12 +742,12 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
t << protToString(di->protection()) << endl;
if (doBase)
{
- t << "1 " << (di->xPos()/(float)gridWidth) << " "
+ t << "1 " << (di->xPos()/(float)gridWidth) << " "
<< (di->yPos()/(float)gridHeight+superRows-1) << " in\n";
}
else
{
- t << "0 " << (di->xPos()/(float)gridWidth) << " "
+ t << "0 " << (di->xPos()/(float)gridWidth) << " "
<< ((float)superRows-0.25f-di->yPos()/(float)gridHeight)
<< " in\n";
}
@@ -919,12 +907,12 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
t << protToString(di->protection()) << endl;
if (doBase)
{
- t << "1 " << di->xPos()/(float)gridWidth << " "
+ t << "1 " << di->xPos()/(float)gridWidth << " "
<< (di->yPos()/(float)gridHeight+superRows-1) << " in\n";
}
else
{
- t << "0 " << di->xPos()/(float)gridWidth << " "
+ t << "0 " << di->xPos()/(float)gridWidth << " "
<< ((float)superRows-0.25f-di->yPos()/(float)gridHeight)
<< " in\n";
}
@@ -959,12 +947,12 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
t << protToString(p) << endl;
if (doBase)
{
- t << "0 " << di->xPos()/(float)gridWidth << " "
+ t << "0 " << di->xPos()/(float)gridWidth << " "
<< (di->yPos()/(float)gridHeight+superRows-1) << " out\n";
}
else
{
- t << "1 " << di->xPos()/(float)gridWidth << " "
+ t << "1 " << di->xPos()/(float)gridWidth << " "
<< ((float)superRows-1.75f-di->yPos()/(float)gridHeight)
<< " out\n";
}
@@ -979,14 +967,14 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
uint xs = first->xPos()*(cellWidth+labelHorSpacing)/gridWidth
+ cellWidth/2;
uint xe = last->xPos()*(cellWidth+labelHorSpacing)/gridWidth
- + cellWidth/2;
+ + cellWidth/2;
if (doBase) // base classes
{
- image->drawHorzLine(y,xs,xe,col,mask);
+ image->drawHorzLine(y,xs,xe,col,mask);
}
else // super classes
{
- image->drawHorzLine(y+labelVertSpacing/2,xs,xe,col,mask);
+ image->drawHorzLine(y+labelVertSpacing/2,xs,xe,col,mask);
}
}
else
@@ -994,14 +982,14 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
t << protToString(p) << endl;
if (doBase)
{
- t << first->xPos()/(float)gridWidth << " "
+ t << first->xPos()/(float)gridWidth << " "
<< last->xPos()/(float)gridWidth << " "
- << (first->yPos()/(float)gridHeight+superRows-1)
+ << (first->yPos()/(float)gridHeight+superRows-1)
<< " conn\n";
}
else
{
- t << first->xPos()/(float)gridWidth << " "
+ t << first->xPos()/(float)gridWidth << " "
<< last->xPos()/(float)gridWidth << " "
<< ((float)superRows-first->yPos()/(float)gridHeight)
<< " conn\n";
@@ -1066,22 +1054,22 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
uint rows=baseRows+superRows-1;
uint cols=(QMAX(baseMaxX,superMaxX)+gridWidth*2-1)/gridWidth;
-
+
// Estimate the image aspect width and height in pixels.
uint estHeight = rows*40;
uint estWidth = cols*(20+QMAX(baseMaxLabelWidth,superMaxLabelWidth));
//printf("Estimated size %d x %d\n",estWidth,estHeight);
-
+
const float pageWidth = 14.0f; // estimated page width in cm.
// Somewhat lower to deal with estimation
- // errors.
-
+ // errors.
+
// compute the image height in centimeters based on the estimates
float realHeight = QMIN(rows,12); // real height in cm
float realWidth = realHeight * estWidth/(float)estHeight;
if (realWidth>pageWidth) // assume that the page width is about 15 cm
{
- realHeight*=pageWidth/realWidth;
+ realHeight*=pageWidth/realWidth;
realWidth=pageWidth;
}
@@ -1089,11 +1077,11 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
output << "\\begin{figure}[H]\n"
"\\begin{center}\n"
"\\leavevmode\n";
- output << "\\includegraphics[height=" << realHeight << "cm]{"
+ output << "\\includegraphics[height=" << realHeight << "cm]{"
<< fileName << "}" << endl;
output << "\\end{center}\n"
"\\end{figure}\n";
-
+
//printf("writeFigure rows=%d cols=%d\n",rows,cols);
QCString epsBaseName=(QCString)path+"/"+fileName;
@@ -1105,11 +1093,11 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
term("Could not open file %s for writing\n",f1.name().data());
}
FTextStream t(&f1);
-
+
//printf("writeEPS() rows=%d cols=%d\n",rows,cols);
-
+
// generate EPS header and postscript variables and procedures
-
+
t << "%!PS-Adobe-2.0 EPSF-2.0\n";
t << "%%Title: ClassName\n";
t << "%%Creator: Doxygen\n";
@@ -1322,11 +1310,11 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
<< " boxheight rows mul disty rows 1 sub mul add boundaspect mul \n"
<< " max def\n"
<< "boundx scalefactor div boundy scalefactor div scale\n";
-
+
t << "\n% ----- classes -----\n\n";
base->drawBoxes(t,0,TRUE,FALSE,baseRows,superRows,0,0);
super->drawBoxes(t,0,FALSE,FALSE,baseRows,superRows,0,0);
-
+
t << "\n% ----- relations -----\n\n";
base->drawConnectors(t,0,TRUE,FALSE,baseRows,superRows,0,0);
super->drawConnectors(t,0,FALSE,FALSE,baseRows,superRows,0,0);
@@ -1351,7 +1339,7 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
void ClassDiagram::writeImage(FTextStream &t,const char *path,
- const char *relPath,const char *fileName,
+ const char *relPath,const char *fileName,
bool generateMap) const
{
uint baseRows=base->computeRows();
@@ -1361,7 +1349,7 @@ void ClassDiagram::writeImage(FTextStream &t,const char *path,
uint lb,ls,xb,xs;
base->computeExtremes(&lb,&xb);
super->computeExtremes(&ls,&xs);
-
+
uint cellWidth = QMAX(lb,ls)+labelHorMargin*2;
uint maxXPos = QMAX(xb,xs);
uint labelVertMargin = 6; //QMAX(6,(cellWidth-fontHeight)/6); // aspect at least 1:3
diff --git a/src/dotclassgraph.cpp b/src/dotclassgraph.cpp
index 84b7962..e157ec3 100644
--- a/src/dotclassgraph.cpp
+++ b/src/dotclassgraph.cpp
@@ -266,18 +266,11 @@ void DotClassGraph::buildGraph(const ClassDef *cd,DotNode *n,bool base,int dista
if (m_graphType == Inheritance || m_graphType==Collaboration)
{
- BaseClassList *bcl = base ? cd->baseClasses() : cd->subClasses();
- if (bcl)
+ for (const auto &bcd : base ? cd->baseClasses() : cd->subClasses())
{
- BaseClassListIterator bcli(*bcl);
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
- {
- //printf("-------- inheritance relation %s->%s templ='%s'\n",
- // cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data());
- addClass(bcd->classDef,n,bcd->prot,0,bcd->usedName,
- bcd->templSpecifiers,base,distance);
- }
+ //printf("-------- inheritance relation %s->%s templ='%s'\n",
+ // cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data());
+ addClass(bcd.classDef,n,bcd.prot,0,bcd.usedName,bcd.templSpecifiers,base,distance);
}
}
if (m_graphType == Collaboration)
diff --git a/src/dotgfxhierarchytable.cpp b/src/dotgfxhierarchytable.cpp
index 3d56de8..ddd9410 100644
--- a/src/dotgfxhierarchytable.cpp
+++ b/src/dotgfxhierarchytable.cpp
@@ -43,14 +43,14 @@ void DotGfxHierarchyTable::computeTheGraph()
md5stream << " rankdir=\"LR\";" << endl;
for (dnli2.toFirst();(node=dnli2.current());++dnli2)
{
- if (node->subgraphId()==m_rootSubgraphNode->subgraphId())
+ if (node->subgraphId()==m_rootSubgraphNode->subgraphId())
{
node->clearWriteFlag();
}
}
for (dnli2.toFirst();(node=dnli2.current());++dnli2)
{
- if (node->subgraphId()==m_rootSubgraphNode->subgraphId())
+ if (node->subgraphId()==m_rootSubgraphNode->subgraphId())
{
node->write(md5stream,Hierarchy,GOF_BITMAP,FALSE,TRUE,TRUE);
}
@@ -107,71 +107,66 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
void DotGfxHierarchyTable::addHierarchy(DotNode *n,const ClassDef *cd,bool hideSuper)
{
//printf("addHierarchy '%s' baseClasses=%d\n",cd->name().data(),cd->baseClasses()->count());
- if (cd->subClasses())
+ for (const auto &bcd : cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
+ ClassDef *bClass=bcd.classDef;
+ //printf(" Trying sub class='%s' usedNodes=%d\n",bClass->name().data(),m_usedNodes->count());
+ if (bClass->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses()))
{
- ClassDef *bClass=bcd->classDef;
- //printf(" Trying sub class='%s' usedNodes=%d\n",bClass->name().data(),m_usedNodes->count());
- if (bClass->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses()))
+ DotNode *bn;
+ //printf(" Node '%s' Found visible class='%s'\n",n->label().data(),
+ // bClass->name().data());
+ if ((bn=m_usedNodes->find(bClass->name()))) // node already present
{
- DotNode *bn;
- //printf(" Node '%s' Found visible class='%s'\n",n->label().data(),
- // bClass->name().data());
- if ((bn=m_usedNodes->find(bClass->name()))) // node already present
+ if (n->children()==0 || n->children()->findRef(bn)==-1) // no arrow yet
{
- if (n->children()==0 || n->children()->findRef(bn)==-1) // no arrow yet
- {
- n->addChild(bn,bcd->prot);
- bn->addParent(n);
- //printf(" Adding node %s to existing base node %s (c=%d,p=%d)\n",
- // n->label().data(),
- // bn->label().data(),
- // bn->children() ? bn->children()->count() : 0,
- // bn->parents() ? bn->parents()->count() : 0
- // );
- }
- //else
- //{
- // printf(" Class already has an arrow!\n");
- //}
+ n->addChild(bn,bcd.prot);
+ bn->addParent(n);
+ //printf(" Adding node %s to existing base node %s (c=%d,p=%d)\n",
+ // n->label().data(),
+ // bn->label().data(),
+ // bn->children() ? bn->children()->count() : 0,
+ // bn->parents() ? bn->parents()->count() : 0
+ // );
}
- else
+ //else
+ //{
+ // printf(" Class already has an arrow!\n");
+ //}
+ }
+ else
+ {
+ QCString tmp_url="";
+ if (bClass->isLinkable() && !bClass->isHidden())
{
- QCString tmp_url="";
- if (bClass->isLinkable() && !bClass->isHidden())
+ tmp_url=bClass->getReference()+"$"+bClass->getOutputFileBase();
+ if (!bClass->anchor().isEmpty())
{
- tmp_url=bClass->getReference()+"$"+bClass->getOutputFileBase();
- if (!bClass->anchor().isEmpty())
- {
- tmp_url+="#"+bClass->anchor();
- }
+ tmp_url+="#"+bClass->anchor();
}
- QCString tooltip = bClass->briefDescriptionAsTooltip();
- bn = new DotNode(getNextNodeNumber(),
+ }
+ QCString tooltip = bClass->briefDescriptionAsTooltip();
+ bn = new DotNode(getNextNodeNumber(),
bClass->displayName(),
tooltip,
tmp_url.data()
- );
- n->addChild(bn,bcd->prot);
- bn->addParent(n);
- //printf(" Adding node %s to new base node %s (c=%d,p=%d)\n",
- // n->label().data(),
- // bn->label().data(),
- // bn->children() ? bn->children()->count() : 0,
- // bn->parents() ? bn->parents()->count() : 0
- // );
- //printf(" inserting %s (%p)\n",bClass->name().data(),bn);
- m_usedNodes->insert(bClass->name(),bn); // add node to the used list
- }
- if (!bClass->isVisited() && !hideSuper && bClass->subClasses())
- {
- bool wasVisited=bClass->isVisited();
- bClass->setVisited(TRUE);
- addHierarchy(bn,bClass,wasVisited);
- }
+ );
+ n->addChild(bn,bcd.prot);
+ bn->addParent(n);
+ //printf(" Adding node %s to new base node %s (c=%d,p=%d)\n",
+ // n->label().data(),
+ // bn->label().data(),
+ // bn->children() ? bn->children()->count() : 0,
+ // bn->parents() ? bn->parents()->count() : 0
+ // );
+ //printf(" inserting %s (%p)\n",bClass->name().data(),bn);
+ m_usedNodes->insert(bClass->name(),bn); // add node to the used list
+ }
+ if (!bClass->isVisited() && !hideSuper && !bClass->subClasses().empty())
+ {
+ bool wasVisited=bClass->isVisited();
+ bClass->setVisited(TRUE);
+ addHierarchy(bn,bClass,wasVisited);
}
}
}
@@ -200,7 +195,7 @@ void DotGfxHierarchyTable::addClassList(const ClassSDict *cl)
) // root node in the forest
{
QCString tmp_url="";
- if (cd->isLinkable() && !cd->isHidden())
+ if (cd->isLinkable() && !cd->isHidden())
{
tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
if (!cd->anchor().isEmpty())
@@ -217,8 +212,8 @@ void DotGfxHierarchyTable::addClassList(const ClassSDict *cl)
//m_usedNodes->clear();
m_usedNodes->insert(cd->name(),n);
- m_rootNodes->insert(0,n);
- if (!cd->isVisited() && cd->subClasses())
+ m_rootNodes->insert(0,n);
+ if (!cd->isVisited() && !cd->subClasses().empty())
{
addHierarchy(n,cd,cd->isVisited());
cd->setVisited(TRUE);
@@ -232,7 +227,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable(const char *prefix,ClassDef::Compound
, m_classType(ct)
{
m_rootNodes = new QList<DotNode>;
- m_usedNodes = new QDict<DotNode>(1009);
+ m_usedNodes = new QDict<DotNode>(1009);
m_usedNodes->setAutoDelete(TRUE);
m_rootSubgraphs = new DotNodeList;
@@ -245,7 +240,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable(const char *prefix,ClassDef::Compound
// m_usedNodes now contains all nodes in the graph
// color the graph into a set of independent subgraphs
- bool done=FALSE;
+ bool done=FALSE;
int curColor=0;
QListIterator<DotNode> dnli(*m_rootNodes);
while (!done) // there are still nodes to color
@@ -263,7 +258,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable(const char *prefix,ClassDef::Compound
n->colorConnectedNodes(curColor);
curColor++;
const DotNode *dn=n->findDocNode();
- if (dn!=0)
+ if (dn!=0)
m_rootSubgraphs->inSort(dn);
else
m_rootSubgraphs->inSort(n);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 01a75b7..73c4b02 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -7348,7 +7348,7 @@ static void computeMemberRelations()
if (md!=bmd)
{
const ClassDef *mcd = md->getClassDef();
- if (mcd && mcd->baseClasses())
+ if (mcd && !mcd->baseClasses().empty())
{
const ClassDef *bmcd = bmd->getClassDef();
//printf("Check relation between '%s'::'%s' (%p) and '%s'::'%s' (%p)\n",
@@ -7469,8 +7469,8 @@ static void buildCompleteMemberLists()
for (cli.toFirst();(cd=cli.current());++cli)
{
if (// !cd->isReference() && // not an external class
- cd->subClasses()==0 && // is a root of the hierarchy
- cd->baseClasses()) // and has at least one base class
+ cd->subClasses().empty() && // is a root of the hierarchy
+ !cd->baseClasses().empty()) // and has at least one base class
{
//printf("*** merging members for %s\n",cd->name().data());
cd->mergeMembers();
@@ -7648,20 +7648,14 @@ static void generateFileSources()
}
}
// first wait until all files are processed
- std::vector< std::shared_ptr<SourceContext> > syncedResults;
for (auto &f : results)
{
- syncedResults.push_back(f.get());
- }
- // next write all footers
- for (auto &ctx : syncedResults)
- {
+ auto ctx = f.get();
if (ctx->generateSourceFile)
{
ctx->fd->writeSourceFooter(ctx->ol);
}
}
-
#else // single threaded version
for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
diff --git a/src/index.cpp b/src/index.cpp
index 4df2ce4..e46a578 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -451,14 +451,13 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
//----------------------------------------------------------------------------
/*! Generates HTML Help tree of classes */
-static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv,bool addToIndex)
+static void writeClassTree(OutputList &ol,BaseClassList bcl,bool hideSuper,int level,FTVHelp* ftv,bool addToIndex)
{
- if (bcl==0) return;
- BaseClassListIterator bcli(*bcl);
+ if (bcl.empty()) return;
bool started=FALSE;
- for ( ; bcli.current() ; ++bcli)
+ for (const auto &bcd : bcl)
{
- ClassDef *cd=bcli.current()->classDef;
+ ClassDef *cd=bcd.classDef;
if (cd->getLanguage()==SrcLangExt_VHDL && (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
{
continue;
@@ -513,7 +512,7 @@ static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSupe
{
if (cd->getLanguage()==SrcLangExt_VHDL)
{
- ftv->addContentsItem(hasChildren,bcli.current()->usedName,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
+ ftv->addContentsItem(hasChildren,bcd.usedName,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
}
else
{
@@ -963,7 +962,7 @@ static int countClassesInTreeList(const ClassSDict &cl, ClassDef::CompoundType c
{
if (cd->isVisibleInHierarchy()) // should it be visible
{
- if (cd->subClasses()) // should have sub classes
+ if (!cd->subClasses().empty()) // should have sub classes
{
count++;
}
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 3343c1a..1d55dd6 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -666,19 +666,24 @@ static void writeDefaultHeaderPart1(FTextStream &t)
t << "% Headers & footers\n"
"\\usepackage{fancyhdr}\n"
"\\pagestyle{fancyplain}\n"
- "\\fancyhead[LE]{\\fancyplain{}{\\bfseries\\thepage}}\n"
- "\\fancyhead[CE]{\\fancyplain{}{}}\n"
- "\\fancyhead[RE]{\\fancyplain{}{\\bfseries\\leftmark}}\n"
- "\\fancyhead[LO]{\\fancyplain{}{\\bfseries\\rightmark}}\n"
- "\\fancyhead[CO]{\\fancyplain{}{}}\n"
- "\\fancyhead[RO]{\\fancyplain{}{\\bfseries\\thepage}}\n"
- "\\fancyfoot[LE]{\\fancyplain{}{}}\n"
- "\\fancyfoot[CE]{\\fancyplain{}{}}\n"
- "\\fancyfoot[RE]{\\fancyplain{}{\\bfseries\\scriptsize " << genString << " Doxygen }}\n"
- "\\fancyfoot[LO]{\\fancyplain{}{\\bfseries\\scriptsize " << genString << " Doxygen }}\n"
- "\\fancyfoot[CO]{\\fancyplain{}{}}\n"
- "\\fancyfoot[RO]{\\fancyplain{}{}}\n"
- "\\renewcommand{\\footrulewidth}{0.4pt}\n";
+ "\\renewcommand{\\footrulewidth}{0.4pt}\n"
+ "%\n"
+ "\\fancypagestyle{fancyplain}{\n"
+ "\\fancyhf{}\n"
+ "\\fancyhead[LE, RO]{\\bfseries\\thepage}\n"
+ "\\fancyhead[LO]{\\bfseries\\rightmark}\n"
+ "\\fancyhead[RE]{\\bfseries\\leftmark}\n"
+ "\\fancyfoot[LO, RE]{\\bfseries\\scriptsize " << genString << " Doxygen }\n"
+ "}\n"
+ "%\n"
+ "\\fancypagestyle{plain}{\n"
+ "\\fancyhf{}\n"
+ "\\fancyfoot[LO, RE]{\\bfseries\\scriptsize " << genString << " Doxygen }\n"
+ "\\renewcommand{\\headrulewidth}{0pt}}\n"
+ "%\n"
+ "\\pagestyle{fancyplain}\n"
+ "%\n";
+
if (!Config_getBool(COMPACT_LATEX))
{
t << "\\renewcommand{\\chaptermark}[1]{%\n"
diff --git a/src/markdown.cpp b/src/markdown.cpp
index bd7751a..15e18bc 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -2529,6 +2529,7 @@ QCString Markdown::extractPageTitle(QCString &docs,QCString &id, int &prepend)
}
if (i<end1 && isAtxHeader(data+i,end1-i,title,id,FALSE)>0)
{
+ docs+="\n";
docs+=docs_org.mid(end1);
}
else
@@ -2662,7 +2663,7 @@ QCString markdownFileNameToId(const QCString &fileName)
QCString baseFn = stripFromPath(QFileInfo(fileName).absFilePath().utf8());
int i = baseFn.findRev('.');
if (i!=-1) baseFn = baseFn.left(i);
- QCString baseName = substitute(substitute(substitute(baseFn," ","_"),"/","_"),":","_");
+ QCString baseName = substitute(substitute(substitute(substitute(baseFn," ","_"),"/","_"),":","_"),"@","_");
//printf("markdownFileNameToId(%s)=md_%s\n",qPrint(fileName),qPrint(baseName));
return "md_"+baseName;
}
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index a6e9f22..ffb0fed 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -1831,31 +1831,31 @@ void PerlModGenerator::generatePerlModForClass(const ClassDef *cd)
m_output.openHash()
.addFieldQuotedString("name", cd->name());
- if (cd->baseClasses())
+ if (!cd->baseClasses().empty())
{
m_output.openList("base");
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ for (const auto &bcd : cd->baseClasses())
+ {
m_output.openHash()
- .addFieldQuotedString("name", bcd->classDef->displayName())
- .addFieldQuotedString("virtualness", getVirtualnessName(bcd->virt))
- .addFieldQuotedString("protection", getProtectionName(bcd->prot))
+ .addFieldQuotedString("name", bcd.classDef->displayName())
+ .addFieldQuotedString("virtualness", getVirtualnessName(bcd.virt))
+ .addFieldQuotedString("protection", getProtectionName(bcd.prot))
.closeHash();
+ }
m_output.closeList();
}
- if (cd->subClasses())
+ if (!cd->subClasses().empty())
{
m_output.openList("derived");
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ for (const auto &bcd : cd->subClasses())
+ {
m_output.openHash()
- .addFieldQuotedString("name", bcd->classDef->displayName())
- .addFieldQuotedString("virtualness", getVirtualnessName(bcd->virt))
- .addFieldQuotedString("protection", getProtectionName(bcd->prot))
+ .addFieldQuotedString("name", bcd.classDef->displayName())
+ .addFieldQuotedString("virtualness", getVirtualnessName(bcd.virt))
+ .addFieldQuotedString("protection", getProtectionName(bcd.prot))
.closeHash();
+ }
m_output.closeList();
}
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
index 067370b..3045385 100644
--- a/src/searchindex.cpp
+++ b/src/searchindex.cpp
@@ -209,7 +209,7 @@ void SearchIndex::addWord(const char *word,bool hiPriority,bool recurse)
{
//fprintf(stderr,"addWord(%s) at index %d\n",word,idx);
m_index[idx].push_back(IndexWord(wStr));
- it = m_words.insert({ wStr.str(), m_index[idx].size()-1 }).first;
+ it = m_words.insert({ wStr.str(), static_cast<int>(m_index[idx].size())-1 }).first;
}
m_index[idx][it->second].addUrlIndex(m_urlIndex,hiPriority);
int i;
@@ -239,10 +239,10 @@ void SearchIndex::addWord(const char *word,bool hiPriority)
static void writeInt(QFile &f,size_t index)
{
- f.putch(index>>24);
- f.putch((index>>16)&0xff);
- f.putch((index>>8)&0xff);
- f.putch(index&0xff);
+ f.putch(static_cast<int>(index>>24));
+ f.putch(static_cast<int>((index>>16)&0xff));
+ f.putch(static_cast<int>((index>>8)&0xff));
+ f.putch(static_cast<int>(index&0xff));
}
static void writeString(QFile &f,const char *s)
diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp
index 2f72221..235479d 100644
--- a/src/sqlite3gen.cpp
+++ b/src/sqlite3gen.cpp
@@ -2012,37 +2012,27 @@ static void generateSqlite3ForClass(const ClassDef *cd)
step(compounddef_insert);
// + list of direct super classes
- if (cd->baseClasses())
+ for (const auto &bcd : cd->baseClasses())
{
- BaseClassListIterator bcli(*cd->baseClasses());
- const BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
- {
- struct Refid base_refid = insertRefid(bcd->classDef->getOutputFileBase());
- struct Refid derived_refid = insertRefid(cd->getOutputFileBase());
- bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
- bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
- bindIntParameter(compoundref_insert,":prot",bcd->prot);
- bindIntParameter(compoundref_insert,":virt",bcd->virt);
- step(compoundref_insert);
- }
+ struct Refid base_refid = insertRefid(bcd.classDef->getOutputFileBase());
+ struct Refid derived_refid = insertRefid(cd->getOutputFileBase());
+ bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
+ bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
+ bindIntParameter(compoundref_insert,":prot",bcd.prot);
+ bindIntParameter(compoundref_insert,":virt",bcd.virt);
+ step(compoundref_insert);
}
// + list of direct sub classes
- if (cd->subClasses())
- {
- BaseClassListIterator bcli(*cd->subClasses());
- const BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
- {
- struct Refid derived_refid = insertRefid(bcd->classDef->getOutputFileBase());
- struct Refid base_refid = insertRefid(cd->getOutputFileBase());
- bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
- bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
- bindIntParameter(compoundref_insert,":prot",bcd->prot);
- bindIntParameter(compoundref_insert,":virt",bcd->virt);
- step(compoundref_insert);
- }
+ for (const auto &bcd : cd->subClasses())
+ {
+ struct Refid derived_refid = insertRefid(bcd.classDef->getOutputFileBase());
+ struct Refid base_refid = insertRefid(cd->getOutputFileBase());
+ bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
+ bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
+ bindIntParameter(compoundref_insert,":prot",bcd.prot);
+ bindIntParameter(compoundref_insert,":virt",bcd.virt);
+ step(compoundref_insert);
}
// + list of inner classes
diff --git a/src/util.cpp b/src/util.cpp
index a4486f0..41fcffa 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -2554,16 +2554,11 @@ int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level)
return -1;
}
int m=maxInheritanceDepth;
- if (cd->baseClasses())
+ for (const auto &bcdi : cd->baseClasses())
{
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcdi;
- for (;(bcdi=bcli.current());++bcli)
- {
- int mc=minClassDistance(bcdi->classDef,bcd,level+1);
- if (mc<m) m=mc;
- if (m<0) break;
- }
+ int mc=minClassDistance(bcdi.classDef,bcd,level+1);
+ if (mc<m) m=mc;
+ if (m<0) break;
}
return m;
}
@@ -2584,14 +2579,12 @@ Protection classInheritedProtectionLevel(const ClassDef *cd,const ClassDef *bcd,
err("Internal inconsistency: found class %s seem to have a recursive "
"inheritance relation! Please send a bug report to doxygen@gmail.com\n",cd->name().data());
}
- else if (cd->baseClasses())
+ else if (prot!=Private)
{
- BaseClassListIterator bcli(*cd->baseClasses());
- const BaseClassDef *bcdi;
- for (;(bcdi=bcli.current()) && prot!=Private;++bcli)
+ for (const auto &bcdi : cd->baseClasses())
{
- Protection baseProt = classInheritedProtectionLevel(bcdi->classDef,bcd,bcdi->prot,level+1);
- if (baseProt==Private) prot=Private;
+ Protection baseProt = classInheritedProtectionLevel(bcdi.classDef,bcd,bcdi.prot,level+1);
+ if (baseProt==Private) prot=Private;
else if (baseProt==Protected) prot=Protected;
}
}
@@ -2600,14 +2593,12 @@ exit:
return prot;
}
-void trimBaseClassScope(BaseClassList *bcl,QCString &s,int level=0)
+void trimBaseClassScope(BaseClassList bcl,QCString &s,int level=0)
{
//printf("trimBaseClassScope level=%d '%s'\n",level,s.data());
- BaseClassListIterator bcli(*bcl);
- BaseClassDef *bcd;
- for (;(bcd=bcli.current());++bcli)
+ for (const auto &bcd : bcl)
{
- ClassDef *cd=bcd->classDef;
+ ClassDef *cd=bcd.classDef;
//printf("Trying class %s\n",cd->name().data());
int spos=s.find(cd->name()+"::");
if (spos!=-1)
@@ -2617,8 +2608,10 @@ void trimBaseClassScope(BaseClassList *bcl,QCString &s,int level=0)
);
}
//printf("base class '%s'\n",cd->name().data());
- if (cd->baseClasses())
+ if (!cd->baseClasses().empty())
+ {
trimBaseClassScope(cd->baseClasses(),s,level+1);
+ }
}
}
@@ -4579,14 +4572,12 @@ int getPrefixIndex(const QCString &name)
//----------------------------------------------------------------------------
-static void initBaseClassHierarchy(BaseClassList *bcl)
+static void initBaseClassHierarchy(BaseClassList bcl)
{
- if (bcl==0) return;
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current(); ++bcli)
+ for (const auto &bcd : bcl)
{
- ClassDef *cd=bcli.current()->classDef;
- if (cd->baseClasses()==0) // no base classes => new root
+ ClassDef *cd = bcd.classDef;
+ if (cd->baseClasses().empty()) // no base classes => new root
{
initBaseClassHierarchy(cd->baseClasses());
}
@@ -4597,23 +4588,22 @@ static void initBaseClassHierarchy(BaseClassList *bcl)
bool classHasVisibleChildren(const ClassDef *cd)
{
- BaseClassList *bcl;
+ BaseClassList bcl;
if (cd->getLanguage()==SrcLangExt_VHDL) // reverse baseClass/subClass relation
{
- if (cd->baseClasses()==0) return FALSE;
+ if (cd->baseClasses().empty()) return FALSE;
bcl=cd->baseClasses();
}
else
{
- if (cd->subClasses()==0) return FALSE;
+ if (cd->subClasses().empty()) return FALSE;
bcl=cd->subClasses();
}
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current() ; ++bcli)
+ for (const auto &bcd : bcl)
{
- if (bcli.current()->classDef->isVisibleInHierarchy())
+ if (bcd.classDef->isVisibleInHierarchy())
{
return TRUE;
}
@@ -4637,17 +4627,13 @@ void initClassHierarchy(ClassSDict *cl)
//----------------------------------------------------------------------------
-bool hasVisibleRoot(const BaseClassList *bcl)
+bool hasVisibleRoot(BaseClassList bcl)
{
- if (bcl)
+ for (const auto &bcd : bcl)
{
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current(); ++bcli)
- {
- const ClassDef *cd=bcli.current()->classDef;
- if (cd->isVisibleInHierarchy()) return TRUE;
- hasVisibleRoot(cd->baseClasses());
- }
+ const ClassDef *cd=bcd.classDef;
+ if (cd->isVisibleInHierarchy()) return TRUE;
+ hasVisibleRoot(cd->baseClasses());
}
return FALSE;
}
diff --git a/src/util.h b/src/util.h
index 43df45d..5324bf7 100644
--- a/src/util.h
+++ b/src/util.h
@@ -24,6 +24,7 @@
#include <memory>
#include <unordered_map>
+#include <algorithm>
#include <qlist.h>
#include <ctype.h>
@@ -47,7 +48,6 @@ class OutputDocInterface;
class MemberDef;
class ExampleSDict;
class ClassSDict;
-class BaseClassList;
class GroupDef;
class NamespaceSDict;
class ClassList;
@@ -310,7 +310,7 @@ QCString replaceAnonymousScopes(const QCString &s,const char *replacement=0);
void initClassHierarchy(ClassSDict *cl);
-bool hasVisibleRoot(const BaseClassList *bcl);
+bool hasVisibleRoot(BaseClassList bcl);
bool classHasVisibleChildren(const ClassDef *cd);
bool namespaceHasVisibleChild(const NamespaceDef *nd,bool includeClasses,bool filterClasses,ClassDef::CompoundType ct);
bool classVisibleInIndex(const ClassDef *cd);
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
index 12cab2d..ddb22f6 100644
--- a/src/vhdldocgen.cpp
+++ b/src/vhdldocgen.cpp
@@ -234,22 +234,16 @@ void VhdlDocGen::writeOverview()
writeVhdlEntityToolTip(t,cd);
delete port;
- BaseClassList *bl=cd->baseClasses();
- if (bl)
- {
- BaseClassListIterator bcli(*bl);
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
- {
- ClassDef *bClass=bcd->classDef;
- QCString dotn=cd->name()+":";
- dotn+=cd->name();
- QCString csc=bClass->name()+":";
- csc+=bClass->name();
- // fprintf(stderr,"\n <%s| %s>",dotn.data(),csc.data());
- writeVhdlDotLink(t,dotn,csc,0);
- }
- }// if bl
+ for (const auto &bcd : cd->baseClasses())
+ {
+ ClassDef *bClass=bcd.classDef;
+ QCString dotn=cd->name()+":";
+ dotn+=cd->name();
+ QCString csc=bClass->name()+":";
+ csc+=bClass->name();
+ // fprintf(stderr,"\n <%s| %s>",dotn.data(),csc.data());
+ writeVhdlDotLink(t,dotn,csc,0);
+ }
}// for
endDot(t);
@@ -2846,24 +2840,20 @@ bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int
return FALSE;
}
- if (cd->subClasses())
+ for (const auto &bcd :cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- for ( ; bcli.current() && !found ; ++bcli)
+ const ClassDef *ccd=bcd.classDef;
+ if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
+ //printf("isSubClass() subclass %s\n",ccd->name().data());
+ if (ccd==scd)
{
- const ClassDef *ccd=bcli.current()->classDef;
- if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
- //printf("isSubClass() subclass %s\n",ccd->name().data());
- if (ccd==scd)
- {
- found=TRUE;
- }
- else
+ found=TRUE;
+ }
+ else
+ {
+ if (level <256)
{
- if (level <256)
- {
- found=ccd->isBaseClass(scd,followInstances,level+1);
- }
+ found=ccd->isBaseClass(scd,followInstances,level+1);
}
}
}
@@ -2872,35 +2862,33 @@ bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int
void VhdlDocGen::addBaseClass(ClassDef* cd,ClassDef *ent)
{
- if (cd->baseClasses())
+ BaseClassList bcl = cd->baseClasses();
+ for (auto &bcd : bcl)
{
- BaseClassListIterator bcli(*cd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
+ ClassDef *ccd = bcd.classDef;
+ if (ccd==ent)
{
- ClassDef *ccd=bcli.current()->classDef;
- if (ccd==ent)
+ QCString n = bcd.usedName;
+ int i = n.find('(');
+ if(i<0)
{
- QCString n = bcli.current()->usedName;
- int i = n.find('(');
- if(i<0)
- {
- bcli.current()->usedName.append("(2)");
- return;
- }
- static QRegExp reg("[0-9]+");
- QCString s=n.left(i);
- QCString r=n.right(n.length()-i);
- QCString t=r;
- VhdlDocGen::deleteAllChars(r,')');
- VhdlDocGen::deleteAllChars(r,'(');
- r.setNum(r.toInt()+1);
- t.replace(reg,r.data());
- s.append(t.data());
- bcli.current()->usedName=s;
- bcli.current()->templSpecifiers=t;
+ bcd.usedName.append("(2)");
+ return;
}
+ static QRegExp reg("[0-9]+");
+ QCString s=n.left(i);
+ QCString r=n.right(n.length()-i);
+ QCString t=r;
+ VhdlDocGen::deleteAllChars(r,')');
+ VhdlDocGen::deleteAllChars(r,'(');
+ r.setNum(r.toInt()+1);
+ t.replace(reg,r.data());
+ s.append(t.data());
+ bcd.usedName=s;
+ bcd.templSpecifiers=t;
}
}
+ cd->updateBaseClasses(bcl);
}
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 5cad4ed..a842841 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -1294,73 +1294,63 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
t << " <compoundname>";
writeXMLString(t,cd->name());
t << "</compoundname>" << endl;
- if (cd->baseClasses())
+ for (const auto &bcd : cd->baseClasses())
{
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ t << " <basecompoundref ";
+ if (bcd.classDef->isLinkable())
{
- t << " <basecompoundref ";
- if (bcd->classDef->isLinkable())
- {
- t << "refid=\"" << classOutputFileBase(bcd->classDef) << "\" ";
- }
- t << "prot=\"";
- switch (bcd->prot)
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: ASSERT(0); break;
- }
- t << "\" virt=\"";
- switch(bcd->virt)
- {
- case Normal: t << "non-virtual"; break;
- case Virtual: t << "virtual"; break;
- case Pure: t <<"pure-virtual"; break;
- }
- t << "\">";
- if (!bcd->templSpecifiers.isEmpty())
- {
- t << convertToXML(
- insertTemplateSpecifierInScope(
- bcd->classDef->name(),bcd->templSpecifiers)
- );
- }
- else
- {
- t << convertToXML(bcd->classDef->displayName());
- }
- t << "</basecompoundref>" << endl;
+ t << "refid=\"" << classOutputFileBase(bcd.classDef) << "\" ";
+ }
+ t << "prot=\"";
+ switch (bcd.prot)
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: ASSERT(0); break;
}
+ t << "\" virt=\"";
+ switch(bcd.virt)
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t <<"pure-virtual"; break;
+ }
+ t << "\">";
+ if (!bcd.templSpecifiers.isEmpty())
+ {
+ t << convertToXML(
+ insertTemplateSpecifierInScope(
+ bcd.classDef->name(),bcd.templSpecifiers)
+ );
+ }
+ else
+ {
+ t << convertToXML(bcd.classDef->displayName());
+ }
+ t << "</basecompoundref>" << endl;
}
- if (cd->subClasses())
+ for (const auto &bcd : cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ t << " <derivedcompoundref refid=\""
+ << classOutputFileBase(bcd.classDef)
+ << "\" prot=\"";
+ switch (bcd.prot)
{
- t << " <derivedcompoundref refid=\""
- << classOutputFileBase(bcd->classDef)
- << "\" prot=\"";
- switch (bcd->prot)
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: ASSERT(0); break;
- }
- t << "\" virt=\"";
- switch(bcd->virt)
- {
- case Normal: t << "non-virtual"; break;
- case Virtual: t << "virtual"; break;
- case Pure: t << "pure-virtual"; break;
- }
- t << "\">" << convertToXML(bcd->classDef->displayName())
- << "</derivedcompoundref>" << endl;
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: ASSERT(0); break;
+ }
+ t << "\" virt=\"";
+ switch (bcd.virt)
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t << "pure-virtual"; break;
}
+ t << "\">" << convertToXML(bcd.classDef->displayName())
+ << "</derivedcompoundref>" << endl;
}
IncludeInfo *ii=cd->includeInfo();