summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--addon/doxyapp/doxyapp.cpp4
-rw-r--r--addon/doxyparse/doxyparse.cpp15
-rw-r--r--src/clangparser.cpp3
-rw-r--r--src/classdef.cpp166
-rw-r--r--src/classdef.h11
-rw-r--r--src/classlist.cpp130
-rw-r--r--src/classlist.h45
-rw-r--r--src/config.xml10
-rw-r--r--src/context.cpp234
-rw-r--r--src/context.h6
-rw-r--r--src/defgen.cpp8
-rw-r--r--src/dirdef.h1
-rw-r--r--src/docbookgen.cpp17
-rw-r--r--src/docparser.cpp2
-rw-r--r--src/dotgfxhierarchytable.cpp16
-rw-r--r--src/dotgfxhierarchytable.h4
-rw-r--r--src/dotgroupcollaboration.cpp15
-rw-r--r--src/doxygen.cpp392
-rw-r--r--src/doxygen.h6
-rw-r--r--src/filedef.cpp109
-rw-r--r--src/filedef.h5
-rw-r--r--src/fortrancode.l6
-rw-r--r--src/groupdef.cpp159
-rw-r--r--src/groupdef.h6
-rw-r--r--src/index.cpp632
-rw-r--r--src/latexgen.cpp54
-rw-r--r--src/linkedmap.h61
-rw-r--r--src/namespacedef.cpp141
-rw-r--r--src/namespacedef.h10
-rw-r--r--src/perlmodgen.cpp24
-rw-r--r--src/rtfgen.cpp64
-rw-r--r--src/searchindex.cpp16
-rw-r--r--src/sqlite3gen.cpp23
-rw-r--r--src/util.cpp39
-rw-r--r--src/util.h10
-rw-r--r--src/vhdldocgen.cpp57
-rw-r--r--src/vhdldocgen.h4
-rw-r--r--src/xmlgen.cpp53
-rw-r--r--templates/html/doxygen.css99
-rw-r--r--templates/html/search.js4
41 files changed, 1139 insertions, 1524 deletions
diff --git a/.gitignore b/.gitignore
index 82dab79..b599b7a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,6 @@
/doxygen.tag
/build*
+tags
+
.idea
diff --git a/addon/doxyapp/doxyapp.cpp b/addon/doxyapp/doxyapp.cpp
index 3ec8fb2..2a788b2 100644
--- a/addon/doxyapp/doxyapp.cpp
+++ b/addon/doxyapp/doxyapp.cpp
@@ -185,8 +185,8 @@ static void lookupSymbol(Definition *d)
case Definition::TypeNamespace:
{
NamespaceDef *nd = dynamic_cast<NamespaceDef*>(d);
- printf("Kind: Namespace: contains %d classes and %d namespaces\n",
- nd->getClassSDict() ? nd->getClassSDict()->count() : 0,
+ printf("Kind: Namespace: contains %zu classes and %d namespaces\n",
+ nd->getClasses().size(),
nd->getNamespaceSDict() ? nd->getNamespaceSDict()->count() : 0);
}
break;
diff --git a/addon/doxyparse/doxyparse.cpp b/addon/doxyparse/doxyparse.cpp
index 4235bf3..b5fbcb3 100644
--- a/addon/doxyparse/doxyparse.cpp
+++ b/addon/doxyparse/doxyparse.cpp
@@ -413,16 +413,11 @@ static void listSymbols() {
listMembers(ml);
}
- ClassSDict *classes = fd->getClassSDict();
- if (classes) {
- ClassDefSet visitedClasses;
- ClassSDict::Iterator cli(*classes);
- const ClassDef *cd;
- for (cli.toFirst(); (cd = cli.current()); ++cli) {
- if (visitedClasses.find(cd)==visitedClasses.end()) {
- classInformation(cd);
- visitedClasses.insert(cd);
- }
+ ClassDefSet visitedClasses;
+ for (const auto &cd : fd->getClasses()) {
+ if (visitedClasses.find(cd)==visitedClasses.end()) {
+ classInformation(cd);
+ visitedClasses.insert(cd);
}
}
}
diff --git a/src/clangparser.cpp b/src/clangparser.cpp
index 6f32576..934da31 100644
--- a/src/clangparser.cpp
+++ b/src/clangparser.cpp
@@ -26,7 +26,6 @@
//--------------------------------------------------------------------------
static std::mutex g_clangMutex;
-static std::mutex g_docCrossReferenceMutex;
ClangParser *ClangParser::instance()
{
@@ -40,6 +39,8 @@ ClangParser *ClangParser::s_instance = 0;
//--------------------------------------------------------------------------
#if USE_LIBCLANG
+static std::mutex g_docCrossReferenceMutex;
+
enum class DetectedLang { Cpp, ObjC, ObjCpp };
static QCString detab(const QCString &s)
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 9586731..315f3f6 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -177,7 +177,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
virtual QCString getReference() const;
virtual bool isReference() const;
virtual bool isLocal() const;
- virtual ClassSDict *getClassSDict() const;
+ virtual ClassLinkedRefMap getClasses() const;
virtual bool hasDocumentation() const;
virtual bool hasDetailedDescription() const;
virtual QCString collaborationGraphFileName() const;
@@ -236,12 +236,10 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
virtual QCString anchor() const;
virtual bool isEmbeddedInOuterScope() const;
virtual bool isSimple() const;
- virtual const ClassList *taggedInnerClasses() const;
- virtual ClassDef *tagLessReference() const;
+ virtual const ClassDef *tagLessReference() const;
virtual MemberDef *isSmartPointer() const;
virtual bool isJavaEnum() const;
virtual bool isGeneric() const;
- virtual const ClassSDict *innerClasses() const;
virtual QCString title() const;
virtual QCString generatedFromFiles() const;
virtual const FileList &usedFiles() const;
@@ -282,8 +280,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
virtual void makeTemplateArgument(bool b=TRUE);
virtual void setCategoryOf(ClassDef *cd);
virtual void setUsedOnly(bool b);
- virtual void addTaggedInnerClass(ClassDef *cd);
- virtual void setTagLessReference(ClassDef *cd);
+ virtual void setTagLessReference(const ClassDef *cd);
virtual void setName(const char *name);
virtual void setMetaData(const char *md);
virtual void findSectionsInDocumentation();
@@ -406,8 +403,8 @@ class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
{ return getCdAlias()->isReference(); }
virtual bool isLocal() const
{ return getCdAlias()->isLocal(); }
- virtual ClassSDict *getClassSDict() const
- { return getCdAlias()->getClassSDict(); }
+ virtual ClassLinkedRefMap getClasses() const
+ { return getCdAlias()->getClasses(); }
virtual bool hasDocumentation() const
{ return getCdAlias()->hasDocumentation(); }
virtual bool hasDetailedDescription() const
@@ -519,9 +516,7 @@ class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
{ return getCdAlias()->isEmbeddedInOuterScope(); }
virtual bool isSimple() const
{ return getCdAlias()->isSimple(); }
- virtual const ClassList *taggedInnerClasses() const
- { return getCdAlias()->taggedInnerClasses(); }
- virtual ClassDef *tagLessReference() const
+ virtual const ClassDef *tagLessReference() const
{ return getCdAlias()->tagLessReference(); }
virtual MemberDef *isSmartPointer() const
{ return getCdAlias()->isSmartPointer(); }
@@ -529,8 +524,6 @@ class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
{ return getCdAlias()->isJavaEnum(); }
virtual bool isGeneric() const
{ return getCdAlias()->isGeneric(); }
- virtual const ClassSDict *innerClasses() const
- { return getCdAlias()->innerClasses(); }
virtual QCString title() const
{ return getCdAlias()->title(); }
virtual QCString generatedFromFiles() const
@@ -657,7 +650,7 @@ class ClassDefImpl::IMPL
/*! The inner classes contained in this class. Will be 0 if there are
* no inner classes.
*/
- ClassSDict *innerClasses = 0;
+ ClassLinkedRefMap innerClasses;
/* classes for the collaboration diagram */
UsesClassDict *usesImplClassDict = 0;
@@ -727,8 +720,7 @@ class ClassDefImpl::IMPL
/** Does this class overloaded the -> operator? */
MemberDef *arrowOperator = 0;
- ClassList *taggedInnerClasses = 0;
- ClassDef *tagLessRef = 0;
+ const ClassDef *tagLessRef = 0;
/** Does this class represent a Java style enum? */
bool isJavaEnum = false;
@@ -761,7 +753,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
usesIntfClassDict=0;
constraintClassDict=0;
memberGroupSDict = 0;
- innerClasses = 0;
subGrouping=Config_getBool(SUBGROUPING);
templateInstances = 0;
variableInstances = 0;
@@ -775,7 +766,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
usedOnly = FALSE;
isSimple = Config_getBool(INLINE_SIMPLE_STRUCTS);
arrowOperator = 0;
- taggedInnerClasses = 0;
tagLessRef = 0;
spec=0;
//QCString ns;
@@ -810,11 +800,9 @@ ClassDefImpl::IMPL::~IMPL()
delete constraintClassDict;
delete incInfo;
delete memberGroupSDict;
- delete innerClasses;
delete templateInstances;
delete variableInstances;
delete templBaseClassNames;
- delete taggedInnerClasses;
}
//-------------------------------------------------------------------------------------------
@@ -2051,18 +2039,12 @@ void ClassDefImpl::writeMemberGroups(OutputList &ol,bool showInline) const
void ClassDefImpl::writeNestedClasses(OutputList &ol,const QCString &title) const
{
// nested classes
- if (m_impl->innerClasses)
- {
- m_impl->innerClasses->writeDeclaration(ol,0,title,TRUE);
- }
+ m_impl->innerClasses.writeDeclaration(ol,0,title,TRUE);
}
void ClassDefImpl::writeInlineClasses(OutputList &ol) const
{
- if (m_impl->innerClasses)
- {
- m_impl->innerClasses->writeDocumentation(ol,this);
- }
+ m_impl->innerClasses.writeDocumentation(ol,this);
}
void ClassDefImpl::startMemberDocumentation(OutputList &ol) const
@@ -2133,8 +2115,7 @@ void ClassDefImpl::writeSummaryLinks(OutputList &ol) const
for (eli.toFirst();(lde=eli.current());++eli)
{
if (lde->kind()==LayoutDocEntry::ClassNestedClasses &&
- m_impl->innerClasses &&
- m_impl->innerClasses->declVisible()
+ m_impl->innerClasses.declVisible()
)
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
@@ -2236,20 +2217,15 @@ void ClassDefImpl::writeTagFile(FTextStream &tagFile)
{
case LayoutDocEntry::ClassNestedClasses:
{
- if (m_impl->innerClasses)
+ for (const auto &innerCd : m_impl->innerClasses)
{
- ClassSDict::Iterator cli(*m_impl->innerClasses);
- ClassDef *innerCd;
- for (cli.toFirst();(innerCd=cli.current());++cli)
+ if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
+ protectionLevelVisible(innerCd->protection()) &&
+ !innerCd->isEmbeddedInOuterScope()
+ )
{
- if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
- protectionLevelVisible(innerCd->protection()) &&
- !innerCd->isEmbeddedInOuterScope()
- )
- {
- tagFile << " <class kind=\"" << innerCd->compoundTypeString() <<
- "\">" << convertToXML(innerCd->name()) << "</class>" << endl;
- }
+ tagFile << " <class kind=\"" << innerCd->compoundTypeString() <<
+ "\">" << convertToXML(innerCd->name()) << "</class>" << endl;
}
}
}
@@ -2873,25 +2849,25 @@ void ClassDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *current
const MemberDef *md=mi->memberDef();
if (md->getClassDef()==this && md->isLinkable() && !md->isEnumValue())
{
- ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
{
if (md==currentMd) // selected item => highlight
{
- ol.writeString("<a class=\"qindexHL\" ");
+ ol.writeString(" <tr><td class=\"navtabHL\">");
}
else
{
- ol.writeString("<a class=\"qindex\" ");
+ ol.writeString(" <tr><td class=\"navtab\">");
}
+ ol.writeString("<a class=\"navtab\" ");
ol.writeString("href=\"");
if (createSubDirs) ol.writeString("../../");
ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
ol.writeString("\">");
ol.writeString(convertToHtml(md->name()));
ol.writeString("</a>");
+ ol.writeString("</td></tr>\n");
}
- ol.writeString("</td></tr>\n");
}
}
}
@@ -2906,27 +2882,22 @@ void ClassDefImpl::writeDocumentationForInnerClasses(OutputList &ol) const
{
// write inner classes after the parent, so the tag files contain
// the definition in proper order!
- if (m_impl->innerClasses)
+ for (const auto &innerCd : m_impl->innerClasses)
{
- ClassSDict::Iterator cli(*m_impl->innerClasses);
- ClassDef *innerCd;
- for (cli.toFirst();(innerCd=cli.current());++cli)
+ ClassDefMutable *innerCdm = toClassDefMutable(innerCd);
+ if (innerCdm)
{
- ClassDefMutable *innerCdm = toClassDefMutable(innerCd);
- if (innerCdm)
+ if (
+ innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
+ protectionLevelVisible(innerCd->protection()) &&
+ !innerCd->isEmbeddedInOuterScope()
+ )
{
- if (
- innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
- protectionLevelVisible(innerCd->protection()) &&
- !innerCd->isEmbeddedInOuterScope()
- )
- {
- msg("Generating docs for nested compound %s...\n",qPrint(innerCd->name()));
- innerCdm->writeDocumentation(ol);
- innerCdm->writeMemberList(ol);
- }
- innerCdm->writeDocumentationForInnerClasses(ol);
+ msg("Generating docs for nested compound %s...\n",qPrint(innerCd->name()));
+ innerCdm->writeDocumentation(ol);
+ innerCdm->writeMemberList(ol);
}
+ innerCdm->writeDocumentationForInnerClasses(ol);
}
}
}
@@ -3251,10 +3222,17 @@ void ClassDefImpl::addTypeConstraint(const QCString &typeConstraint,const QCStri
ClassDefMutable *cd = resolver.resolveClassMutable(this,typeConstraint);
if (cd==0 && !hideUndocRelation)
{
- cd = new ClassDefImpl(getDefFileName(),getDefLine(),getDefColumn(),typeConstraint,ClassDef::Class);
+ cd = toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(typeConstraint,
+ std::unique_ptr<ClassDef>(
+ new ClassDefImpl(
+ getDefFileName(),getDefLine(),
+ getDefColumn(),
+ typeConstraint,
+ ClassDef::Class))));
+
cd->setUsedOnly(TRUE);
cd->setLanguage(getLanguage());
- Doxygen::hiddenClasses->append(typeConstraint,cd);
//printf("Adding undocumented constraint '%s' to class %s on type %s\n",
// typeConstraint.data(),name().data(),type.data());
}
@@ -4046,23 +4024,13 @@ void ClassDefImpl::addInnerCompound(const Definition *d)
if (d->definitionType()==Definition::TypeClass) // only classes can be
// nested in classes.
{
- if (m_impl->innerClasses==0)
- {
- m_impl->innerClasses = new ClassSDict(17);
- }
- m_impl->innerClasses->inSort(d->localName(),toClassDef(d));
+ m_impl->innerClasses.add(d->localName(),toClassDef(d));
}
}
const Definition *ClassDefImpl::findInnerCompound(const char *name) const
{
- const Definition *result=0;
- if (name==0) return 0;
- if (m_impl->innerClasses)
- {
- result = m_impl->innerClasses->find(name);
- }
- return result;
+ return m_impl->innerClasses.find(name);
}
ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
@@ -4078,8 +4046,11 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
{
Debug::print(Debug::Classes,0," New template instance class '%s''%s'\n",qPrint(name()),qPrint(templSpec));
QCString tcname = removeRedundantWhiteSpace(localName()+templSpec);
- templateClass = new ClassDefImpl(
- fileName,startLine,startColumn,tcname,ClassDef::Class);
+ templateClass =
+ toClassDefMutable(
+ Doxygen::classLinkedMap->add(tcname,
+ std::unique_ptr<ClassDef>(
+ new ClassDefImpl(fileName,startLine,startColumn,tcname,ClassDef::Class))));
templateClass->setTemplateMaster(this);
templateClass->setOuterScope(getOuterScope());
templateClass->setHidden(isHidden());
@@ -4354,10 +4325,14 @@ void ClassDefImpl::sortMemberLists()
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
}
- if (m_impl->innerClasses)
- {
- m_impl->innerClasses->sort();
- }
+ std::sort(m_impl->innerClasses.begin(),
+ m_impl->innerClasses.end(),
+ [](const auto &c1,const auto &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name() )<0 :
+ qstricmp(c1->className(), c2->className())<0 ;
+ });
}
int ClassDefImpl::countMemberDeclarations(MemberListType lt,const ClassDef *inheritedFrom,
@@ -4728,7 +4703,7 @@ bool ClassDefImpl::isLocal() const
return m_impl->isLocal;
}
-ClassSDict *ClassDefImpl::getClassSDict() const
+ClassLinkedRefMap ClassDefImpl::getClasses() const
{
return m_impl->innerClasses;
}
@@ -5023,26 +4998,12 @@ bool ClassDefImpl::isEmbeddedInOuterScope() const
return b1 || b2; // either reason will do
}
-const ClassList *ClassDefImpl::taggedInnerClasses() const
-{
- return m_impl->taggedInnerClasses;
-}
-
-void ClassDefImpl::addTaggedInnerClass(ClassDef *cd)
-{
- if (m_impl->taggedInnerClasses==0)
- {
- m_impl->taggedInnerClasses = new ClassList;
- }
- m_impl->taggedInnerClasses->append(cd);
-}
-
-ClassDef *ClassDefImpl::tagLessReference() const
+const ClassDef *ClassDefImpl::tagLessReference() const
{
return m_impl->tagLessRef;
}
-void ClassDefImpl::setTagLessReference(ClassDef *cd)
+void ClassDefImpl::setTagLessReference(const ClassDef *cd)
{
m_impl->tagLessRef = cd;
}
@@ -5081,11 +5042,6 @@ bool ClassDefImpl::isExtension() const
return b;
}
-const ClassSDict *ClassDefImpl::innerClasses() const
-{
- return m_impl->innerClasses;
-}
-
const FileList &ClassDefImpl::usedFiles() const
{
return m_impl->files;
diff --git a/src/classdef.h b/src/classdef.h
index 54664e5..6d2bbef 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -35,7 +35,7 @@ class MemberDefMutable;
class MemberList;
class MemberDict;
class ClassList;
-class ClassSDict;
+class ClassLinkedRefMap;
class OutputList;
class FileDef;
class FileList;
@@ -133,7 +133,7 @@ class ClassDef : public Definition
virtual bool isLocal() const = 0;
/** returns the classes nested into this class */
- virtual ClassSDict *getClassSDict() const = 0;
+ virtual ClassLinkedRefMap getClasses() const = 0;
/** returns TRUE if this class has documentation */
virtual bool hasDocumentation() const = 0;
@@ -334,15 +334,13 @@ class ClassDef : public Definition
virtual bool isSimple() const = 0;
- virtual const ClassList *taggedInnerClasses() const = 0;
- virtual ClassDef *tagLessReference() const = 0;
+ virtual const ClassDef *tagLessReference() const = 0;
virtual MemberDef *isSmartPointer() const = 0;
virtual bool isJavaEnum() const = 0;
virtual bool isGeneric() const = 0;
- virtual const ClassSDict *innerClasses() const = 0;
virtual QCString title() const = 0;
virtual QCString generatedFromFiles() const = 0;
@@ -401,7 +399,7 @@ class ClassDefMutable : public DefinitionMutable, public ClassDef
virtual void setTypeConstraints(const ArgumentList &al) = 0;
virtual void setCategoryOf(ClassDef *cd) = 0;
virtual void setUsedOnly(bool b) = 0;
- virtual void setTagLessReference(ClassDef *cd) = 0;
+ virtual void setTagLessReference(const ClassDef *cd) = 0;
virtual void setName(const char *name) = 0;
virtual void setMetaData(const char *md) = 0;
@@ -414,7 +412,6 @@ class ClassDefMutable : public DefinitionMutable, public ClassDef
virtual void insertMember(MemberDef *) = 0;
virtual void insertUsedFile(FileDef *) = 0;
virtual void addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec) = 0;
- virtual void addTaggedInnerClass(ClassDef *cd) = 0;
virtual void addInnerCompound(const Definition *d) = 0;
virtual bool addExample(const char *anchor,const char *name, const char *file) = 0;
virtual void addUsedClass(ClassDef *cd,const char *accessName,Protection prot) = 0;
diff --git a/src/classlist.cpp b/src/classlist.cpp
index d0f37ce..2998ac4 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -52,72 +52,59 @@ int ClassList::compareValues(const ClassDef *item1, const ClassDef *item2) const
return compItems(item1,item2);
}
-int ClassSDict::compareValues(const ClassDef *item1, const ClassDef *item2) const
-{
- return compItems(item1,item2);
-}
-
ClassListIterator::ClassListIterator(const ClassList &cllist) :
QListIterator<ClassDef>(cllist)
{
}
-bool ClassSDict::declVisible(const ClassDef::CompoundType *filter) const
+//-------------------------------------------
+
+bool ClassLinkedRefMap::declVisible(const ClassDef::CompoundType *filter) const
{
- static bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
- static bool extractLocalClasses = Config_getBool(EXTRACT_LOCAL_CLASSES);
- if (count()>0)
+ bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
+ bool extractLocalClasses = Config_getBool(EXTRACT_LOCAL_CLASSES);
+ for (const auto &cd : *this)
{
- ClassSDict::Iterator sdi(*this);
- ClassDef *cd=0;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ (filter==0 || *filter==cd->compoundType())
+ )
{
- if (!cd->isAnonymous() &&
- (filter==0 || *filter==cd->compoundType())
+ bool isLink = cd->isLinkable();
+ if (isLink ||
+ (!hideUndocClasses &&
+ (!cd->isLocal() || extractLocalClasses)
+ )
)
{
- bool isLink = cd->isLinkable();
- if (isLink ||
- (!hideUndocClasses &&
- (!cd->isLocal() || extractLocalClasses)
- )
- )
- {
- return TRUE;
- }
+ return true;
}
}
}
- return FALSE;
+ return false;
}
-void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,
- const char *header,bool localNames) const
+void ClassLinkedRefMap::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,
+ const char *header,bool localNames) const
{
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
- if (count()>0)
+ bool found=FALSE;
+ for (const auto &cd : *this)
{
- ClassSDict::Iterator sdi(*this);
- ClassDef *cd=0;
- bool found=FALSE;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ //printf(" ClassLinkedRefMap::writeDeclaration for %s\n",cd->name().data());
+ if (!cd->isAnonymous() &&
+ !cd->isExtension() &&
+ (cd->protection()!=Private || extractPrivate) &&
+ (filter==0 || *filter==cd->compoundType())
+ )
{
- //printf(" ClassSDict::writeDeclaration for %s\n",cd->name().data());
- if (!cd->isAnonymous() &&
- !cd->isExtension() &&
- (cd->protection()!=Private || extractPrivate) &&
- (filter==0 || *filter==cd->compoundType())
- )
- {
- //printf("writeDeclarationLink()\n");
- cd->writeDeclarationLink(ol,found,header,localNames);
- }
+ //printf("writeDeclarationLink()\n");
+ cd->writeDeclarationLink(ol,found,header,localNames);
}
- if (found) ol.endMemberList();
}
+ if (found) ol.endMemberList();
}
-void ClassSDict::writeDocumentation(OutputList &ol,const Definition * container) const
+void ClassLinkedRefMap::writeDocumentation(OutputList &ol,const Definition * container) const
{
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
@@ -125,40 +112,35 @@ void ClassSDict::writeDocumentation(OutputList &ol,const Definition * container)
static bool inlineSimpleClasses = Config_getBool(INLINE_SIMPLE_STRUCTS);
if (!inlineGroupedClasses && !inlineSimpleClasses) return;
- if (count()>0)
- {
- bool found=FALSE;
+ bool found=FALSE;
- ClassSDict::Iterator sdi(*this);
- ClassDef *cd=0;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ for (const auto &cd : *this)
+ {
+ //printf("%s:writeDocumentation() %p linkable=%d embedded=%d container=%p partOfGroups=%d\n",
+ // cd->name().data(),cd->getOuterScope(),cd->isLinkableInProject(),cd->isEmbeddedInOuterScope(),
+ // container,cd->partOfGroups() ? cd->partOfGroups()->count() : 0);
+
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ !cd->isAlias() &&
+ (container==0 || cd->partOfGroups()==0) // if container==0 -> show as part of the group docs, otherwise only show if not part of a group
+ )
{
- //printf("%s:writeDocumentation() %p linkable=%d embedded=%d container=%p partOfGroups=%d\n",
- // cd->name().data(),cd->getOuterScope(),cd->isLinkableInProject(),cd->isEmbeddedInOuterScope(),
- // container,cd->partOfGroups() ? cd->partOfGroups()->count() : 0);
-
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- !cd->isAlias() &&
- (container==0 || cd->partOfGroups()==0) // if container==0 -> show as part of the group docs, otherwise only show if not part of a group
- )
+ //printf(" showing class %s\n",cd->name().data());
+ if (!found)
+ {
+ ol.writeRuler();
+ ol.startGroupHeader();
+ ol.parseText(fortranOpt?theTranslator->trTypeDocumentation():
+ theTranslator->trClassDocumentation());
+ ol.endGroupHeader();
+ found=TRUE;
+ }
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
{
- //printf(" showing class %s\n",cd->name().data());
- if (!found)
- {
- ol.writeRuler();
- ol.startGroupHeader();
- ol.parseText(fortranOpt?theTranslator->trTypeDocumentation():
- theTranslator->trClassDocumentation());
- ol.endGroupHeader();
- found=TRUE;
- }
- ClassDefMutable *cdm = toClassDefMutable(cd);
- if (cdm)
- {
- cdm->writeInlineDocumentation(ol);
- }
+ cdm->writeInlineDocumentation(ol);
}
}
}
diff --git a/src/classlist.h b/src/classlist.h
index 6e4281f..9ff53db 100644
--- a/src/classlist.h
+++ b/src/classlist.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 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.
*
@@ -21,6 +21,7 @@
#include <qlist.h>
#include <qdict.h>
+#include "linkedmap.h"
#include "classdef.h"
#include "sortdict.h"
@@ -44,28 +45,6 @@ class ClassListIterator : public QListIterator<ClassDef>
ClassListIterator(const ClassList &list);
};
-/** An unsorted dictionary of ClassDef objects. */
-class ClassDict : public QDict<ClassDef>
-{
- public:
- ClassDict(uint size) : QDict<ClassDef>(size) {}
- ~ClassDict() {}
-};
-
-/** A sorted dictionary of ClassDef objects. */
-class ClassSDict : public SDict<ClassDef>
-{
- public:
- ClassSDict(uint size=17) : SDict<ClassDef>(size) {}
- ~ClassSDict() {}
- void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
- const char *header=0,bool localNames=FALSE) const;
- void writeDocumentation(OutputList &ol,const Definition *container=0) const;
- bool declVisible(const ClassDef::CompoundType *filter=0) const;
- private:
- int compareValues(const ClassDef *item1,const ClassDef *item2) const;
-};
-
class GenericsCollection : public QIntDict<ClassDef>
{
public:
@@ -73,7 +52,7 @@ class GenericsCollection : public QIntDict<ClassDef>
~GenericsCollection() {}
};
-class GenericsSDict
+class GenericsSDict
{
public:
GenericsSDict() : m_dict(17) { m_dict.setAutoDelete(TRUE); }
@@ -84,4 +63,18 @@ class GenericsSDict
SDict<GenericsCollection> m_dict;
};
+class ClassLinkedMap : public LinkedMap<ClassDef>
+{
+};
+
+class ClassLinkedRefMap : public LinkedRefMap<const ClassDef>
+{
+ public:
+ bool declVisible(const ClassDef::CompoundType *filter=0) const;
+ void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,const char *header,bool localNames) const;
+ void writeDocumentation(OutputList &ol,const Definition * container=0) const;
+};
+
+
+
#endif
diff --git a/src/config.xml b/src/config.xml
index 0701924..3f0d406 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -174,7 +174,6 @@ FILE_PATTERNS = *.cpp *.h q*.doc
RECURSIVE = YES
EXCLUDE_PATTERNS = *codec.cpp moc_* */compat/* */3rdparty/*
ALPHABETICAL_INDEX = YES
-COLS_IN_ALPHA_INDEX = 3
IGNORE_PREFIX = Q
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
@@ -1778,14 +1777,6 @@ to disable this feature.
]]>
</docs>
</option>
- <option type='int' id='COLS_IN_ALPHA_INDEX' minval='1' maxval='20' defval='5' depends='ALPHABETICAL_INDEX'>
- <docs>
-<![CDATA[
- The \c COLS_IN_ALPHA_INDEX tag can be
- used to specify the number of columns in which the alphabetical index list will be split.
-]]>
- </docs>
- </option>
<option type='list' id='IGNORE_PREFIX' format='string' depends='ALPHABETICAL_INDEX'>
<docs>
<![CDATA[
@@ -3739,5 +3730,6 @@ temporary files.
<option type='obsolete' id='PERL_PATH'/>
<option type='obsolete' id='MSCGEN_PATH'/>
<option type='obsolete' id='TCL_SUBST'/>
+ <option type='obsolete' id='COLS_IN_ALPHA_INDEX'/>
</group>
</doxygenconfig>
diff --git a/src/context.cpp b/src/context.cpp
index 074e6ec..213e068 100644
--- a/src/context.cpp
+++ b/src/context.cpp
@@ -2317,16 +2317,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
if (!cache.classes)
{
TemplateList *classList = TemplateList::alloc();
- if (m_classDef->getClassSDict())
+ for (const auto &cd : m_classDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (cd->visibleInParentsDeclList())
{
- if (cd->visibleInParentsDeclList())
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.classes.reset(classList);
@@ -2339,20 +2334,15 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
if (!cache.innerClasses)
{
TemplateList *classList = TemplateList::alloc();
- if (m_classDef->getClassSDict())
+ for (const auto &cd : m_classDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups()==0
+ )
{
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- cd->partOfGroups()==0
- )
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.innerClasses.reset(classList);
@@ -2752,22 +2742,17 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
TemplateList *classList = TemplateList::alloc();
- if (m_namespaceDef->getClassSDict())
+ for (const auto &cd : m_namespaceDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (sliceOpt && (cd->compoundType()==ClassDef::Struct ||
+ cd->compoundType()==ClassDef::Interface ||
+ cd->compoundType()==ClassDef::Exception))
{
- if (sliceOpt && (cd->compoundType()==ClassDef::Struct ||
- cd->compoundType()==ClassDef::Interface ||
- cd->compoundType()==ClassDef::Exception))
- {
- continue; // These types appear in their own sections.
- }
- if (cd->visibleInParentsDeclList())
- {
- classList->append(ClassContext::alloc(cd));
- }
+ continue; // These types appear in their own sections.
+ }
+ if (cd->visibleInParentsDeclList())
+ {
+ classList->append(ClassContext::alloc(cd));
}
}
cache.classes.reset(classList);
@@ -2920,19 +2905,14 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
if (!cache.inlineClasses)
{
TemplateList *classList = TemplateList::alloc();
- if (m_namespaceDef->getClassSDict())
+ for (const auto &cd : m_namespaceDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups()==0)
{
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- cd->partOfGroups()==0)
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.inlineClasses.reset(classList);
@@ -3217,16 +3197,11 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
if (!cache.classes)
{
TemplateList *classList = TemplateList::alloc();
- if (m_fileDef->getClassSDict())
+ for (const auto &cd : m_fileDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (cd->visibleInParentsDeclList())
{
- if (cd->visibleInParentsDeclList())
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.classes.reset(classList);
@@ -3384,19 +3359,14 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
if (!cache.inlineClasses)
{
TemplateList *classList = TemplateList::alloc();
- if (m_fileDef->getClassSDict())
+ for (const auto &cd : m_fileDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups()==0)
{
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- cd->partOfGroups()==0)
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.inlineClasses.reset(classList);
@@ -5509,16 +5479,11 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.classes)
{
TemplateList *classList = TemplateList::alloc();
- if (m_groupDef->getClasses())
+ for (const auto &cd : m_groupDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_groupDef->getClasses());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (cd->visibleInParentsDeclList())
{
- if (cd->visibleInParentsDeclList())
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.classes.reset(classList);
@@ -5725,19 +5690,14 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.inlineClasses)
{
TemplateList *classList = TemplateList::alloc();
- if (m_groupDef->getClasses())
+ for (const auto &cd : m_groupDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_groupDef->getClasses());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups()==0)
{
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- cd->partOfGroups()==0)
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.inlineClasses.reset(classList);
@@ -5824,11 +5784,9 @@ TemplateVariant ModuleContext::get(const char *n) const
class ClassListContext::Private : public GenericNodeListContext
{
public:
- void addClasses(const ClassSDict &classSDict)
+ void addClasses(const ClassLinkedMap &classLinkedMap)
{
- ClassSDict::Iterator cli(classSDict);
- const ClassDef *cd;
- for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : classLinkedMap)
{
if (cd->getLanguage()==SrcLangExt_VHDL &&
((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
@@ -5840,7 +5798,7 @@ class ClassListContext::Private : public GenericNodeListContext
if (cd->isLinkableInProject() && cd->templateMaster()==0 &&
!cd->isHidden() && !cd->isEmbeddedInOuterScope())
{
- append(ClassContext::alloc(cd));
+ append(ClassContext::alloc(cd.get()));
}
}
}
@@ -5849,8 +5807,8 @@ class ClassListContext::Private : public GenericNodeListContext
ClassListContext::ClassListContext() : RefCountedContext("ClassListContext")
{
p = new Private;
- p->addClasses(*Doxygen::classSDict);
- p->addClasses(*Doxygen::hiddenClasses);
+ p->addClasses(*Doxygen::classLinkedMap);
+ p->addClasses(*Doxygen::hiddenClassLinkedMap);
}
ClassListContext::~ClassListContext()
@@ -5903,11 +5861,9 @@ class ClassIndexContext::Private
if (!m_cache.classes)
{
TemplateList *classList = TemplateList::alloc();
- if (Doxygen::classSDict)
+ if (Doxygen::classLinkedMap)
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->getLanguage()==SrcLangExt_VHDL &&
((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
@@ -5918,7 +5874,7 @@ class ClassIndexContext::Private
}
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
- classList->append(ClassContext::alloc(cd));
+ classList->append(ClassContext::alloc(cd.get()));
}
}
}
@@ -6070,8 +6026,8 @@ class ClassHierarchyContext::Private
{
m_classTree.reset(NestingContext::alloc(0,0));
ClassDefSet visitedClasses;
- m_classTree->addClassHierarchy(*Doxygen::classSDict,visitedClasses);
- m_classTree->addClassHierarchy(*Doxygen::hiddenClasses,visitedClasses);
+ m_classTree->addClassHierarchy(*Doxygen::classLinkedMap,visitedClasses);
+ m_classTree->addClassHierarchy(*Doxygen::hiddenClassLinkedMap,visitedClasses);
//%% ClassInheritance tree
static bool init=FALSE;
if (!init)
@@ -6438,9 +6394,9 @@ class NestingNodeContext::Private
}
else
{
- if (cd && cd->getClassSDict())
+ if (cd)
{
- m_children->addClasses(*cd->getClassSDict(),FALSE,visitedClasses);
+ m_children->addClasses(cd->getClasses(),FALSE,visitedClasses);
}
}
}
@@ -6451,9 +6407,9 @@ class NestingNodeContext::Private
{
m_children->addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses,visitedClasses);
}
- if (addClasses && nd && nd->getClassSDict())
+ if (addClasses && nd)
{
- m_children->addClasses(*nd->getClassSDict(),FALSE,visitedClasses);
+ m_children->addClasses(nd->getClasses(),FALSE,visitedClasses);
}
}
void addDirFiles(ClassDefSet &visitedClasses)
@@ -6559,35 +6515,44 @@ class NestingContext::Private : public GenericNodeListContext
}
}
}
- void addClasses(const ClassSDict &clDict,bool rootOnly,ClassDefSet &visitedClasses)
+ void addClass(const ClassDef *cd,bool rootOnly,ClassDefSet &visitedClasses)
{
- ClassSDict::Iterator cli(clDict);
- const ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ if (cd->getLanguage()==SrcLangExt_VHDL)
{
- if (cd->getLanguage()==SrcLangExt_VHDL)
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
+ (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
+ )// no architecture
{
- if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
- (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
- )// no architecture
- {
- continue;
- }
+ return;
}
- if (!rootOnly ||
- cd->getOuterScope()==0 ||
- cd->getOuterScope()==Doxygen::globalScope
- )
+ }
+ if (!rootOnly ||
+ cd->getOuterScope()==0 ||
+ cd->getOuterScope()==Doxygen::globalScope
+ )
+ {
+ if (classVisibleInIndex(cd) && cd->templateMaster()==0)
{
- if (classVisibleInIndex(cd) && cd->templateMaster()==0)
- {
- NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,FALSE,FALSE,visitedClasses);
- append(nnc);
- m_index++;
- }
+ NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,FALSE,FALSE,visitedClasses);
+ append(nnc);
+ m_index++;
}
}
}
+ void addClasses(const ClassLinkedRefMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses)
+ {
+ for (const auto &cd : clLinkedMap)
+ {
+ addClass(cd,rootOnly,visitedClasses);
+ }
+ }
+ void addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses)
+ {
+ for (const auto &cd : clLinkedMap)
+ {
+ addClass(cd.get(),rootOnly,visitedClasses);
+ }
+ }
void addDirs(const DirSDict &dirDict,ClassDefSet &visitedClasses)
{
SDict<DirDef>::Iterator dli(dirDict);
@@ -6705,11 +6670,9 @@ class NestingContext::Private : public GenericNodeListContext
}
}
}
- void addClassHierarchy(const ClassSDict &classSDict,ClassDefSet &visitedClasses)
+ void addClassHierarchy(const ClassLinkedMap &classLinkedMap,ClassDefSet &visitedClasses)
{
- ClassSDict::Iterator cli(classSDict);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : classLinkedMap)
{
bool b;
if (cd->getLanguage()==SrcLangExt_VHDL)
@@ -6729,7 +6692,7 @@ class NestingContext::Private : public GenericNodeListContext
if (cd->isVisibleInHierarchy()) // should it be visible
{
// new root level class
- NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,FALSE,visitedClasses);
+ NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd.get(),m_index,m_level,TRUE,TRUE,FALSE,visitedClasses);
append(nnc);
m_index++;
}
@@ -6769,9 +6732,14 @@ TemplateListIntf::ConstIterator *NestingContext::createIterator() const
return p->createIterator();
}
-void NestingContext::addClasses(const ClassSDict &clDict,bool rootOnly,ClassDefSet &visitedClasses)
+void NestingContext::addClasses(const ClassLinkedRefMap &clLinkedRefMap,bool rootOnly,ClassDefSet &visitedClasses)
+{
+ p->addClasses(clLinkedRefMap,rootOnly,visitedClasses);
+}
+
+void NestingContext::addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses)
{
- p->addClasses(clDict,rootOnly,visitedClasses);
+ p->addClasses(clLinkedMap,rootOnly,visitedClasses);
}
void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses)
@@ -6814,9 +6782,9 @@ void NestingContext::addModules(const GroupList &modules,ClassDefSet &visitedCla
p->addModules(modules,visitedClasses);
}
-void NestingContext::addClassHierarchy(const ClassSDict &classSDict,ClassDefSet &visitedClasses)
+void NestingContext::addClassHierarchy(const ClassLinkedMap &classLinkedMap,ClassDefSet &visitedClasses)
{
- p->addClassHierarchy(classSDict,visitedClasses);
+ p->addClassHierarchy(classLinkedMap,visitedClasses);
}
void NestingContext::addDerivedClasses(const BaseClassList &bcl,bool hideSuper,ClassDefSet &visitedClasses)
@@ -6839,9 +6807,9 @@ class ClassTreeContext::Private
{
m_classTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE,visitedClasses);
}
- if (Doxygen::classSDict)
+ if (Doxygen::classLinkedMap)
{
- m_classTree->addClasses(*Doxygen::classSDict,TRUE,visitedClasses);
+ m_classTree->addClasses(*Doxygen::classLinkedMap,TRUE,visitedClasses);
}
//%% Nesting tree
static bool init=FALSE;
diff --git a/src/context.h b/src/context.h
index dca5d91..709fc83 100644
--- a/src/context.h
+++ b/src/context.h
@@ -31,6 +31,7 @@ class NamespaceSDict;
class FileDef;
class FileList;
class FileNameLinkedMap;
+class ClassLinkedMap;
class DirSDict;
class DirDef;
class PageSDict;
@@ -544,7 +545,8 @@ class NestingContext : public RefCountedContext, public TemplateListIntf
virtual int release() { return RefCountedContext::release(); }
void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses);
- void addClasses(const ClassSDict &clDict,bool rootOnly,ClassDefSet &visitedClasses);
+ void addClasses(const ClassLinkedRefMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses);
+ void addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses);
void addDirs(const DirSDict &,ClassDefSet &visitedClasses);
void addDirs(const DirList &,ClassDefSet &visitedClasses);
void addFiles(const FileNameLinkedMap &,ClassDefSet &visitedClasses);
@@ -552,7 +554,7 @@ class NestingContext : public RefCountedContext, public TemplateListIntf
void addPages(const PageSDict &pages,bool rootOnly,ClassDefSet &visitedClasses);
void addModules(const GroupSDict &modules,ClassDefSet &visitedClasses);
void addModules(const GroupList &modules,ClassDefSet &visitedClasses);
- void addClassHierarchy(const ClassSDict &clDict,ClassDefSet &visitedClasses);
+ void addClassHierarchy(const ClassLinkedMap &clLinkedMap,ClassDefSet &visitedClasses);
void addDerivedClasses(const BaseClassList &bcl,bool hideSuper,ClassDefSet &visitedClasses);
private:
diff --git a/src/defgen.cpp b/src/defgen.cpp
index 82f7c26..a1cd28d 100644
--- a/src/defgen.cpp
+++ b/src/defgen.cpp
@@ -588,13 +588,11 @@ void generateDEF()
FTextStream t(&f);
t << "AutoGen Definitions dummy;" << endl;
- if (Doxygen::classSDict->count()+Doxygen::inputNameLinkedMap->size()>0)
+ if (Doxygen::classLinkedMap->size()+Doxygen::inputNameLinkedMap->size()>0)
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- generateDEFForClass(cd,t);
+ generateDEFForClass(cd.get(),t);
}
for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
diff --git a/src/dirdef.h b/src/dirdef.h
index 32fa442..1057049 100644
--- a/src/dirdef.h
+++ b/src/dirdef.h
@@ -24,7 +24,6 @@
#include <qcstring.h>
class FileList;
-class ClassSDict;
class QStrList;
class FileDef;
class OutputList;
diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp
index 385c2ef..d378703 100644
--- a/src/docbookgen.cpp
+++ b/src/docbookgen.cpp
@@ -557,22 +557,7 @@ DB_GEN_C2("IndexSections " << is)
case isClassDocumentation:
{
t << "</title>" << endl;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd=0;
- bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
- {
- if (cd->isLinkableInProject() &&
- cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope() &&
- !cd->isAlias()
- )
- {
- t << " <xi:include href=\"" << cd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- found=TRUE;
- }
- }
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 8621cc7..9a71cf7 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -770,7 +770,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
//printf("Trying fullName='%s'\n",fullName.data());
// try class, namespace, group, page, file reference
- cd = Doxygen::classSDict->find(fullName);
+ cd = Doxygen::classLinkedMap->find(fullName);
if (cd) // class
{
*pDoc=cd->documentation();
diff --git a/src/dotgfxhierarchytable.cpp b/src/dotgfxhierarchytable.cpp
index 77620ed..c535acf 100644
--- a/src/dotgfxhierarchytable.cpp
+++ b/src/dotgfxhierarchytable.cpp
@@ -171,11 +171,9 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,const ClassDef *cd,ClassDefSe
//printf("end addHierarchy\n");
}
-void DotGfxHierarchyTable::addClassList(const ClassSDict *cl,ClassDefSet &visitedClasses)
+void DotGfxHierarchyTable::addClassList(const ClassLinkedMap &cl,ClassDefSet &visitedClasses)
{
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (cli.toLast();(cd=cli.current());--cli)
+ for (const auto &cd : cl)
{
//printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
if (cd->getLanguage()==SrcLangExt_VHDL &&
@@ -211,10 +209,10 @@ void DotGfxHierarchyTable::addClassList(const ClassSDict *cl,ClassDefSet &visite
m_usedNodes.insert(std::make_pair(cd->name().str(),std::move(n)));
m_rootNodes.push_back(root);
- if (visitedClasses.find(cd)==visitedClasses.end() && !cd->subClasses().empty())
+ if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->subClasses().empty())
{
- addHierarchy(root,cd,visitedClasses);
- visitedClasses.insert(cd);
+ addHierarchy(root,cd.get(),visitedClasses);
+ visitedClasses.insert(cd.get());
}
}
}
@@ -227,8 +225,8 @@ DotGfxHierarchyTable::DotGfxHierarchyTable(const char *prefix,ClassDef::Compound
// build a graph with each class as a node and the inheritance relations
// as edges
ClassDefSet visitedClasses;
- addClassList(Doxygen::classSDict,visitedClasses);
- addClassList(Doxygen::hiddenClasses,visitedClasses);
+ addClassList(*Doxygen::classLinkedMap,visitedClasses);
+ addClassList(*Doxygen::hiddenClassLinkedMap,visitedClasses);
// m_usedNodes now contains all nodes in the graph
// color the graph into a set of independent subgraphs
diff --git a/src/dotgfxhierarchytable.h b/src/dotgfxhierarchytable.h
index 0d884bd..089ecd2 100644
--- a/src/dotgfxhierarchytable.h
+++ b/src/dotgfxhierarchytable.h
@@ -27,6 +27,8 @@
#include "dotgraph.h"
#include "dotnode.h"
+class ClassLinkedMap;
+
/** Represents a graphical class hierarchy */
class DotGfxHierarchyTable : public DotGraph
{
@@ -44,7 +46,7 @@ class DotGfxHierarchyTable : public DotGraph
private:
void addHierarchy(DotNode *n,const ClassDef *cd,ClassDefSet &visited);
- void addClassList(const ClassSDict *cl,ClassDefSet &visited);
+ void addClassList(const ClassLinkedMap &cl,ClassDefSet &visited);
using DotNodeMap = std::unordered_multimap< std::string, std::unique_ptr<DotNode> >;
int m_graphId;
diff --git a/src/dotgroupcollaboration.cpp b/src/dotgroupcollaboration.cpp
index db6bd23..ecc937f 100644
--- a/src/dotgroupcollaboration.cpp
+++ b/src/dotgroupcollaboration.cpp
@@ -109,19 +109,14 @@ void DotGroupCollaboration::buildGraph(const GroupDef* gd)
addMemberList( gd->getMemberList(MemberListType_allMembersList) );
// Add classes
- if ( gd->getClasses() && gd->getClasses()->count() )
+ for (const auto &def : gd->getClasses())
{
- ClassSDict::Iterator defli(*gd->getClasses());
- ClassDef *def;
- for (;(def=defli.current());++defli)
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ if (!def->anchor().isEmpty())
{
- tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- if (!def->anchor().isEmpty())
- {
- tmp_url+="#"+def->anchor();
- }
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tclass );
+ tmp_url+="#"+def->anchor();
}
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tclass );
}
// Add namespaces
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index e2ab088..64e5ac3 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -117,17 +117,17 @@ extern void initResources();
#endif
// globally accessible variables
-ClassSDict *Doxygen::classSDict = 0;
-ClassSDict *Doxygen::hiddenClasses = 0;
-NamespaceSDict *Doxygen::namespaceSDict = 0;
-MemberNameLinkedMap *Doxygen::memberNameLinkedMap = 0;
-MemberNameLinkedMap *Doxygen::functionNameLinkedMap = 0;
-FileNameLinkedMap *Doxygen::inputNameLinkedMap = 0;
-GroupSDict *Doxygen::groupSDict = 0;
-PageSDict *Doxygen::pageSDict = 0;
-PageSDict *Doxygen::exampleSDict = 0;
-StringDict Doxygen::aliasDict(257); // aliases
-StringSet Doxygen::inputPaths;
+ClassLinkedMap *Doxygen::classLinkedMap = 0;
+ClassLinkedMap *Doxygen::hiddenClassLinkedMap = 0;
+NamespaceSDict *Doxygen::namespaceSDict = 0;
+MemberNameLinkedMap *Doxygen::memberNameLinkedMap = 0;
+MemberNameLinkedMap *Doxygen::functionNameLinkedMap = 0;
+FileNameLinkedMap *Doxygen::inputNameLinkedMap = 0;
+GroupSDict *Doxygen::groupSDict = 0;
+PageSDict *Doxygen::pageSDict = 0;
+PageSDict *Doxygen::exampleSDict = 0;
+StringDict Doxygen::aliasDict(257); // aliases
+StringSet Doxygen::inputPaths;
FileNameLinkedMap *Doxygen::includeNameLinkedMap = 0; // include names
FileNameLinkedMap *Doxygen::exampleNameLinkedMap = 0; // examples
FileNameLinkedMap *Doxygen::imageNameLinkedMap = 0; // images
@@ -135,35 +135,35 @@ FileNameLinkedMap *Doxygen::dotFileNameLinkedMap = 0; // dot files
FileNameLinkedMap *Doxygen::mscFileNameLinkedMap = 0; // msc files
FileNameLinkedMap *Doxygen::diaFileNameLinkedMap = 0; // dia files
StringUnorderedMap Doxygen::namespaceAliasMap; // all namespace aliases
-StringDict Doxygen::tagDestinationDict(257); // all tag locations
-StringUnorderedSet Doxygen::expandAsDefinedSet; // all macros that should be expanded
+StringDict Doxygen::tagDestinationDict(257); // all tag locations
+StringUnorderedSet Doxygen::expandAsDefinedSet; // all macros that should be expanded
QIntDict<MemberGroupInfo> Doxygen::memGrpInfoDict(1009); // dictionary of the member groups heading
-PageDef *Doxygen::mainPage = 0;
-bool Doxygen::insideMainPage = FALSE; // are we generating docs for the main page?
-NamespaceDefMutable *Doxygen::globalScope = 0;
-bool Doxygen::parseSourcesNeeded = FALSE;
-SearchIndexIntf *Doxygen::searchIndex=0;
+PageDef *Doxygen::mainPage = 0;
+bool Doxygen::insideMainPage = FALSE; // are we generating docs for the main page?
+NamespaceDefMutable *Doxygen::globalScope = 0;
+bool Doxygen::parseSourcesNeeded = FALSE;
+SearchIndexIntf *Doxygen::searchIndex=0;
SymbolMap<Definition> Doxygen::symbolMap;
-QDict<Definition> *Doxygen::clangUsrMap = 0;
-bool Doxygen::outputToWizard=FALSE;
-QDict<int> * Doxygen::htmlDirMap = 0;
+QDict<Definition> *Doxygen::clangUsrMap = 0;
+bool Doxygen::outputToWizard=FALSE;
+QDict<int> * Doxygen::htmlDirMap = 0;
Cache<std::string,LookupInfo> *Doxygen::lookupCache;
-DirSDict *Doxygen::directories;
-SDict<DirRelation> Doxygen::dirRelations(257);
-ParserManager *Doxygen::parserManager = 0;
-QCString Doxygen::htmlFileExtension;
-bool Doxygen::suppressDocWarnings = FALSE;
-QCString Doxygen::objDBFileName;
-QCString Doxygen::entryDBFileName;
-QCString Doxygen::filterDBFileName;
-IndexList *Doxygen::indexList;
-int Doxygen::subpageNestingLevel = 0;
-bool Doxygen::userComments = FALSE;
-QCString Doxygen::spaces;
-bool Doxygen::generatingXmlOutput = FALSE;
-GenericsSDict *Doxygen::genericsDict;
-DefinesPerFileList Doxygen::macroDefinitions;
-bool Doxygen::clangAssistedParsing = FALSE;
+DirSDict *Doxygen::directories;
+SDict<DirRelation> Doxygen::dirRelations(257);
+ParserManager *Doxygen::parserManager = 0;
+QCString Doxygen::htmlFileExtension;
+bool Doxygen::suppressDocWarnings = FALSE;
+QCString Doxygen::objDBFileName;
+QCString Doxygen::entryDBFileName;
+QCString Doxygen::filterDBFileName;
+IndexList *Doxygen::indexList;
+int Doxygen::subpageNestingLevel = 0;
+bool Doxygen::userComments = FALSE;
+QCString Doxygen::spaces;
+bool Doxygen::generatingXmlOutput = FALSE;
+GenericsSDict *Doxygen::genericsDict;
+DefinesPerFileList Doxygen::macroDefinitions;
+bool Doxygen::clangAssistedParsing = FALSE;
// locally accessible globals
static std::multimap< std::string, const Entry* > g_classEntries;
@@ -181,7 +181,8 @@ void clearAll()
//g_excludeNameDict.clear();
//delete g_outputList; g_outputList=0;
- Doxygen::classSDict->clear();
+ Doxygen::classLinkedMap->clear();
+ Doxygen::hiddenClassLinkedMap->clear();
Doxygen::namespaceSDict->clear();
Doxygen::pageSDict->clear();
Doxygen::exampleSDict->clear();
@@ -1056,8 +1057,13 @@ static void addClassToContext(const Entry *root)
{
tArgList = getTemplateArgumentsFromName(fullName,root->tArgLists);
}
- cd=createClassDef(tagInfo?tagName:root->fileName,root->startLine,root->startColumn,
- fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum);
+ // add class to the list
+ //printf("ClassDict.insert(%s)\n",fullName.data());
+ cd = toClassDefMutable(
+ Doxygen::classLinkedMap->add(fullName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(tagInfo?tagName:root->fileName,root->startLine,root->startColumn,
+ fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum) )));
Debug::print(Debug::Classes,0," New class '%s' (sec=0x%08x)! #tArgLists=%d tagInfo=%p\n",
qPrint(fullName),sec,root->tArgLists.size(), tagInfo);
cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
@@ -1090,9 +1096,6 @@ static void addClassToContext(const Entry *root)
cd->insertUsedFile(fd);
- // add class to the list
- //printf("ClassDict.insert(%s)\n",fullName.data());
- Doxygen::classSDict->append(fullName,cd);
if (cd->isGeneric()) // generics are also stored in a separate dictionary for fast lookup of instances
{
@@ -1152,7 +1155,6 @@ static void buildClassDocList(const Entry *root)
static void resolveClassNestingRelations()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
ClassDefSet visitedClasses;
bool done=FALSE;
@@ -1161,11 +1163,18 @@ static void resolveClassNestingRelations()
{
done=TRUE;
++iteration;
- ClassDef *icd=0;
- for (cli.toFirst();(icd=cli.current());++cli)
+ struct ClassAlias
{
- ClassDefMutable *cd = toClassDefMutable(icd);
- if (cd && visitedClasses.find(icd)==visitedClasses.end())
+ ClassAlias(const QCString &name,std::unique_ptr<ClassDef> cd) :
+ aliasFullName(name),aliasCd(std::move(cd)) {}
+ const QCString aliasFullName;
+ std::unique_ptr<ClassDef> aliasCd;
+ };
+ std::vector<ClassAlias> aliases;
+ for (const auto &icd : *Doxygen::classLinkedMap)
+ {
+ ClassDefMutable *cd = toClassDefMutable(icd.get());
+ if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
{
QCString name = stripAnonymousNamespaceScope(icd->name());
//printf("processing=%s, iteration=%d\n",cd->name().data(),iteration);
@@ -1195,10 +1204,10 @@ static void resolveClassNestingRelations()
dm = toDefinitionMutable(d);
if (dm)
{
- ClassDef *aliasCd = createClassDefAlias(d,cd);
- dm->addInnerCompound(aliasCd);
+ std::unique_ptr<ClassDef> aliasCd { createClassDefAlias(d,cd) };
+ dm->addInnerCompound(aliasCd.get());
QCString aliasFullName = d->qualifiedName()+"::"+aliasCd->localName();
- Doxygen::classSDict->append(aliasFullName,aliasCd);
+ aliases.push_back(ClassAlias(aliasFullName,std::move(aliasCd)));
//printf("adding %s to %s as %s\n",qPrint(aliasCd->name()),qPrint(d->name()),qPrint(aliasFullName));
}
}
@@ -1209,7 +1218,7 @@ static void resolveClassNestingRelations()
}
}
- visitedClasses.insert(icd);
+ visitedClasses.insert(icd.get());
done=FALSE;
}
//else
@@ -1218,14 +1227,18 @@ static void resolveClassNestingRelations()
//}
}
}
+ // add aliases
+ for (auto &alias : aliases)
+ {
+ Doxygen::classLinkedMap->add(alias.aliasFullName,std::move(alias.aliasCd));
+ }
}
//give warnings for unresolved compounds
- ClassDef *icd=0;
- for (cli.toFirst();(icd=cli.current());++cli)
+ for (const auto &icd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cd = toClassDefMutable(icd);
- if (cd && visitedClasses.find(icd)==visitedClasses.end())
+ ClassDefMutable *cd = toClassDefMutable(icd.get());
+ if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
{
QCString name = stripAnonymousNamespaceScope(cd->name());
//printf("processing unresolved=%s, iteration=%d\n",cd->name().data(),iteration);
@@ -1259,20 +1272,15 @@ void distributeClassGroupRelations()
//printf("** distributeClassGroupRelations()\n");
ClassDefSet visitedClasses;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
//printf("Checking %s\n",cd->name().data());
// distribute the group to nested classes as well
- if (cd && visitedClasses.find(cd)==visitedClasses.end() &&
- cd->partOfGroups()!=0 && cd->getClassSDict())
+ if (visitedClasses.find(cd.get())==visitedClasses.end() && cd->partOfGroups()!=0)
{
//printf(" Candidate for merging\n");
- ClassSDict::Iterator ncli(*cd->getClassSDict());
- ClassDef *ncd;
GroupDef *gd = cd->partOfGroups()->at(0);
- for (ncli.toFirst();(ncd=ncli.current());++ncli)
+ for (const auto &ncd : cd->getClasses())
{
ClassDefMutable *ncdm = toClassDefMutable(ncd);
if (ncdm && ncdm->partOfGroups()==0)
@@ -1283,23 +1291,28 @@ void distributeClassGroupRelations()
gd->addClass(ncdm);
}
}
- visitedClasses.insert(cd); // only visit every class once
+ visitedClasses.insert(cd.get()); // only visit every class once
}
}
}
//----------------------------
-static ClassDefMutable *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QCString &fieldName)
+static ClassDefMutable *createTagLessInstance(const ClassDef *rootCd,const ClassDef *templ,const QCString &fieldName)
{
QCString fullName = removeAnonymousScopes(templ->name());
if (fullName.right(2)=="::") fullName=fullName.left(fullName.length()-2);
fullName+="."+fieldName;
- ClassDefMutable *cd = createClassDef(templ->getDefFileName(),
+
+ //printf("** adding class %s based on %s\n",fullName.data(),templ->name().data());
+ ClassDefMutable *cd = toClassDefMutable(
+ Doxygen::classLinkedMap->add(fullName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(templ->getDefFileName(),
templ->getDefLine(),
templ->getDefColumn(),
fullName,
- templ->compoundType());
+ templ->compoundType()))));
cd->setDocumentation(templ->documentation(),templ->docFile(),templ->docLine()); // copy docs to definition
cd->setBriefDescription(templ->briefDescription(),templ->briefFile(),templ->briefLine());
cd->setLanguage(templ->getLanguage());
@@ -1333,8 +1346,6 @@ static ClassDefMutable *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,c
gd->addClass(cd);
}
}
- //printf("** adding class %s based on %s\n",fullName.data(),templ->name().data());
- Doxygen::classSDict->append(fullName,cd);
MemberList *ml = templ->getMemberList(MemberListType_pubAttribs);
if (ml)
@@ -1374,14 +1385,14 @@ static ClassDefMutable *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,c
* recursively. Later on we need to patch the member types so we keep
* track of the hierarchy of classes we create.
*/
-static void processTagLessClasses(ClassDef *rootCd,
- ClassDef *cd,
+static void processTagLessClasses(const ClassDef *rootCd,
+ const ClassDef *cd,
ClassDefMutable *tagParentCd,
const QCString &prefix,int count)
{
//printf("%d: processTagLessClasses %s\n",count,cd->name().data());
//printf("checking members for %s\n",cd->name().data());
- if (tagParentCd && cd->getClassSDict())
+ if (tagParentCd && !cd->getClasses().empty())
{
MemberList *ml = cd->getMemberList(MemberListType_pubAttribs);
if (ml)
@@ -1393,9 +1404,7 @@ static void processTagLessClasses(ClassDef *rootCd,
QCString type = md->typeString();
if (type.find("::@")!=-1) // member of tag less struct/union
{
- ClassSDict::Iterator it(*cd->getClassSDict());
- ClassDef *icd;
- for (it.toFirst();(icd=it.current());++it)
+ for (const auto &icd : cd->getClasses())
{
//printf(" member %s: type='%s'\n",md->name().data(),type.data());
//printf(" comparing '%s'<->'%s'\n",type.data(),icd->name().data());
@@ -1408,7 +1417,6 @@ static void processTagLessClasses(ClassDef *rootCd,
ClassDefMutable *ncd = createTagLessInstance(rootCd,icd,name);
processTagLessClasses(rootCd,icd,ncd,name,count+1);
//printf(" addTagged %s to %s\n",ncd->name().data(),tagParentCd->name().data());
- tagParentCd->addTaggedInnerClass(ncd);
ncd->setTagLessReference(icd);
// replace tag-less type for generated/original member
@@ -1441,18 +1449,13 @@ static void processTagLessClasses(ClassDef *rootCd,
}
}
-static void findTagLessClasses(ClassDef *cd)
+static void findTagLessClasses(const ClassDef *cd)
{
- if (cd->getClassSDict())
+ for (const auto &icd : cd->getClasses())
{
- ClassSDict::Iterator it(*cd->getClassSDict());
- ClassDef *icd;
- for (it.toFirst();(icd=it.current());++it)
+ if (icd->name().find("@")==-1) // process all non-anonymous inner classes
{
- if (icd->name().find("@")==-1) // process all non-anonymous inner classes
- {
- findTagLessClasses(icd);
- }
+ findTagLessClasses(icd);
}
}
@@ -1461,14 +1464,12 @@ static void findTagLessClasses(ClassDef *cd)
static void findTagLessClasses()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli) // for each class
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
Definition *scope = cd->getOuterScope();
if (scope && scope->definitionType()!=Definition::TypeClass) // that is not nested
{
- findTagLessClasses(cd);
+ findTagLessClasses(cd.get());
}
}
}
@@ -1845,7 +1846,7 @@ static void findUsingDeclarations(const Entry *root)
}
if (usingCd==0)
{
- usingCd = toClassDefMutable(Doxygen::hiddenClasses->find(name)); // check if it is already hidden
+ usingCd = toClassDefMutable(Doxygen::hiddenClassLinkedMap->find(name)); // check if it is already hidden
}
//printf("%s -> %p\n",root->name.data(),usingCd);
@@ -1853,11 +1854,10 @@ static void findUsingDeclarations(const Entry *root)
{
Debug::print(Debug::Classes,0," New using class '%s' (sec=0x%08x)! #tArgLists=%d\n",
qPrint(name),root->section,root->tArgLists.size());
- usingCd = createClassDef(
- "<using>",1,1,
- name,
- ClassDef::Class);
- Doxygen::hiddenClasses->append(root->name,usingCd);
+ usingCd = toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(root->name,
+ std::unique_ptr<ClassDef>(
+ createClassDef( "<using>",1,1, name, ClassDef::Class))));
usingCd->setArtificial(TRUE);
usingCd->setLanguage(root->lang);
}
@@ -3938,19 +3938,21 @@ static void findUsedClassesForClass(const Entry *root,
found=TRUE;
Debug::print(Debug::Classes,0," New used class '%s'\n", qPrint(usedName));
- ClassDefMutable *usedCd = toClassDefMutable(Doxygen::hiddenClasses->find(usedName));
+ ClassDefMutable *usedCd = toClassDefMutable(Doxygen::hiddenClassLinkedMap->find(usedName));
if (usedCd==0)
{
- usedCd = createClassDef(
- masterCd->getDefFileName(),masterCd->getDefLine(),
- masterCd->getDefColumn(),
- usedName,
- ClassDef::Class);
+ usedCd = toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(usedName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(
+ masterCd->getDefFileName(),masterCd->getDefLine(),
+ masterCd->getDefColumn(),
+ usedName,
+ ClassDef::Class))));
//printf("making %s a template argument!!!\n",usedCd->name().data());
usedCd->makeTemplateArgument();
usedCd->setUsedOnly(TRUE);
usedCd->setLanguage(masterCd->getLanguage());
- Doxygen::hiddenClasses->append(usedName,usedCd);
}
if (isArtificial) usedCd->setArtificial(TRUE);
Debug::print(Debug::Classes,0," Adding used class '%s' (1)\n", qPrint(usedCd->name()));
@@ -3981,7 +3983,7 @@ static void findUsedClassesForClass(const Entry *root,
}
if (!found && !type.isEmpty()) // used class is not documented in any scope
{
- ClassDefMutable *usedCd = toClassDefMutable(Doxygen::hiddenClasses->find(type));
+ ClassDefMutable *usedCd = toClassDefMutable(Doxygen::hiddenClassLinkedMap->find(type));
if (usedCd==0 && !Config_getBool(HIDE_UNDOC_RELATIONS))
{
if (type.right(2)=="(*" || type.right(2)=="(^") // type is a function pointer
@@ -3989,13 +3991,15 @@ static void findUsedClassesForClass(const Entry *root,
type+=md->argsString();
}
Debug::print(Debug::Classes,0," New undocumented used class '%s'\n", qPrint(type));
- usedCd = createClassDef(
- masterCd->getDefFileName(),masterCd->getDefLine(),
- masterCd->getDefColumn(),
- type,ClassDef::Class);
+ usedCd = toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(type,
+ std::unique_ptr<ClassDef>(
+ createClassDef(
+ masterCd->getDefFileName(),masterCd->getDefLine(),
+ masterCd->getDefColumn(),
+ type,ClassDef::Class))));
usedCd->setUsedOnly(TRUE);
usedCd->setLanguage(masterCd->getLanguage());
- Doxygen::hiddenClasses->append(type,usedCd);
}
if (usedCd)
{
@@ -4102,7 +4106,6 @@ static bool findTemplateInstanceRelation(const Entry *root,
if (freshInstance)
{
Debug::print(Debug::Classes,0," found fresh instance '%s'!\n",qPrint(instanceClass->name()));
- Doxygen::classSDict->append(instanceClass->name(),instanceClass);
instanceClass->setTemplateBaseClassNames(templateNames);
// search for new template instances caused by base classes of
@@ -4473,28 +4476,32 @@ static bool findClassRelation(
baseClass=0;
if (isATemplateArgument)
{
- baseClass=toClassDefMutable(Doxygen::hiddenClasses->find(baseClassName));
+ baseClass=toClassDefMutable(Doxygen::hiddenClassLinkedMap->find(baseClassName));
if (baseClass==0)
{
- baseClass=createClassDef(root->fileName,root->startLine,root->startColumn,
+ baseClass= toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(baseClassName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(root->fileName,root->startLine,root->startColumn,
baseClassName,
- ClassDef::Class);
- Doxygen::hiddenClasses->append(baseClassName,baseClass);
+ ClassDef::Class))));
if (isArtificial) baseClass->setArtificial(TRUE);
baseClass->setLanguage(root->lang);
}
}
else
{
- baseClass=toClassDefMutable(Doxygen::classSDict->find(baseClassName));
+ baseClass=toClassDefMutable(Doxygen::classLinkedMap->find(baseClassName));
//printf("*** classDDict->find(%s)=%p biName=%s templSpec=%s\n",
// baseClassName.data(),baseClass,biName.data(),templSpec.data());
if (baseClass==0)
{
- baseClass=createClassDef(root->fileName,root->startLine,root->startColumn,
- baseClassName,
- ClassDef::Class);
- Doxygen::classSDict->append(baseClassName,baseClass);
+ baseClass = toClassDefMutable(
+ Doxygen::classLinkedMap->add(baseClassName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(root->fileName,root->startLine,root->startColumn,
+ baseClassName,
+ ClassDef::Class))));
if (isArtificial) baseClass->setArtificial(TRUE);
baseClass->setLanguage(root->lang);
si = baseClassName.findRev("::");
@@ -4625,7 +4632,6 @@ static QCString extractClassName(const Entry *root)
*/
static void findInheritedTemplateInstances()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
ClassDefSet visitedClasses;
for (const auto &kv : g_classEntries)
{
@@ -4647,7 +4653,6 @@ static void findInheritedTemplateInstances()
static void findUsedTemplateInstances()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
for (const auto &kv : g_classEntries)
{
const Entry *root = kv.second;
@@ -4668,7 +4673,6 @@ static void findUsedTemplateInstances()
static void computeClassRelations()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
for (const auto &kv : g_classEntries)
{
const Entry *root = kv.second;
@@ -4778,11 +4782,9 @@ static void computeTemplateClassRelations()
static void computeMemberReferences()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->computeAnchors();
@@ -4817,11 +4819,9 @@ static void computeMemberReferences()
static void addListReferences()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->addListReferences();
@@ -7436,26 +7436,12 @@ static void computeMemberRelations()
}
}
-
-//----------------------------------------------------------------------------
-//static void computeClassImplUsageRelations()
-//{
-// ClassDef *cd;
-// ClassSDict::Iterator cli(*Doxygen::classSDict);
-// for (;(cd=cli.current());++cli)
-// {
-// cd->determineImplUsageRelation();
-// }
-//}
-
//----------------------------------------------------------------------------
static void createTemplateInstanceMembers()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
// for each class
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
// that is a template
QDict<ClassDef> *templInstances = cd->getTemplateInstances();
@@ -7469,7 +7455,7 @@ static void createTemplateInstanceMembers()
ClassDefMutable *tcdm = toClassDefMutable(tcd);
if (tcdm)
{
- tcdm->addMembersToTemplateInstance(cd,qdi.currentKey());
+ tcdm->addMembersToTemplateInstance(cd.get(),qdi.currentKey());
}
}
}
@@ -7480,21 +7466,19 @@ static void createTemplateInstanceMembers()
static void mergeCategories()
{
- ClassDef *cd;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
// merge members of categories into the class they extend
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
int i=cd->name().find('(');
if (i!=-1) // it is an Objective-C category
{
QCString baseName=cd->name().left(i);
- ClassDefMutable *baseClass=toClassDefMutable(Doxygen::classSDict->find(baseName));
+ ClassDefMutable *baseClass=toClassDefMutable(Doxygen::classLinkedMap->find(baseName));
if (baseClass)
{
//printf("*** merging members of category %s into %s\n",
// cd->name().data(),baseClass->name().data());
- baseClass->mergeCategory(cd);
+ baseClass->mergeCategory(cd.get());
}
}
}
@@ -7504,16 +7488,14 @@ static void mergeCategories()
static void buildCompleteMemberLists()
{
- ClassDef *cd;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
// merge the member list of base classes into the inherited classes.
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (// !cd->isReference() && // not an external class
cd->subClasses().empty() && // is a root of the hierarchy
!cd->baseClasses().empty()) // and has at least one base class
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
//printf("*** merging members for %s\n",cd->name().data());
@@ -7522,9 +7504,9 @@ static void buildCompleteMemberLists()
}
}
// now sort the member list of all members for all classes.
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->sortAllMembersList();
@@ -7759,14 +7741,12 @@ static void generateFileDocs()
static void addSourceReferences()
{
// add source references for class definitions
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
FileDef *fd=cd->getBodyDef();
if (fd && cd->isLinkableInProject() && cd->getStartDefLine()!=-1)
{
- fd->addSourceRef(cd->getStartDefLine(),cd,0);
+ fd->addSourceRef(cd->getStartDefLine(),cd.get(),0);
}
}
// add source references for namespace definitions
@@ -7869,11 +7849,9 @@ static void buildDefineList()
static void sortMemberLists()
{
// sort class member lists
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->sortMemberLists();
@@ -7935,11 +7913,9 @@ static void computeTooltipTexts()
static void setAnonymousEnumType()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->setAnonymousEnumType();
@@ -7951,11 +7927,9 @@ static void setAnonymousEnumType()
static void countMembers()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->countMembers();
@@ -7993,12 +7967,11 @@ static void countMembers()
//----------------------------------------------------------------------------
// generate the documentation of all classes
-static void generateClassList(ClassSDict &classSDict)
+static void generateClassList(const ClassLinkedMap &classList)
{
- ClassSDict::Iterator cli(classSDict);
- for ( ; cli.current() ; ++cli )
+ for (const auto &cdi : classList)
{
- ClassDefMutable *cd=toClassDefMutable(cli.current());
+ ClassDefMutable *cd=toClassDefMutable(cdi.get());
//printf("cd=%s getOuterScope=%p global=%p\n",cd->name().data(),cd->getOuterScope(),Doxygen::globalScope);
if (cd &&
@@ -8024,8 +7997,8 @@ static void generateClassList(ClassSDict &classSDict)
static void generateClassDocs()
{
- generateClassList(*Doxygen::classSDict);
- generateClassList(*Doxygen::hiddenClasses);
+ generateClassList(*Doxygen::classLinkedMap);
+ generateClassList(*Doxygen::hiddenClassLinkedMap);
}
//----------------------------------------------------------------------------
@@ -8095,11 +8068,9 @@ static void combineUsingRelations()
static void addMembersToMemberGroup()
{
// for each class
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->addMembersToMemberGroup();
@@ -8138,11 +8109,9 @@ static void addMembersToMemberGroup()
static void distributeMemberGroupDocumentation()
{
// for each class
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->distributeMemberGroupDocumentation();
@@ -8181,11 +8150,9 @@ static void distributeMemberGroupDocumentation()
static void findSectionsInDocumentation()
{
// for each class
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm)
{
cdm->findSectionsInDocumentation();
@@ -8889,12 +8856,10 @@ static void generateGroupDocs()
//----------------------------------------------------------------------------
// generate module pages
-static void generateNamespaceClassDocs(ClassSDict *d)
+static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
{
// for each class in the namespace...
- ClassSDict::Iterator cli(*d);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : classList)
{
ClassDefMutable *cdm = toClassDefMutable(cd);
if (cdm)
@@ -8938,12 +8903,12 @@ static void generateNamespaceDocs()
}
}
- generateNamespaceClassDocs(nd->getClassSDict());
+ generateNamespaceClassDocs(nd->getClasses());
if (sliceOpt)
{
- generateNamespaceClassDocs(nd->getInterfaceSDict());
- generateNamespaceClassDocs(nd->getStructSDict());
- generateNamespaceClassDocs(nd->getExceptionSDict());
+ generateNamespaceClassDocs(nd->getInterfaces());
+ generateNamespaceClassDocs(nd->getStructs());
+ generateNamespaceClassDocs(nd->getExceptions());
}
}
}
@@ -10071,10 +10036,8 @@ void initDoxygen()
Doxygen::groupSDict->setAutoDelete(TRUE);
Doxygen::namespaceSDict = new NamespaceSDict(20);
Doxygen::namespaceSDict->setAutoDelete(TRUE);
- Doxygen::classSDict = new ClassSDict(1009);
- Doxygen::classSDict->setAutoDelete(TRUE);
- Doxygen::hiddenClasses = new ClassSDict(257);
- Doxygen::hiddenClasses->setAutoDelete(TRUE);
+ Doxygen::classLinkedMap = new ClassLinkedMap;
+ Doxygen::hiddenClassLinkedMap = new ClassLinkedMap;
Doxygen::directories = new DirSDict(17);
Doxygen::directories->setAutoDelete(TRUE);
Doxygen::pageSDict = new PageSDict(1009); // all doc pages
@@ -10137,8 +10100,6 @@ void cleanUpDoxygen()
delete Doxygen::memberNameLinkedMap;
delete Doxygen::functionNameLinkedMap;
delete Doxygen::groupSDict;
- delete Doxygen::classSDict;
- delete Doxygen::hiddenClasses;
delete Doxygen::namespaceSDict;
delete Doxygen::directories;
@@ -10682,11 +10643,9 @@ static void writeTagFile()
}
}
// for each class
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
if (cdm && cdm->isLinkableInProject())
{
cdm->writeTagFile(tagFile);
@@ -11409,6 +11368,13 @@ void parseInput()
)<0;
};
+ auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name())<0 :
+ qstricmp(c1->className(), c2->className())<0;
+ };
+
g_s.begin("Sorting lists...\n");
std::sort(Doxygen::memberNameLinkedMap->begin(),
Doxygen::memberNameLinkedMap->end(),
@@ -11416,8 +11382,12 @@ void parseInput()
std::sort(Doxygen::functionNameLinkedMap->begin(),
Doxygen::functionNameLinkedMap->end(),
memberNameComp);
- Doxygen::hiddenClasses->sort();
- Doxygen::classSDict->sort();
+ std::sort(Doxygen::hiddenClassLinkedMap->begin(),
+ Doxygen::hiddenClassLinkedMap->end(),
+ classComp);
+ std::sort(Doxygen::classLinkedMap->begin(),
+ Doxygen::classLinkedMap->end(),
+ classComp);
g_s.end();
QDir thisDir;
diff --git a/src/doxygen.h b/src/doxygen.h
index 8ab8679..a9a708d 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -49,7 +49,7 @@ class GroupDef;
class GroupSDict;
class FileDef;
class ClassDef;
-class ClassSDict;
+class ClassLinkedMap;
class GenericsSDict;
class MemberNameLinkedMap;
class FileNameLinkedMap;
@@ -95,8 +95,8 @@ extern QCString g_spaces;
class Doxygen
{
public:
- static ClassSDict *classSDict;
- static ClassSDict *hiddenClasses;
+ static ClassLinkedMap *classLinkedMap;
+ static ClassLinkedMap *hiddenClassLinkedMap;
static PageSDict *exampleSDict;
static PageSDict *pageSDict;
static PageDef *mainPage;
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 68c2218..4d80ae4 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -87,7 +87,7 @@ class FileDefImpl : public DefinitionMixin<FileDef>
virtual const QList<MemberList> &getMemberLists() const { return m_memberLists; }
virtual MemberGroupSDict *getMemberGroupSDict() const { return m_memberGroupSDict; }
virtual NamespaceSDict *getNamespaceSDict() const { return m_namespaceSDict; }
- virtual ClassSDict *getClassSDict() const { return m_classSDict; }
+ virtual ClassLinkedRefMap getClasses() const { return m_classes; }
virtual QCString title() const;
virtual bool hasDetailedDescription() const;
virtual QCString fileVersion() const;
@@ -107,7 +107,7 @@ class FileDefImpl : public DefinitionMixin<FileDef>
virtual void parseSource(ClangTUParser *clangParser);
virtual void setDiskName(const QCString &name);
virtual void insertMember(MemberDef *md);
- virtual void insertClass(ClassDef *cd);
+ virtual void insertClass(const ClassDef *cd);
virtual void insertNamespace(NamespaceDef *nd);
virtual void computeAnchors();
virtual void setPackageDef(PackageDef *pd) { m_package=pd; }
@@ -139,7 +139,7 @@ class FileDefImpl : public DefinitionMixin<FileDef>
void writeSourceLink(OutputList &ol);
void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
bool isConstantGroup);
- void writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d);
+ void writeClassDeclarations(OutputList &ol,const QCString &title,const ClassLinkedRefMap &list);
void writeInlineClasses(OutputList &ol);
void startMemberDeclarations(OutputList &ol);
void endMemberDeclarations(OutputList &ol);
@@ -147,7 +147,7 @@ class FileDefImpl : public DefinitionMixin<FileDef>
void endMemberDocumentation(OutputList &ol);
void writeDetailedDescription(OutputList &ol,const QCString &title);
void writeBriefDescription(OutputList &ol);
- void writeClassesToTagFile(FTextStream &t,ClassSDict *d);
+ void writeClassesToTagFile(FTextStream &t,const ClassLinkedRefMap &list);
QDict<IncludeInfo> *m_includeDict;
QList<IncludeInfo> *m_includeList;
@@ -171,10 +171,10 @@ class FileDefImpl : public DefinitionMixin<FileDef>
QList<MemberList> m_memberLists;
MemberGroupSDict *m_memberGroupSDict;
NamespaceSDict *m_namespaceSDict;
- ClassSDict *m_classSDict;
- ClassSDict *m_interfaceSDict;
- ClassSDict *m_structSDict;
- ClassSDict *m_exceptionSDict;
+ ClassLinkedRefMap m_classes;
+ ClassLinkedRefMap m_interfaces;
+ ClassLinkedRefMap m_structs;
+ ClassLinkedRefMap m_exceptions;
bool m_subGrouping;
};
@@ -226,10 +226,6 @@ FileDefImpl::FileDefImpl(const char *p,const char *nm,
m_fileName=nm;
setReference(lref);
setDiskName(dn?dn:nm);
- m_classSDict = 0;
- m_interfaceSDict = 0;
- m_structSDict = 0;
- m_exceptionSDict = 0;
m_includeList = 0;
m_includeDict = 0;
m_includedByList = 0;
@@ -254,10 +250,6 @@ FileDefImpl::FileDefImpl(const char *p,const char *nm,
/*! destroy the file definition */
FileDefImpl::~FileDefImpl()
{
- delete m_classSDict;
- delete m_interfaceSDict;
- delete m_structSDict;
- delete m_exceptionSDict;
delete m_includeDict;
delete m_includeList;
delete m_includedByDict;
@@ -380,26 +372,22 @@ void FileDefImpl::writeTagFile(FTextStream &tagFile)
{
case LayoutDocEntry::FileClasses:
{
- if (m_classSDict)
- writeClassesToTagFile(tagFile, m_classSDict);
+ writeClassesToTagFile(tagFile, m_classes);
}
break;
case LayoutDocEntry::FileInterfaces:
{
- if (m_interfaceSDict)
- writeClassesToTagFile(tagFile, m_interfaceSDict);
+ writeClassesToTagFile(tagFile, m_interfaces);
}
break;
case LayoutDocEntry::FileStructs:
{
- if (m_structSDict)
- writeClassesToTagFile(tagFile, m_structSDict);
+ writeClassesToTagFile(tagFile, m_structs);
}
break;
case LayoutDocEntry::FileExceptions:
{
- if (m_exceptionSDict)
- writeClassesToTagFile(tagFile, m_exceptionSDict);
+ writeClassesToTagFile(tagFile, m_exceptions);
}
break;
case LayoutDocEntry::FileNamespaces:
@@ -569,11 +557,9 @@ void FileDefImpl::writeBriefDescription(OutputList &ol)
ol.writeSynopsis();
}
-void FileDefImpl::writeClassesToTagFile(FTextStream &tagFile, ClassSDict *d)
+void FileDefImpl::writeClassesToTagFile(FTextStream &tagFile, const ClassLinkedRefMap &list)
{
- SDict<ClassDef>::Iterator ci(*d);
- ClassDef *cd;
- for (ci.toFirst();(cd=ci.current());++ci)
+ for (const auto &cd : list)
{
if (cd->isLinkableInProject())
{
@@ -722,10 +708,10 @@ void FileDefImpl::writeNamespaceDeclarations(OutputList &ol,const QCString &titl
if (m_namespaceSDict) m_namespaceSDict->writeDeclaration(ol,title,isConstantGroup);
}
-void FileDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d)
+void FileDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,const ClassLinkedRefMap &list)
{
// write list of classes
- if (d) d->writeDeclaration(ol,0,title,FALSE);
+ list.writeDeclaration(ol,0,title,FALSE);
}
void FileDefImpl::writeInlineClasses(OutputList &ol)
@@ -735,7 +721,7 @@ void FileDefImpl::writeInlineClasses(OutputList &ol)
bool isEnabled = ol.isEnabled(OutputGenerator::Html);
ol.enable(OutputGenerator::Html);
- if (m_classSDict) m_classSDict->writeDocumentation(ol,this);
+ m_classes.writeDocumentation(ol,this);
// restore the initial state if needed
if (!isEnabled) ol.disable(OutputGenerator::Html);
@@ -811,28 +797,28 @@ void FileDefImpl::writeSummaryLinks(OutputList &ol) const
SrcLangExt lang=getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if (lde->kind()==LayoutDocEntry::FileClasses && m_classSDict && m_classSDict->declVisible())
+ if (lde->kind()==LayoutDocEntry::FileClasses && m_classes.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "nested-classes";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::FileInterfaces && m_interfaceSDict && m_interfaceSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::FileInterfaces && m_interfaces.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "interfaces";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::FileStructs && m_structSDict && m_structSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::FileStructs && m_structs.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "structs";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::FileExceptions && m_exceptionSDict && m_exceptionSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::FileExceptions && m_exceptions.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "exceptions";
@@ -970,25 +956,25 @@ void FileDefImpl::writeDocumentation(OutputList &ol)
case LayoutDocEntry::FileClasses:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),m_classSDict);
+ writeClassDeclarations(ol,ls->title(lang),m_classes);
}
break;
case LayoutDocEntry::FileInterfaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),m_interfaceSDict);
+ writeClassDeclarations(ol,ls->title(lang),m_interfaces);
}
break;
case LayoutDocEntry::FileStructs:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),m_structSDict);
+ writeClassDeclarations(ol,ls->title(lang),m_structs);
}
break;
case LayoutDocEntry::FileExceptions:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),m_exceptionSDict);
+ writeClassDeclarations(ol,ls->title(lang),m_exceptions);
}
break;
case LayoutDocEntry::FileNamespaces:
@@ -1118,25 +1104,25 @@ void FileDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *currentM
{
if (md->getFileDef()==this && md->getNamespaceDef()==0 && md->isLinkable() && !md->isEnumValue())
{
- ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
{
if (md==currentMd) // selected item => highlight
{
- ol.writeString("<a class=\"qindexHL\" ");
+ ol.writeString(" <tr><td class=\"navtabHL\">");
}
else
{
- ol.writeString("<a class=\"qindex\" ");
+ ol.writeString(" <tr><td class=\"navtab\">");
}
+ ol.writeString("<a class=\"navtab\" ");
ol.writeString("href=\"");
if (createSubDirs) ol.writeString("../../");
ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
ol.writeString("\">");
ol.writeString(convertToHtml(md->localName()));
ol.writeString("</a>");
+ ol.writeString("</td></tr>\n");
}
- ol.writeString("</td></tr>\n");
}
}
}
@@ -1377,40 +1363,29 @@ void FileDefImpl::insertMember(MemberDef *md)
}
/*! Adds compound definition \a cd to the list of all compounds of this file */
-void FileDefImpl::insertClass(ClassDef *cd)
+void FileDefImpl::insertClass(const ClassDef *cd)
{
if (cd->isHidden()) return;
- ClassSDict *d=0;
- ClassSDict **dd=&m_classSDict;
+ ClassLinkedRefMap &list = m_classes;
if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
{
if (cd->compoundType()==ClassDef::Interface)
{
- dd = &m_interfaceSDict;
+ list = m_interfaces;
}
else if (cd->compoundType()==ClassDef::Struct)
{
- dd = &m_structSDict;
+ list = m_structs;
}
else if (cd->compoundType()==ClassDef::Exception)
{
- dd = &m_exceptionSDict;
+ list = m_exceptions;
}
}
- if (*dd==0) *dd = new ClassSDict(17);
- d = *dd;
-
- if (Config_getBool(SORT_BRIEF_DOCS))
- {
- d->inSort(cd->name(),cd);
- }
- else
- {
- d->append(cd->name(),cd);
- }
+ list.add(cd->name(),cd);
}
/*! Adds namespace definition \a nd to the list of all compounds of this file */
@@ -2040,6 +2015,20 @@ void FileDefImpl::sortMemberLists()
}
}
+ if (Config_getBool(SORT_BRIEF_DOCS))
+ {
+ auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name())<0 :
+ qstricmp(c1->className(), c2->className())<0;
+ };
+
+ std::sort(m_classes.begin(), m_classes.end(), classComp);
+ std::sort(m_interfaces.begin(),m_interfaces.end(),classComp);
+ std::sort(m_structs.begin(), m_structs.end(), classComp);
+ std::sort(m_exceptions.begin(),m_exceptions.end(),classComp);
+ }
}
MemberList *FileDefImpl::getMemberList(MemberListType lt) const
diff --git a/src/filedef.h b/src/filedef.h
index 055078f..e9816b4 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -33,7 +33,6 @@
class MemberList;
class FileDef;
class FileList;
-class ClassSDict;
class ClassDef;
class ClassList;
class MemberDef;
@@ -135,7 +134,7 @@ class FileDef : public DefinitionMutable, public Definition
/* user defined member groups */
virtual MemberGroupSDict *getMemberGroupSDict() const = 0;
virtual NamespaceSDict *getNamespaceSDict() const = 0;
- virtual ClassSDict *getClassSDict() const = 0;
+ virtual ClassLinkedRefMap getClasses() const = 0;
virtual QCString title() const = 0;
virtual bool hasDetailedDescription() const = 0;
@@ -164,7 +163,7 @@ class FileDef : public DefinitionMutable, public Definition
virtual void setDiskName(const QCString &name) = 0;
virtual void insertMember(MemberDef *md) = 0;
- virtual void insertClass(ClassDef *cd) = 0;
+ virtual void insertClass(const ClassDef *cd) = 0;
virtual void insertNamespace(NamespaceDef *nd) = 0;
virtual void computeAnchors() = 0;
diff --git a/src/fortrancode.l b/src/fortrancode.l
index 1c1287d..c4b865b 100644
--- a/src/fortrancode.l
+++ b/src/fortrancode.l
@@ -1088,12 +1088,12 @@ static bool getFortranTypeDefs(const QCString &tname, const QCString &moduleName
//cout << "=== search for type: " << tname << endl;
// search for type
- if ((cd=Doxygen::classSDict->find(tname)))
+ if ((cd=Doxygen::classLinkedMap->find(tname)))
{
//cout << "=== type found in global module" << endl;
return TRUE;
}
- else if (moduleName && (cd= Doxygen::classSDict->find(moduleName+"::"+tname)))
+ else if (moduleName && (cd= Doxygen::classLinkedMap->find(moduleName+"::"+tname)))
{
//cout << "=== type found in local module" << endl;
return TRUE;
@@ -1103,7 +1103,7 @@ static bool getFortranTypeDefs(const QCString &tname, const QCString &moduleName
UseEntry *use;
for (UseSDict::Iterator di(*usedict); (use=di.current()); ++di)
{
- if ((cd= Doxygen::classSDict->find(use->module+"::"+tname)))
+ if ((cd= Doxygen::classLinkedMap->find(use->module+"::"+tname)))
{
//cout << "=== type found in used module" << endl;
return TRUE;
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 57e2226..b234d9c 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -15,8 +15,12 @@
*
*/
+#include <algorithm>
+#include <vector>
+
#include <ctype.h>
#include <qregexp.h>
+
#include "groupdef.h"
#include "classdef.h"
#include "filedef.h"
@@ -72,7 +76,7 @@ class GroupDefImpl : public DefinitionMixin<GroupDef>
virtual void writeMemberPages(OutputList &ol);
virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const;
virtual void writeTagFile(FTextStream &);
- virtual int numDocMembers() const;
+ virtual size_t numDocMembers() const;
virtual bool isLinkableInProject() const;
virtual bool isLinkable() const;
virtual bool isASubGroup() const;
@@ -97,7 +101,7 @@ class GroupDefImpl : public DefinitionMixin<GroupDef>
virtual MemberGroupSDict *getMemberGroupSDict() const { return m_memberGroupSDict; }
virtual FileList * getFiles() const { return m_fileList; }
- virtual ClassSDict * getClasses() const { return m_classSDict; }
+ virtual ClassLinkedRefMap getClasses() const { return m_classes; }
virtual NamespaceSDict * getNamespaces() const { return m_namespaceSDict; }
virtual GroupList * getSubGroups() const { return m_groupList; }
virtual PageSDict * getPages() const { return m_pageDict; }
@@ -136,7 +140,7 @@ class GroupDefImpl : public DefinitionMixin<GroupDef>
bool m_titleSet; // true if title is not the same as the name
QCString m_fileName; // base name of the generated file
FileList * m_fileList; // list of files in the group
- ClassSDict * m_classSDict; // list of classes in the group
+ ClassLinkedRefMap m_classes; // list of classes in the group
NamespaceSDict * m_namespaceSDict; // list of namespaces in the group
GroupList * m_groupList; // list of sub groups.
PageSDict * m_pageDict; // list of pages in the group
@@ -164,7 +168,6 @@ GroupDefImpl::GroupDefImpl(const char *df,int dl,const char *na,const char *t,
const char *refFileName) : DefinitionMixin(df,dl,1,na)
{
m_fileList = new FileList;
- m_classSDict = new ClassSDict(17);
m_groupList = new GroupList;
m_namespaceSDict = new NamespaceSDict(17);
m_pageDict = new PageSDict(17);
@@ -191,7 +194,6 @@ GroupDefImpl::GroupDefImpl(const char *df,int dl,const char *na,const char *t,
GroupDefImpl::~GroupDefImpl()
{
delete m_fileList;
- delete m_classSDict;
delete m_groupList;
delete m_namespaceSDict;
delete m_pageDict;
@@ -261,47 +263,12 @@ void GroupDefImpl::addFile(const FileDef *def)
bool GroupDefImpl::addClass(const ClassDef *cd)
{
- static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
if (cd->isHidden()) return FALSE;
updateLanguage(cd);
QCString qn = cd->name();
- if (m_classSDict->find(qn)==0)
+ if (m_classes.find(qn)==0)
{
- //printf("--- addClass %s sort=%d\n",qn.data(),sortBriefDocs);
- if (sortBriefDocs)
- {
- m_classSDict->inSort(qn,cd);
- }
- else
- {
- int i=qn.findRev("::");
- if (i==-1) i=qn.find('.');
- bool found=FALSE;
- //printf("i=%d\n",i);
- if (i>0)
- {
- // add nested classes (e.g. A::B, A::C) after their parent (A) in
- // order of insertion
- QCString scope = qn.left(i);
- int j=m_classSDict->findAt(scope);
- if (j!=-1)
- {
- while (j<(int)m_classSDict->count() &&
- m_classSDict->at(j)->qualifiedName().left(i)==scope)
- {
- //printf("skipping over %s\n",classSDict->at(j)->qualifiedName().data());
- j++;
- }
- //printf("Found scope at index %d\n",j);
- m_classSDict->insertAt(j,qn,cd);
- found=TRUE;
- }
- }
- if (!found) // no insertion point found -> just append
- {
- m_classSDict->append(qn,cd);
- }
- }
+ m_classes.add(qn,cd);
return TRUE;
}
return FALSE;
@@ -650,10 +617,10 @@ void GroupDefImpl::countMembers()
}
}
-int GroupDefImpl::numDocMembers() const
+size_t GroupDefImpl::numDocMembers() const
{
return m_fileList->count()+
- m_classSDict->count()+
+ m_classes.size()+
m_namespaceSDict->count()+
m_groupList->count()+
m_allMemberList->count()+
@@ -683,17 +650,12 @@ void GroupDefImpl::writeTagFile(FTextStream &tagFile)
{
case LayoutDocEntry::GroupClasses:
{
- if (m_classSDict)
+ for (const auto &cd : m_classes)
{
- SDict<ClassDef>::Iterator ci(*m_classSDict);
- ClassDef *cd;
- for (ci.toFirst();(cd=ci.current());++ci)
+ if (cd->isLinkableInProject())
{
- if (cd->isLinkableInProject())
- {
- tagFile << " <class kind=\"" << cd->compoundTypeString()
- << "\">" << convertToXML(cd->name()) << "</class>" << endl;
- }
+ tagFile << " <class kind=\"" << cd->compoundTypeString()
+ << "\">" << convertToXML(cd->name()) << "</class>" << endl;
}
}
}
@@ -813,7 +775,7 @@ void GroupDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title
)
{
ol.pushGeneratorState();
- if (m_pageDict->count()!=(uint)numDocMembers()) // not only pages -> classical layout
+ if (m_pageDict->count()!=numDocMembers()) // not only pages -> classical layout
{
ol.pushGeneratorState();
ol.disable(OutputGenerator::Html);
@@ -1050,12 +1012,12 @@ void GroupDefImpl::writeDirs(OutputList &ol,const QCString &title)
void GroupDefImpl::writeClasses(OutputList &ol,const QCString &title)
{
// write list of classes
- m_classSDict->writeDeclaration(ol,0,title,FALSE);
+ m_classes.writeDeclaration(ol,0,title,FALSE);
}
void GroupDefImpl::writeInlineClasses(OutputList &ol)
{
- m_classSDict->writeDocumentation(ol);
+ m_classes.writeDocumentation(ol);
}
void GroupDefImpl::writePageDocumentation(OutputList &ol)
@@ -1152,7 +1114,7 @@ void GroupDefImpl::writeSummaryLinks(OutputList &ol) const
SrcLangExt lang = getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classSDict->declVisible()) ||
+ if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classes.declVisible()) ||
(lde->kind()==LayoutDocEntry::GroupNamespaces && m_namespaceSDict->declVisible()) ||
(lde->kind()==LayoutDocEntry::GroupFiles && m_fileList->count()>0) ||
(lde->kind()==LayoutDocEntry::GroupNestedGroups && m_groupList->count()>0) ||
@@ -1399,25 +1361,25 @@ void GroupDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *current
{
if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
{
- ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
{
if (md==currentMd) // selected item => highlight
{
- ol.writeString("<a class=\"qindexHL\" ");
+ ol.writeString(" <tr><td class=\"navtabHL\">");
}
else
{
- ol.writeString("<a class=\"qindex\" ");
+ ol.writeString(" <tr><td class=\"navtab\">");
}
+ ol.writeString("<a class=\"navtab\" ");
ol.writeString("href=\"");
if (createSubDirs) ol.writeString("../../");
ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
ol.writeString("\">");
ol.writeString(convertToHtml(md->localName()));
ol.writeString("</a>");
+ ol.writeString("</td></tr>\n");
}
- ol.writeString("</td></tr>\n");
}
}
@@ -1697,6 +1659,67 @@ void GroupDefImpl::addMemberToList(MemberListType lt,MemberDef *md)
ml->append(md);
}
+// performs a partial reordering to group elements together with the same scope
+template<class Vec>
+static void groupClassesWithSameScope(Vec &vec)
+{
+ bool done=false;
+ while (!done) // for each iteration
+ {
+ done=true;
+ for (size_t i=0; i<vec.size(); i++) // go through all items
+ {
+ std::string qni = vec[i]->name().str();
+ size_t posi = qni.rfind("::");
+ if (posi!=std::string::npos)
+ {
+ std::string scope = qni.substr(0,posi);
+ auto it = std::find_if( vec.begin(), vec.end(),
+ [&](typename Vec::Ptr &cd)
+ { return cd->name().str()==scope; });
+ if (it!=vec.end())
+ {
+ size_t idx = std::distance(vec.begin(),it);
+ if (i<idx) // parent scope located after child scope
+ {
+ // to avoid reordering elements with the same parent
+ // we skip to the last one with the same scope
+ size_t k = idx;
+ while (k<vec.size() && vec[k]->name().str().substr(0,posi)==scope)
+ {
+ idx = k;
+ k++;
+ }
+ idx = std::distance(vec.begin(),it);
+ // swap the items such that i is inserted after idx
+ for (size_t j=i; j<idx; j++)
+ {
+ std::swap(vec[j],vec[j+1]);
+ }
+ done=false;
+ }
+ else if (idx<i && vec[i-1]->name().str().substr(0,posi)!=scope)
+ {
+ // parent scope is found before the item, and the item
+ // has some other item with a different scope in front of it
+ // move idx to the end of range with the same scope
+ while (idx<i && vec[idx]->name().str().substr(0,posi)==scope)
+ {
+ idx++;
+ }
+ // swap the items such that i is just after idx
+ for (size_t j=idx; j<i; j++)
+ {
+ std::swap(vec[j],vec[j+1]);
+ }
+ done=false;
+ }
+ }
+ }
+ }
+ }
+}
+
void GroupDefImpl::sortMemberLists()
{
QListIterator<MemberList> mli(m_memberLists);
@@ -1708,6 +1731,18 @@ void GroupDefImpl::sortMemberLists()
if (Config_getBool(SORT_BRIEF_DOCS))
{
std::sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
+
+ auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name())<0 :
+ qstricmp(c1->className(), c2->className())<0;
+ };
+ std::sort(m_classes.begin(), m_classes.end(), classComp);
+ }
+ else
+ {
+ groupClassesWithSameScope(m_classes);
}
}
@@ -1782,7 +1817,7 @@ bool GroupDefImpl::hasDetailedDescription() const
{
static bool repeatBrief = Config_getBool(REPEAT_BRIEF);
return ((!briefDescription().isEmpty() && repeatBrief) || !documentation().isEmpty() || !inbodyDocumentation().isEmpty()) &&
- (m_pageDict->count()!=(uint)numDocMembers());
+ (m_pageDict->count()!=numDocMembers());
}
// --- Cast functions
diff --git a/src/groupdef.h b/src/groupdef.h
index 0a1ec9d..7109656 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -27,7 +27,7 @@
class MemberList;
class FileList;
-class ClassSDict;
+class ClassLinkedRefMap;
class FileDef;
class ClassDef;
class NamespaceDef;
@@ -70,7 +70,7 @@ class GroupDef : public DefinitionMutable, public Definition
virtual void writeMemberPages(OutputList &ol) = 0;
virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const = 0;
virtual void writeTagFile(FTextStream &) = 0;
- virtual int numDocMembers() const = 0;
+ virtual size_t numDocMembers() const = 0;
virtual bool isLinkableInProject() const = 0;
virtual bool isLinkable() const = 0;
virtual bool isASubGroup() const = 0;
@@ -95,7 +95,7 @@ class GroupDef : public DefinitionMutable, public Definition
virtual MemberGroupSDict *getMemberGroupSDict() const = 0;
virtual FileList * getFiles() const = 0;
- virtual ClassSDict * getClasses() const = 0;
+ virtual ClassLinkedRefMap getClasses() const = 0;
virtual NamespaceSDict * getNamespaces() const = 0;
virtual GroupList * getSubGroups() const = 0;
virtual PageSDict * getPages() const = 0;
diff --git a/src/index.cpp b/src/index.cpp
index c58cacb..106204c 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -177,74 +177,41 @@ const int maxItemsBeforeQuickIndex = MAX_ITEMS_BEFORE_QUICK_INDEX;
static void startQuickIndexList(OutputList &ol,bool letterTabs=FALSE)
{
- bool fancyTabs = TRUE;
- if (fancyTabs)
+ if (letterTabs)
{
- if (letterTabs)
- {
- ol.writeString(" <div id=\"navrow4\" class=\"tabs3\">\n");
- }
- else
- {
- ol.writeString(" <div id=\"navrow3\" class=\"tabs2\">\n");
- }
- ol.writeString(" <ul class=\"tablist\">\n");
+ ol.writeString(" <div id=\"navrow4\" class=\"tabs3\">\n");
}
else
{
- ol.writeString(" <div class=\"qindex\">");
+ ol.writeString(" <div id=\"navrow3\" class=\"tabs2\">\n");
}
+ ol.writeString(" <ul class=\"tablist\">\n");
}
static void endQuickIndexList(OutputList &ol)
{
- bool fancyTabs = TRUE;
- if (fancyTabs)
- {
- ol.writeString(" </ul>\n");
- }
+ ol.writeString(" </ul>\n");
ol.writeString(" </div>\n");
}
static void startQuickIndexItem(OutputList &ol,const char *l,
bool hl,bool compact,bool &first)
{
- bool fancyTabs = TRUE;
- if (!first && compact && !fancyTabs) ol.writeString(" | ");
first=FALSE;
- if (fancyTabs)
- {
- ol.writeString(" <li");
- if (hl) ol.writeString(" class=\"current\"");
- ol.writeString("><a ");
- }
- else
- {
- if (!compact) ol.writeString("<li>");
- if (hl && compact)
- {
- ol.writeString("<a class=\"qindexHL\" ");
- }
- else
- {
- ol.writeString("<a class=\"qindex\" ");
- }
- }
+ ol.writeString(" <li");
+ if (hl) ol.writeString(" class=\"current\"");
+ ol.writeString("><a ");
ol.writeString("href=\"");
ol.writeString(l);
ol.writeString("\">");
- if (fancyTabs)
- {
- ol.writeString("<span>");
- }
+ ol.writeString("<span>");
}
static void endQuickIndexItem(OutputList &ol)
{
- bool fancyTabs=TRUE;
- if (fancyTabs) ol.writeString("</span>");
+ ol.writeString("</span>");
ol.writeString("</a>");
- if (fancyTabs) ol.writeString("</li>\n");
+ ol.writeString("</li>\n");
}
// don't make this static as it is called from a template function and some
@@ -397,15 +364,9 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
addToIndex,
def);
int numClasses=0;
- ClassSDict *classes = def->getClassSDict();
- if (classes)
+ for (const auto &cd : def->getClasses())
{
- ClassDef *cd;
- ClassSDict::Iterator it(*classes);
- for (;(cd=it.current());++it)
- {
- if (cd->isLinkable()) numClasses++;
- }
+ if (cd->isLinkable()) numClasses++;
}
//printf("addMembersToIndex(def=%s hasMembers=%d numClasses=%d)\n",def->name().data(),hasMembers,numClasses);
if (hasMembers || numClasses>0)
@@ -437,20 +398,15 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
lde->kind()==LayoutDocEntry::ClassNestedClasses
)
{
- if (classes)
+ for (const auto &cd : def->getClasses())
{
- ClassDef *cd;
- ClassSDict::Iterator it(*classes);
- for (;(cd=it.current());++it)
+ if (cd->isLinkable() && (cd->partOfGroups()==0 || def->definitionType()==Definition::TypeGroup))
{
- if (cd->isLinkable() && (cd->partOfGroups()==0 || def->definitionType()==Definition::TypeGroup))
- {
- static bool inlineSimpleStructs = Config_getBool(INLINE_SIMPLE_STRUCTS);
- bool isNestedClass = def->definitionType()==Definition::TypeClass;
- addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),
- addToIndex && (isNestedClass || (cd->isSimple() && inlineSimpleStructs)),
- preventSeparateIndex || cd->isEmbeddedInOuterScope());
- }
+ static bool inlineSimpleStructs = Config_getBool(INLINE_SIMPLE_STRUCTS);
+ bool isNestedClass = def->definitionType()==Definition::TypeClass;
+ addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),
+ addToIndex && (isNestedClass || (cd->isSimple() && inlineSimpleStructs)),
+ preventSeparateIndex || cd->isEmbeddedInOuterScope());
}
}
}
@@ -831,13 +787,11 @@ static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
//----------------------------------------------------------------------------
-static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv,bool addToIndex,
+static void writeClassTreeForList(OutputList &ol,const ClassLinkedMap &cl,bool &started,FTVHelp* ftv,bool addToIndex,
ClassDef::CompoundType ct,ClassDefSet &visitedClasses)
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : cl)
{
//printf("class %s hasVisibleRoot=%d isVisibleInHierarchy=%d\n",
// cd->name().data(),
@@ -876,8 +830,8 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
started=TRUE;
}
ol.startIndexListItem();
- bool hasChildren = visitedClasses.find(cd)==visitedClasses.end() &&
- classHasVisibleChildren(cd);
+ bool hasChildren = visitedClasses.find(cd.get())==visitedClasses.end() &&
+ classHasVisibleChildren(cd.get());
//printf("list: Has children %s: %d\n",cd->name().data(),hasChildren);
if (cd->isLinkable())
{
@@ -899,7 +853,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
}
if (ftv)
{
- ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
+ ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd.get());
}
}
else
@@ -913,18 +867,18 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
}
if (ftv)
{
- ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE,cd);
+ ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE,cd.get());
}
}
if (cd->getLanguage()==SrcLangExt_VHDL && hasChildren)
{
writeClassTreeToOutput(ol,cd->baseClasses(),1,ftv,addToIndex,visitedClasses);
- visitedClasses.insert(cd);
+ visitedClasses.insert(cd.get());
}
else if (hasChildren)
{
writeClassTreeToOutput(ol,cd->subClasses(),1,ftv,addToIndex,visitedClasses);
- visitedClasses.insert(cd);
+ visitedClasses.insert(cd.get());
}
ol.endIndexListItem();
}
@@ -941,8 +895,8 @@ static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex,Cla
ol.disable(OutputGenerator::Html);
}
bool started=FALSE;
- writeClassTreeForList(ol,Doxygen::classSDict,started,ftv,addToIndex,ct,visitedClasses);
- writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv,addToIndex,ct,visitedClasses);
+ writeClassTreeForList(ol,*Doxygen::classLinkedMap,started,ftv,addToIndex,ct,visitedClasses);
+ writeClassTreeForList(ol,*Doxygen::hiddenClassLinkedMap,started,ftv,addToIndex,ct,visitedClasses);
if (started)
{
endIndexHierarchy(ol,0);
@@ -959,13 +913,11 @@ static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex,Cla
//----------------------------------------------------------------------------
-static int countClassesInTreeList(const ClassSDict &cl, ClassDef::CompoundType ct)
+static int countClassesInTreeList(const ClassLinkedMap &cl, ClassDef::CompoundType ct)
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
int count=0;
- ClassSDict::Iterator cli(cl);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : cl)
{
if (sliceOpt && cd->compoundType() != ct)
{
@@ -988,8 +940,8 @@ static int countClassesInTreeList(const ClassSDict &cl, ClassDef::CompoundType c
static int countClassHierarchy(ClassDef::CompoundType ct)
{
int count=0;
- count+=countClassesInTreeList(*Doxygen::classSDict, ct);
- count+=countClassesInTreeList(*Doxygen::hiddenClasses, ct);
+ count+=countClassesInTreeList(*Doxygen::classLinkedMap, ct);
+ count+=countClassesInTreeList(*Doxygen::hiddenClassLinkedMap, ct);
return count;
}
@@ -1564,75 +1516,70 @@ static int countNamespaces()
}
//----------------------------------------------------------------------------
+template<typename Ptr> const ClassDef *get_pointer(const Ptr &p);
+template<> const ClassDef *get_pointer(const ClassLinkedMap::Ptr &p) { return p.get(); }
+template<> const ClassDef *get_pointer(const ClassLinkedRefMap::Ptr &p) { return p; }
-static void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalOnly,ClassDef::CompoundType ct)
+template<class ListType>
+static void writeClassTree(const ListType &cl,FTVHelp *ftv,bool addToIndex,bool globalOnly,ClassDef::CompoundType ct)
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
- if (clDict)
+ for (const auto &cdi : cl)
{
- ClassSDict::Iterator cli(*clDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ const ClassDef *cd = get_pointer(cdi);
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm && cd->getLanguage()==SrcLangExt_VHDL)
{
- ClassDefMutable *cdm = toClassDefMutable(cd);
- if (cdm && cd->getLanguage()==SrcLangExt_VHDL)
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
+ (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
+ )// no architecture
{
- if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
- (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
- )// no architecture
- {
- continue;
- }
- if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
- {
- QCString n=cd->name();
- cdm->setClassName(n.data());
- }
+ continue;
}
-
- if (sliceOpt && cd->compoundType() != ct)
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
{
- continue;
+ QCString n=cd->name();
+ cdm->setClassName(n.data());
}
+ }
- if (!globalOnly ||
- cd->getOuterScope()==0 ||
- cd->getOuterScope()==Doxygen::globalScope
- )
+ if (sliceOpt && cd->compoundType() != ct)
+ {
+ continue;
+ }
+
+ if (!globalOnly ||
+ cd->getOuterScope()==0 ||
+ cd->getOuterScope()==Doxygen::globalScope
+ )
+ {
+ int count=0;
+ for (const auto &ccd : cd->getClasses())
{
- int count=0;
- if (cd->getClassSDict())
+ if (ccd->isLinkableInProject() && ccd->templateMaster()==0)
{
- ClassSDict::Iterator ccit(*cd->getClassSDict());
- ClassDef *ccd;
- for (;(ccd=ccit.current());++ccit)
- {
- if (ccd->isLinkableInProject() && ccd->templateMaster()==0)
- {
- count++;
- }
- }
+ count++;
}
- if (classVisibleInIndex(cd) && cd->templateMaster()==0)
+ }
+ if (classVisibleInIndex(cd) && cd->templateMaster()==0)
+ {
+ ftv->addContentsItem(count>0,cd->displayName(FALSE),cd->getReference(),
+ cd->getOutputFileBase(),cd->anchor(),FALSE,TRUE,cd);
+ if ((cd->getOuterScope()==0 ||
+ cd->getOuterScope()->definitionType()!=Definition::TypeClass
+ )
+ )
{
- ftv->addContentsItem(count>0,cd->displayName(FALSE),cd->getReference(),
- cd->getOutputFileBase(),cd->anchor(),FALSE,TRUE,cd);
- if ((cd->getOuterScope()==0 ||
- cd->getOuterScope()->definitionType()!=Definition::TypeClass
- )
- )
- {
- addMembersToIndex(cd,LayoutDocManager::Class,
- cd->displayName(FALSE),
- cd->anchor(),
- addToIndex && cd->partOfGroups()==0 && !cd->isSimple());
- }
- if (count>0)
- {
- ftv->incContentsDepth();
- writeClassTree(cd->getClassSDict(),ftv,addToIndex,FALSE,ct);
- ftv->decContentsDepth();
- }
+ addMembersToIndex(cd,LayoutDocManager::Class,
+ cd->displayName(FALSE),
+ cd->anchor(),
+ addToIndex && cd->partOfGroups()==0 && !cd->isSimple());
+ }
+ if (count>0)
+ {
+ ftv->incContentsDepth();
+ writeClassTree(cd->getClasses(),ftv,addToIndex,FALSE,ct);
+ ftv->decContentsDepth();
}
}
}
@@ -1747,7 +1694,7 @@ static void writeNamespaceTree(const NamespaceSDict *nsDict,FTVHelp *ftv,
{
ftv->incContentsDepth();
writeNamespaceTree(nd->getNamespaceSDict(),ftv,FALSE,addToIndex);
- writeClassTree(nd->getClassSDict(),ftv,FALSE,FALSE,ClassDef::Class);
+ writeClassTree(nd->getClasses(),ftv,FALSE,FALSE,ClassDef::Class);
writeNamespaceMembers(nd,addToIndex);
ftv->decContentsDepth();
}
@@ -1812,20 +1759,20 @@ static void writeClassTreeInsideNamespace(const NamespaceSDict *nsDict,FTVHelp *
ftv->incContentsDepth();
writeClassTreeInsideNamespace(nd->getNamespaceSDict(),ftv,FALSE,addToIndex,ct);
- ClassSDict *d = nd->getClassSDict();
+ ClassLinkedRefMap d = nd->getClasses();
if (sliceOpt)
{
if (ct == ClassDef::Interface)
{
- d = nd->getInterfaceSDict();
+ d = nd->getInterfaces();
}
else if (ct == ClassDef::Struct)
{
- d = nd->getStructSDict();
+ d = nd->getStructs();
}
else if (ct == ClassDef::Exception)
{
- d = nd->getExceptionSDict();
+ d = nd->getExceptions();
}
}
writeClassTree(d,ftv,addToIndex,FALSE,ct);
@@ -1957,9 +1904,7 @@ static int countAnnotatedClasses(int *cp, ClassDef::CompoundType ct)
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
int count=0;
int countPrinted=0;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (sliceOpt && cd->compoundType() != ct)
{
@@ -1987,10 +1932,7 @@ static void writeAnnotatedClassList(OutputList &ol,ClassDef::CompoundType ct)
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
-
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->getLanguage()==SrcLangExt_VHDL &&
((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
@@ -2034,7 +1976,7 @@ static void writeAnnotatedClassList(OutputList &ol,ClassDef::CompoundType ct)
{
ol.generateDoc(
cd->briefFile(),cd->briefLine(),
- cd,0,
+ cd.get(),0,
cd->briefDescription(TRUE),
FALSE, // indexWords
FALSE, // isExample
@@ -2066,6 +2008,29 @@ static QCString letterToString(uint letter)
return QString(QChar(letter)).utf8();
}
+static QCString letterToLabel(const char *startLetter)
+{
+ const char *p = startLetter;
+ if (startLetter==0 || *startLetter==0) return "";
+ char c = *p;
+ QCString result;
+ if (isId1(c))
+ {
+ result+=c;
+ }
+ else
+ {
+ result="0x";
+ const char hex[]="0123456789abcdef";
+ while ((c=*p++))
+ {
+ result+=hex[((unsigned char)c)>>4];
+ result+=hex[((unsigned char)c)&0xf];
+ }
+ }
+ return result;
+}
+
static QCString letterToLabel(uint startLetter)
{
char s[11]; // max 0x12345678 + '\0'
@@ -2103,87 +2068,31 @@ static QCString letterToLabel(uint startLetter)
return s;
}
-//----------------------------------------------------------------------------
-/** Special class list where sorting takes IGNORE_PREFIX into account. */
-class PrefixIgnoreClassList : public ClassList
-{
- public:
- typedef const ClassDef ElementType;
- PrefixIgnoreClassList(uint letter) : m_letter(letter) {}
- uint letter() const { return m_letter; }
- private:
- virtual int compareValue(const ClassDef *c1, const ClassDef *c2) const
- {
- QCString n1 = c1->className();
- QCString n2 = c2->className();
- return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
- }
- uint m_letter;
-};
+//----------------------------------------------------------------------------
/** Class representing a cell in the alphabetical class index. */
class AlphaIndexTableCell
{
public:
- AlphaIndexTableCell(int row,int col,uint letter,const ClassDef *cd) :
+ AlphaIndexTableCell(int row,int col,const std::string &letter,const ClassDef *cd) :
m_letter(letter), m_class(cd), m_row(row), m_col(col)
- { //printf("AlphaIndexTableCell(%d,%d,%c,%s)\n",row,col,letter!=0 ? letter: '-',
- // cd!=(ClassDef*)0x8 ? cd->name().data() : "<null>");
+ {
}
const ClassDef *classDef() const { return m_class; }
- uint letter() const { return m_letter; }
- int row() const { return m_row; }
- int column() const { return m_col; }
+ std::string letter() const { return m_letter; }
+ int row() const { return m_row; }
+ int column() const { return m_col; }
private:
- uint m_letter;
+ std::string m_letter;
const ClassDef *m_class;
int m_row;
int m_col;
};
-/** Class representing a row in the alphabetical class index. */
-class AlphaIndexTableRows : public QList<AlphaIndexTableCell>
-{
- public:
- AlphaIndexTableRows() { setAutoDelete(TRUE); }
-};
-
-/** Iterator for the cells in a row of the alphabetical class index. */
-class AlphaIndexTableRowsIterator : public QListIterator<AlphaIndexTableCell>
-{
- public:
- AlphaIndexTableRowsIterator(const AlphaIndexTableRows &list_) :
- QListIterator<AlphaIndexTableCell>(list_) {}
-};
-
-/** Class representing the columns in the alphabetical class index. */
-class AlphaIndexTableColumns : public QList<AlphaIndexTableRows>
-{
- public:
- AlphaIndexTableColumns() { setAutoDelete(TRUE); }
-};
-
-class UsedIndexLetters : public SIntDict<uint>
-{
- public:
- UsedIndexLetters() : SIntDict<uint>(257) { setAutoDelete(TRUE); }
- void add(uint letter)
- {
- uint *v = find(letter);
- if (v==0)
- {
- append(letter,new uint(letter));
- }
- }
- private:
- int compareValues( const uint *p1, const uint *p2) const
- {
- return (int)*p1 - (int)*p2; // subtracting is done by int not uint.
- }
-};
+using UsedIndexLetters = std::set<std::string>;
// write an alphabetical index of all class with a header for each letter
static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct, int annotatedCount)
@@ -2194,11 +2103,7 @@ static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct
UsedIndexLetters indexLettersUsed;
// first count the number of headers
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- uint startLetter=0;
- int headerItems=0;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (sliceOpt && cd->compoundType() != ct)
continue;
@@ -2209,50 +2114,36 @@ static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct
int index = getPrefixIndex(cd->className());
//printf("name=%s index=%d %d\n",cd->className().data(),index,cd->protection());
- startLetter=getUtf8CodeToLower(cd->className(),index);
- indexLettersUsed.add(startLetter);
+ char charStr[MAX_UTF8_CHAR_SIZE];
+ if (getUtf8Char(cd->className().data()+index,charStr,CaseModifier::ToUpper)>0)
+ // get the first UTF8 character (after the part that should be ignored)
+ {
+ indexLettersUsed.insert(charStr);
+ }
}
}
- indexLettersUsed.sort();
// write quick link index (row of letters)
QCString alphaLinks = "<div class=\"qindex\">";
- SIntDict<uint>::Iterator it(indexLettersUsed);
- uint *pLetter;
- for (it.toFirst();(pLetter=it.current());++it)
- {
- if (headerItems) alphaLinks += "&#160;|&#160;";
- headerItems++;
- QCString li = letterToLabel(*pLetter);
- QCString ls = letterToString(*pLetter);
+ bool first=true;
+ for (const auto &letter : indexLettersUsed)
+ {
+ if (!first) alphaLinks += "&#160;|&#160;";
+ first=false;
+ QCString li = letterToLabel(letter.c_str());
alphaLinks += (QCString)"<a class=\"qindex\" href=\"#letter_" +
li + "\">" +
- ls + "</a>";
+ letter + "</a>";
}
alphaLinks += "</div>\n";
ol.writeString(alphaLinks);
-
- // the number of columns in the table
- const int columns = Config_getInt(COLS_IN_ALPHA_INDEX);
-
- int i,j;
- int totalItems = headerItems*2 + annotatedCount; // number of items in the table (headers span 2 items)
- int rows = (totalItems + columns - 1)/columns; // number of rows in the table
-
- //printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
- // headerItems,totalItems,columns,rows,itemsInLastRow);
-
- // Keep a list of classes for each starting letter
- LetterToIndexMap<PrefixIgnoreClassList> classesByLetter;
- AlphaIndexTableColumns tableColumns;
+ std::map<std::string, std::vector<const ClassDef*> > classesByLetter;
// fill the columns with the class list (row elements in each column,
// expect for the columns with number >= itemsInLastRow, which get one
// item less.
- //int icount=0;
- startLetter=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (sliceOpt && cd->compoundType() != ct)
continue;
@@ -2262,185 +2153,100 @@ static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
int index = getPrefixIndex(cd->className());
- startLetter=getUtf8CodeToLower(cd->className(),index);
- // Do some sorting again, since the classes are sorted by name with
- // prefix, which should be ignored really.
- if (cd->getLanguage()==SrcLangExt_VHDL)
+ char charStr[MAX_UTF8_CHAR_SIZE];
+ if (getUtf8Char(cd->className().data()+index,charStr,CaseModifier::ToUpper)>0)
+ // get the first UTF8 character (after the part that should be ignored)
{
- if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS )// no architecture
+ auto it = classesByLetter.find(charStr);
+ if (it!=classesByLetter.end()) // add class to the existing list
{
- classesByLetter.append(startLetter,cd);
+ it->second.push_back(cd.get());
+ }
+ else // new entry
+ {
+ classesByLetter.insert(
+ std::make_pair(std::string(charStr),
+ std::vector<const ClassDef*>({ cd.get() })));
}
- }
- else
- {
- classesByLetter.append(startLetter,cd);
}
}
}
- #define NEXT_ROW() \
- do \
- { \
- if (row>maxRows) maxRows=row; \
- if (row>=rows && col<columns) \
- { \
- col++; \
- row=0; \
- tableRows = new AlphaIndexTableRows; \
- tableColumns.append(tableRows); \
- } \
- } \
- while(0) \
-
- AlphaIndexTableRows *tableRows = new AlphaIndexTableRows;
- tableColumns.append(tableRows);
- int col=0,row=0,maxRows=0;
- PrefixIgnoreClassList *cl;
- SIntDict<PrefixIgnoreClassList>::Iterator lit(classesByLetter);
- for (lit.toFirst();(cl=lit.current());++lit)
+ // sort the class lists per letter while ignoring the prefix
+ for (auto &kv : classesByLetter)
{
- uint l = cl->letter();
- // add special header cell
- tableRows->append(new AlphaIndexTableCell(row,col,l,(ClassDef*)0x8));
- row++;
- tableRows->append(new AlphaIndexTableCell(row,col,0,(ClassDef*)0x8));
- row++;
- ClassListIterator cit(*cl);
- cit.toFirst();
- cd = cit.current();
- ++cit;
- tableRows->append(new AlphaIndexTableCell(row,col,0,cd));
- row++;
- NEXT_ROW();
- for (;(cd=cit.current()); ++cit)
- {
- // add normal cell
- tableRows->append(new AlphaIndexTableCell(row,col,0,cd));
- row++;
- NEXT_ROW();
- }
- }
-
- // create row iterators for each column
- AlphaIndexTableRowsIterator **colIterators = new AlphaIndexTableRowsIterator*[columns];
- for (i=0;i<columns;i++)
- {
- if (i<(int)tableColumns.count())
- {
- colIterators[i] = new AlphaIndexTableRowsIterator(*tableColumns.at(i));
- }
- else // empty column
- {
- colIterators[i] = 0;
- }
+ std::sort(kv.second.begin(), kv.second.end(),
+ [](const auto &c1,const auto &c2)
+ {
+ QCString n1 = c1->className();
+ QCString n2 = c2->className();
+ return qstricmp(n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2))<0;
+ });
}
- ol.writeString("<table class=\"classindex\">\n");
// generate table
- for (i=0;i<=maxRows;i++) // foreach table row
- {
- //printf("writing row %d\n",i);
- //ol.nextTableRow();
- ol.writeString("<tr>");
- // the last column may contain less items then the others
- //int colsInRow = (i<rows-1) ? columns : itemsInLastRow;
- //printf("row [%d]\n",i);
- bool cellCont = false;
- for (j=0;j<columns;j++) // foreach table column
- {
- if (colIterators[j])
+ if (!classesByLetter.empty())
+ {
+ ol.writeString("<div class=\"classindex\">\n");
+ int counter=0;
+ for (const auto &cl : classesByLetter)
+ {
+ QCString parity = (counter++%2)==0 ? "even" : "odd";
+ ol.writeString("<dl class=\"classindex " + parity + "\">\n");
+
+ // write character heading
+ ol.writeString("<dt class=\"alphachar\">");
+ QCString s = letterToLabel(cl.first.c_str());
+ ol.writeString("<a name=\"letter_");
+ ol.writeString(s);
+ ol.writeString("\">");
+ ol.writeString(cl.first.c_str());
+ ol.writeString("</a>");
+ ol.writeString("</dt>\n");
+
+ // write class links
+ for (const auto &cd : cl.second)
{
- AlphaIndexTableCell *cell = colIterators[j]->current();
- if (cell)
+ ol.writeString("<dd>");
+ QCString namesp,cname;
+ extractNamespaceName(cd->name(),cname,namesp);
+ QCString nsDispName;
+ SrcLangExt lang = cd->getLanguage();
+ QCString sep = getLanguageSpecificSeparator(lang);
+ if (sep!="::")
{
- if (cell->row()==i)
- {
- if (cell->letter()!=0)
- {
- cellCont = true;
- QCString s = letterToLabel(cell->letter());
- ol.writeString("<td rowspan=\"2\" valign=\"bottom\">");
- ol.writeString("<a name=\"letter_");
- ol.writeString(s);
- ol.writeString("\"></a>");
- ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
- "<tr>"
- "<td><div class=\"ah\">&#160;&#160;");
- ol.writeString(letterToString(cell->letter()));
- ol.writeString( "&#160;&#160;</div>"
- "</td>"
- "</tr>"
- "</table>\n");
- }
- else if (cell->classDef()!=(ClassDef*)0x8)
- {
- cellCont = true;
- cd = cell->classDef();
- ol.writeString("<td valign=\"top\">");
- QCString namesp,cname;
- //if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName();
- //QCString cname=cd->className();
- extractNamespaceName(cd->name(),cname,namesp);
- QCString nsDispName;
- SrcLangExt lang = cd->getLanguage();
- QCString sep = getLanguageSpecificSeparator(lang);
- if (sep!="::")
- {
- nsDispName=substitute(namesp,"::",sep);
- cname=substitute(cname,"::",sep);
- }
- else
- {
- nsDispName=namesp;
- }
-
- ol.writeObjectLink(cd->getReference(),
- cd->getOutputFileBase(),cd->anchor(),cname);
- if (!namesp.isEmpty())
- {
- ol.docify(" (");
- NamespaceDef *nd = getResolvedNamespace(namesp);
- if (nd && nd->isLinkable())
- {
- ol.writeObjectLink(nd->getReference(),
- nd->getOutputFileBase(),0,nsDispName);
- }
- else
- {
- ol.docify(nsDispName);
- }
- ol.docify(")");
- }
- ol.writeNonBreakableSpace(3);
- }
- ++(*colIterators[j]);
- if (cell->letter()!=0 || cell->classDef()!=(ClassDef*)0x8)
- {
- ol.writeString("</td>\n");
- }
- }
+ nsDispName=substitute(namesp,"::",sep);
+ cname=substitute(cname,"::",sep);
}
else
{
- cellCont = true;
- ol.writeString("<td></td>");
+ nsDispName=namesp;
}
- }
- }
- if (!cellCont) ol.writeString("<td></td>"); // we need at least one cell in case of xhtml
- ol.writeString("</tr>\n");
- }
- ol.writeString("</table>\n");
- ol.writeString(alphaLinks);
+ ol.writeObjectLink(cd->getReference(),
+ cd->getOutputFileBase(),cd->anchor(),cname);
+ if (!namesp.isEmpty())
+ {
+ ol.writeString(" (");
+ NamespaceDef *nd = getResolvedNamespace(namesp);
+ if (nd && nd->isLinkable())
+ {
+ ol.writeObjectLink(nd->getReference(),
+ nd->getOutputFileBase(),0,nsDispName);
+ }
+ else
+ {
+ ol.docify(nsDispName);
+ }
+ ol.writeString(")");
+ }
+ ol.writeString("</dd>");
+ }
- // release the temporary memory
- for (i=0;i<columns;i++)
- {
- delete colIterators[i];
+ ol.writeString("</dl>\n");
+ }
+ ol.writeString("</div>\n");
}
- delete[] colIterators;
}
//----------------------------------------------------------------------------
@@ -2642,7 +2448,7 @@ static void writeAnnotatedIndexGeneric(OutputList &ol,const AnnotatedIndexContex
}
FTVHelp ftv(false);
writeClassTreeInsideNamespace(Doxygen::namespaceSDict,&ftv,TRUE,addToIndex,ctx.compoundType);
- writeClassTree(Doxygen::classSDict,&ftv,addToIndex,TRUE,ctx.compoundType);
+ writeClassTree(*Doxygen::classLinkedMap,&ftv,addToIndex,TRUE,ctx.compoundType);
QGString outStr;
FTextStream t(&outStr);
ftv.generateTreeViewInline(t);
@@ -3961,7 +3767,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
// write group info
bool hasSubGroups = gd->getSubGroups()->count()>0;
bool hasSubPages = gd->getPages()->count()>0;
- int numSubItems = 0;
+ size_t numSubItems = 0;
if (1 /*Config_getBool(TOC_EXPAND)*/)
{
QListIterator<MemberList> mli(gd->getMemberLists());
@@ -3974,9 +3780,9 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
}
}
numSubItems += gd->getNamespaces()->count();
- numSubItems += gd->getClasses()->count();
+ numSubItems += gd->getClasses().size();
numSubItems += gd->getFiles()->count();
- numSubItems += static_cast<int>(gd->getDirs().size());
+ numSubItems += gd->getDirs().size();
numSubItems += gd->getPages()->count();
}
@@ -4054,9 +3860,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
}
else if (lde->kind()==LayoutDocEntry::GroupClasses && addToIndex)
{
- ClassSDict::Iterator it(*gd->getClasses());
- ClassDef *cd;
- for (;(cd=it.current());++it)
+ for (const auto &cd : gd->getClasses())
{
//bool nestedClassInSameGroup =
// cd->getOuterScope() && cd->getOuterScope()->definitionType()==Definition::TypeClass &&
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index b98b35b..156be8e 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -1046,10 +1046,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
break;
case isClassDocumentation:
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
@@ -1059,7 +1056,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
{
if (compactLatex) t << "\\doxysection"; else t << "\\chapter";
t << "{"; //Compound Documentation}\n";
- found=TRUE;
+ break;
}
}
}
@@ -1225,10 +1222,8 @@ void LatexGenerator::endIndexSection(IndexSections is)
break;
case isClassDocumentation:
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
@@ -1236,21 +1231,12 @@ void LatexGenerator::endIndexSection(IndexSections is)
!cd->isAlias()
)
{
- t << "}\n\\input{" << cd->getOutputFileBase() << "}\n";
- found=TRUE;
- }
- }
- for (;(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() &&
- cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope() &&
- !cd->isAlias()
- )
- {
- //if (compactLatex) t << "\\input"; else t << "\\include";
- t << "\\input";
- t << "{" << cd->getOutputFileBase() << "}\n";
+ if (!found)
+ {
+ t << "}\n"; // end doxysection or chapter title
+ found=TRUE;
+ }
+ t << "\\input{" << cd->getOutputFileBase() << "}\n";
}
}
}
@@ -1266,24 +1252,14 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
if (isFirst)
{
- t << "}\n\\input{" << fd->getOutputFileBase() << "}\n";
- if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
- {
- //t << "\\include{" << fd->getSourceFileBase() << "}\n";
- t << "\\input{" << fd->getSourceFileBase() << "}\n";
- }
- isFirst=FALSE;
+ t << "}\n"; // end doxysection or chapter title
}
- else
+ isFirst=FALSE;
+ t << "\\input{" << fd->getOutputFileBase() << "}\n";
+ if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
{
- //if (compactLatex) t << "\\input" ; else t << "\\include";
- t << "\\input" ;
- t << "{" << fd->getOutputFileBase() << "}\n";
- if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
- {
- //t << "\\include{" << fd->getSourceFileBase() << "}\n";
- t << "\\input{" << fd->getSourceFileBase() << "}\n";
- }
+ //t << "\\include{" << fd->getSourceFileBase() << "}\n";
+ t << "\\input{" << fd->getSourceFileBase() << "}\n";
}
}
}
diff --git a/src/linkedmap.h b/src/linkedmap.h
index 9ca0fa2..f09b6d8 100644
--- a/src/linkedmap.h
+++ b/src/linkedmap.h
@@ -73,6 +73,23 @@ class LinkedMap
return result;
}
+ //! Adds an existing object to the ordered vector (unless another object was already
+ //! added under the same key). Ownership is transferred.
+ //! Return a non-owning pointer to the newly added object, or to the existing object if
+ //! it was already inserted before under the given key.
+ T *add(const char *k, Ptr &&ptr)
+ {
+ T *result = find(k);
+ if (result==nullptr)
+ {
+ std::string key(k ? k : "");
+ result = ptr.get();
+ m_lookup.insert({key,result});
+ m_entries.push_back(std::move(ptr));
+ }
+ return result;
+ }
+
//! Prepends a new object to the ordered vector if it was not added already.
//! Return a non-owning pointer to the newly added object, or to the existing object if
//! it was already inserted before under the given key.
@@ -110,16 +127,18 @@ class LinkedMap
return false;
}
- iterator begin() { return m_entries.begin(); }
- iterator end() { return m_entries.end(); }
- const_iterator begin() const { return m_entries.cbegin(); }
- const_iterator end() const { return m_entries.cend(); }
- reverse_iterator rbegin() { return m_entries.rbegin(); }
- reverse_iterator rend() { return m_entries.rend(); }
- const_reverse_iterator rbegin() const { return m_entries.crbegin(); }
- const_reverse_iterator rend() const { return m_entries.crend(); }
- bool empty() const { return m_entries.empty(); }
- size_t size() const { return m_entries.size(); }
+ Ptr &operator[](size_t pos) { return m_entries[pos]; }
+ const Ptr &operator[](size_t pos) const { return m_entries[pos]; }
+ iterator begin() { return m_entries.begin(); }
+ iterator end() { return m_entries.end(); }
+ const_iterator begin() const { return m_entries.cbegin(); }
+ const_iterator end() const { return m_entries.cend(); }
+ reverse_iterator rbegin() { return m_entries.rbegin(); }
+ reverse_iterator rend() { return m_entries.rend(); }
+ const_reverse_iterator rbegin() const { return m_entries.crbegin(); }
+ const_reverse_iterator rend() const { return m_entries.crend(); }
+ bool empty() const { return m_entries.empty(); }
+ size_t size() const { return m_entries.size(); }
void clear()
{
@@ -220,16 +239,18 @@ class LinkedRefMap
return false;
}
- iterator begin() { return m_entries.begin(); }
- iterator end() { return m_entries.end(); }
- const_iterator begin() const { return m_entries.cbegin(); }
- const_iterator end() const { return m_entries.cend(); }
- reverse_iterator rbegin() { return m_entries.rbegin(); }
- reverse_iterator rend() { return m_entries.rend(); }
- const_reverse_iterator rbegin() const { return m_entries.crbegin(); }
- const_reverse_iterator rend() const { return m_entries.crend(); }
- bool empty() const { return m_entries.empty(); }
- size_t size() const { return m_entries.size(); }
+ Ptr &operator[](size_t pos) { return m_entries[pos]; }
+ const Ptr &operator[](size_t pos) const { return m_entries[pos]; }
+ iterator begin() { return m_entries.begin(); }
+ iterator end() { return m_entries.end(); }
+ const_iterator begin() const { return m_entries.cbegin(); }
+ const_iterator end() const { return m_entries.cend(); }
+ reverse_iterator rbegin() { return m_entries.rbegin(); }
+ reverse_iterator rend() { return m_entries.rend(); }
+ const_reverse_iterator rbegin() const { return m_entries.crbegin(); }
+ const_reverse_iterator rend() const { return m_entries.crend(); }
+ bool empty() const { return m_entries.empty(); }
+ size_t size() const { return m_entries.size(); }
void clear()
{
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 4b8b4d8..6a0bd4b 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -98,10 +98,10 @@ class NamespaceDefImpl : public DefinitionMixin<NamespaceDefMutable>
virtual const QList<MemberList> &getMemberLists() const { return m_memberLists; }
virtual MemberDef *getMemberByName(const QCString &) const;
virtual MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
- virtual ClassSDict *getClassSDict() const { return classSDict; }
- virtual ClassSDict *getInterfaceSDict() const { return interfaceSDict; }
- virtual ClassSDict *getStructSDict() const { return structSDict; }
- virtual ClassSDict *getExceptionSDict() const { return exceptionSDict; }
+ virtual ClassLinkedRefMap getClasses() const { return classes; }
+ virtual ClassLinkedRefMap getInterfaces() const { return interfaces; }
+ virtual ClassLinkedRefMap getStructs() const { return structs; }
+ virtual ClassLinkedRefMap getExceptions() const { return exceptions; }
virtual const NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
virtual QCString title() const;
@@ -118,7 +118,7 @@ class NamespaceDefImpl : public DefinitionMixin<NamespaceDefMutable>
void writeBriefDescription(OutputList &ol);
void startMemberDeclarations(OutputList &ol);
void endMemberDeclarations(OutputList &ol);
- void writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d);
+ void writeClassDeclarations(OutputList &ol,const QCString &title,const ClassLinkedRefMap &d);
void writeInlineClasses(OutputList &ol);
void writeMemberGroups(OutputList &ol);
void writeAuthorSection(OutputList &ol);
@@ -126,7 +126,7 @@ class NamespaceDefImpl : public DefinitionMixin<NamespaceDefMutable>
void endMemberDocumentation(OutputList &ol);
void writeSummaryLinks(OutputList &ol) const;
void addNamespaceAttributes(OutputList &ol);
- void writeClassesToTagFile(FTextStream &,ClassSDict *d);
+ void writeClassesToTagFile(FTextStream &,const ClassLinkedRefMap &d);
void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
bool isConstantGroup=false);
@@ -141,10 +141,10 @@ class NamespaceDefImpl : public DefinitionMixin<NamespaceDefMutable>
MemberSDict *m_allMembersDict = 0;
QList<MemberList> m_memberLists;
MemberGroupSDict *memberGroupSDict = 0;
- ClassSDict *classSDict = 0;
- ClassSDict *interfaceSDict = 0;
- ClassSDict *structSDict = 0;
- ClassSDict *exceptionSDict = 0;
+ ClassLinkedRefMap classes;
+ ClassLinkedRefMap interfaces;
+ ClassLinkedRefMap structs;
+ ClassLinkedRefMap exceptions;
NamespaceSDict *namespaceSDict = 0;
bool m_subGrouping = false;
enum { NAMESPACE, MODULE, CONSTANT_GROUP, LIBRARY } m_type;
@@ -214,14 +214,14 @@ class NamespaceDefAliasImpl : public DefinitionAliasMixin<NamespaceDef>
{ return getNSAlias()->getMemberByName(name); }
virtual MemberGroupSDict *getMemberGroupSDict() const
{ return getNSAlias()->getMemberGroupSDict(); }
- virtual ClassSDict *getClassSDict() const
- { return getNSAlias()->getClassSDict(); }
- virtual ClassSDict *getInterfaceSDict() const
- { return getNSAlias()->getInterfaceSDict(); }
- virtual ClassSDict *getStructSDict() const
- { return getNSAlias()->getStructSDict(); }
- virtual ClassSDict *getExceptionSDict() const
- { return getNSAlias()->getExceptionSDict(); }
+ virtual ClassLinkedRefMap getClasses() const
+ { return getNSAlias()->getClasses(); }
+ virtual ClassLinkedRefMap getInterfaces() const
+ { return getNSAlias()->getInterfaces(); }
+ virtual ClassLinkedRefMap getStructs() const
+ { return getNSAlias()->getStructs(); }
+ virtual ClassLinkedRefMap getExceptions() const
+ { return getNSAlias()->getExceptions(); }
virtual const NamespaceSDict *getNamespaceSDict() const
{ return getNSAlias()->getNamespaceSDict(); }
virtual QCString title() const
@@ -263,10 +263,6 @@ NamespaceDefImpl::NamespaceDefImpl(const char *df,int dl,int dc,
{
setFileName(name);
}
- classSDict = new ClassSDict(17);
- interfaceSDict = new ClassSDict(17);
- structSDict = new ClassSDict(17);
- exceptionSDict = new ClassSDict(17);
namespaceSDict = new NamespaceSDict(17);
m_innerCompounds = new SDict<Definition>(17);
m_allMembersDict = 0;
@@ -295,10 +291,6 @@ NamespaceDefImpl::NamespaceDefImpl(const char *df,int dl,int dc,
NamespaceDefImpl::~NamespaceDefImpl()
{
- delete classSDict;
- delete interfaceSDict;
- delete structSDict;
- delete exceptionSDict;
delete namespaceSDict;
delete m_innerCompounds;
delete memberGroupSDict;
@@ -375,35 +367,25 @@ void NamespaceDefImpl::addInnerCompound(const Definition *d)
void NamespaceDefImpl::insertClass(const ClassDef *cd)
{
- ClassSDict *d = classSDict;
+ ClassLinkedRefMap &d = classes;
if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
{
if (cd->compoundType()==ClassDef::Interface)
{
- d = interfaceSDict;
+ d = interfaces;
}
else if (cd->compoundType()==ClassDef::Struct)
{
- d = structSDict;
+ d = structs;
}
else if (cd->compoundType()==ClassDef::Exception)
{
- d = exceptionSDict;
+ d = exceptions;
}
}
- if (d->find(cd->name())==0)
- {
- if (Config_getBool(SORT_BRIEF_DOCS))
- {
- d->inSort(cd->name(),cd);
- }
- else
- {
- d->append(cd->name(),cd);
- }
- }
+ d.add(cd->name(),cd);
}
void NamespaceDefImpl::insertNamespace(const NamespaceDef *nd)
@@ -621,26 +603,22 @@ void NamespaceDefImpl::writeTagFile(FTextStream &tagFile)
break;
case LayoutDocEntry::NamespaceClasses:
{
- if (classSDict)
- writeClassesToTagFile(tagFile, classSDict);
+ writeClassesToTagFile(tagFile, classes);
}
break;
case LayoutDocEntry::NamespaceInterfaces:
{
- if (interfaceSDict)
- writeClassesToTagFile(tagFile, interfaceSDict);
+ writeClassesToTagFile(tagFile, interfaces);
}
break;
case LayoutDocEntry::NamespaceStructs:
{
- if (structSDict)
- writeClassesToTagFile(tagFile, structSDict);
+ writeClassesToTagFile(tagFile, structs);
}
break;
case LayoutDocEntry::NamespaceExceptions:
{
- if (exceptionSDict)
- writeClassesToTagFile(tagFile, exceptionSDict);
+ writeClassesToTagFile(tagFile, exceptions);
}
break;
case LayoutDocEntry::MemberDecl:
@@ -805,14 +783,14 @@ void NamespaceDefImpl::endMemberDocumentation(OutputList &ol)
}
}
-void NamespaceDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d)
+void NamespaceDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,const ClassLinkedRefMap &d)
{
- if (d) d->writeDeclaration(ol,0,title,TRUE);
+ d.writeDeclaration(ol,0,title,TRUE);
}
void NamespaceDefImpl::writeInlineClasses(OutputList &ol)
{
- if (classSDict) classSDict->writeDocumentation(ol,this);
+ classes.writeDocumentation(ol,this);
}
void NamespaceDefImpl::writeNamespaceDeclarations(OutputList &ol,const QCString &title,
@@ -863,28 +841,28 @@ void NamespaceDefImpl::writeSummaryLinks(OutputList &ol) const
SrcLangExt lang = getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if (lde->kind()==LayoutDocEntry::NamespaceClasses && classSDict && classSDict->declVisible())
+ if (lde->kind()==LayoutDocEntry::NamespaceClasses && classes.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "nested-classes";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::NamespaceInterfaces && interfaceSDict && interfaceSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::NamespaceInterfaces && interfaces.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "interfaces";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::NamespaceStructs && structSDict && structSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::NamespaceStructs && structs.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "structs";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::NamespaceExceptions && exceptionSDict && exceptionSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::NamespaceExceptions && exceptions.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "exceptions";
@@ -930,11 +908,9 @@ void NamespaceDefImpl::addNamespaceAttributes(OutputList &ol)
}
}
-void NamespaceDefImpl::writeClassesToTagFile(FTextStream &tagFile,ClassSDict *d)
+void NamespaceDefImpl::writeClassesToTagFile(FTextStream &tagFile,const ClassLinkedRefMap &list)
{
- SDict<ClassDef>::Iterator ci(*d);
- ClassDef *cd;
- for (ci.toFirst();(cd=ci.current());++ci)
+ for (const auto &cd : list)
{
if (cd->isLinkableInProject())
{
@@ -996,25 +972,25 @@ void NamespaceDefImpl::writeDocumentation(OutputList &ol)
case LayoutDocEntry::NamespaceClasses:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),classSDict);
+ writeClassDeclarations(ol,ls->title(lang),classes);
}
break;
case LayoutDocEntry::NamespaceInterfaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),interfaceSDict);
+ writeClassDeclarations(ol,ls->title(lang),interfaces);
}
break;
case LayoutDocEntry::NamespaceStructs:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),structSDict);
+ writeClassDeclarations(ol,ls->title(lang),structs);
}
break;
case LayoutDocEntry::NamespaceExceptions:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),exceptionSDict);
+ writeClassDeclarations(ol,ls->title(lang),exceptions);
}
break;
case LayoutDocEntry::NamespaceNestedNamespaces:
@@ -1147,25 +1123,25 @@ void NamespaceDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *cur
{
if (md->getNamespaceDef()==this && md->isLinkable() && !md->isEnumValue())
{
- ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
{
if (md==currentMd) // selected item => highlight
{
- ol.writeString("<a class=\"qindexHL\" ");
+ ol.writeString(" <tr><td class=\"navtabHL\">");
}
else
{
- ol.writeString("<a class=\"qindex\" ");
+ ol.writeString(" <tr><td class=\"navtab\">");
}
+ ol.writeString("<a class=\"navtab\" ");
ol.writeString("href=\"");
if (createSubDirs) ol.writeString("../../");
ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
ol.writeString("\">");
ol.writeString(convertToHtml(md->localName()));
ol.writeString("</a>");
+ ol.writeString("</td></tr>\n");
}
- ol.writeString("</td></tr>\n");
}
}
}
@@ -1456,22 +1432,23 @@ void NamespaceDefImpl::sortMemberLists()
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
}
- if (classSDict)
- {
- classSDict->sort();
- }
- if (interfaceSDict)
- {
- interfaceSDict->sort();
- }
- if (structSDict)
- {
- structSDict->sort();
- }
- if (exceptionSDict)
+
+
+ if (Config_getBool(SORT_BRIEF_DOCS))
{
- exceptionSDict->sort();
+ auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name())<0 :
+ qstricmp(c1->className(), c2->className())<0;
+ };
+
+ std::sort(classes.begin(), classes.end(), classComp);
+ std::sort(interfaces.begin(),interfaces.end(),classComp);
+ std::sort(structs.begin(), structs.end(), classComp);
+ std::sort(exceptions.begin(),exceptions.end(),classComp);
}
+
if (namespaceSDict)
{
namespaceSDict->sort();
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 18171f7..e22f069 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -28,7 +28,7 @@
class MemberList;
class ClassDef;
class OutputList;
-class ClassSDict;
+class ClassLinkedRefMap;
class MemberDef;
class MemberGroupSDict;
class NamespaceSDict;
@@ -73,16 +73,16 @@ class NamespaceDef : public Definition
virtual MemberGroupSDict *getMemberGroupSDict() const = 0;
/*! Returns the classes contained in this namespace */
- virtual ClassSDict *getClassSDict() const = 0;
+ virtual ClassLinkedRefMap getClasses() const = 0;
/*! Returns the Slice interfaces contained in this namespace */
- virtual ClassSDict *getInterfaceSDict() const = 0;
+ virtual ClassLinkedRefMap getInterfaces() const = 0;
/*! Returns the Slice structs contained in this namespace */
- virtual ClassSDict *getStructSDict() const = 0;
+ virtual ClassLinkedRefMap getStructs() const = 0;
/*! Returns the Slice exceptions contained in this namespace */
- virtual ClassSDict *getExceptionSDict() const = 0;
+ virtual ClassLinkedRefMap getExceptions() const = 0;
/*! Returns the namespaces contained in this namespace */
virtual const NamespaceSDict *getNamespaceSDict() const = 0;
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index c2d120f..24f7482 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -1863,13 +1863,9 @@ void PerlModGenerator::generatePerlModForClass(const ClassDef *cd)
m_output.closeList();
}
- ClassSDict *cl = cd->getClassSDict();
- if (cl)
{
m_output.openList("inner");
- ClassSDict::Iterator cli(*cl);
- const ClassDef *icd;
- for (cli.toFirst();(icd=cli.current());++cli)
+ for (const auto &icd : cd->getClasses())
m_output.openHash()
.addFieldQuotedString("name", icd->name())
.closeHash();
@@ -1970,13 +1966,9 @@ void PerlModGenerator::generatePerlModForNamespace(const NamespaceDef *nd)
m_output.openHash()
.addFieldQuotedString("name", nd->name());
- ClassSDict *cl = nd->getClassSDict();
- if (cl)
{
m_output.openList("classes");
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : nd->getClasses())
m_output.openHash()
.addFieldQuotedString("name", cd->name())
.closeHash();
@@ -2116,13 +2108,9 @@ void PerlModGenerator::generatePerlModForGroup(const GroupDef *gd)
m_output.closeList();
}
- ClassSDict *cl = gd->getClasses();
- if (cl)
{
m_output.openList("classes");
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : gd->getClasses())
m_output.openHash()
.addFieldQuotedString("name", cd->name())
.closeHash();
@@ -2214,10 +2202,8 @@ bool PerlModGenerator::generatePerlModOutput()
m_output.add("$doxydocs=").openHash();
m_output.openList("classes");
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- generatePerlModForClass(cd);
+ for (const auto &cd : *Doxygen::classLinkedMap)
+ generatePerlModForClass(cd.get());
m_output.closeList();
m_output.openList("namespaces");
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 17ed794..b96e4b5 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -519,10 +519,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
case isClassDocumentation:
{
//Compound Documentation
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
@@ -531,7 +528,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
)
{
beginRTFChapter();
- found=TRUE;
+ break;
}
}
}
@@ -809,9 +806,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isClassDocumentation:
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- bool found=FALSE;
+ bool first=true;
if (fortranOpt)
{
t << "{\\tc \\v " << theTranslator->trTypeDocumentation() << "}"<< endl;
@@ -820,7 +815,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
t << "{\\tc \\v " << theTranslator->trClassDocumentation() << "}"<< endl;
}
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
@@ -829,22 +824,11 @@ void RTFGenerator::endIndexSection(IndexSections is)
)
{
t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << cd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- found=TRUE;
- }
- }
- for (;(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() &&
- cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope() &&
- !cd->isAlias()
- )
- {
- t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
+ if (!first)
+ {
+ beginRTFSection();
+ }
+ first=false;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << cd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -863,31 +847,19 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
if (fd->isLinkableInProject())
{
- if (isFirst)
+ t << "\\par " << rtf_Style_Reset << endl;
+ if (!isFirst)
{
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << fd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"" << fd->getSourceFileBase() << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- isFirst=FALSE;
+ beginRTFSection();
}
- else
+ isFirst=FALSE;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << fd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
{
t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << fd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"" << fd->getSourceFileBase() << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"" << fd->getSourceFileBase() << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
}
}
}
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
index 0464cb4..209cdea 100644
--- a/src/searchindex.cpp
+++ b/src/searchindex.cpp
@@ -738,36 +738,34 @@ void createJavaScriptSearchIndex()
// add symbols to letter -> symbol list map
// index classes
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
uint letter = getUtf8CodeToLower(cd->localName(),0);
if (cd->isLinkable() && isId(letter))
{
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,cd.get());
if (sliceOpt)
{
if (cd->compoundType()==ClassDef::Interface)
{
- g_searchIndexInfo[SEARCH_INDEX_INTERFACES].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_INTERFACES].symbolList.append(letter,cd.get());
}
else if (cd->compoundType()==ClassDef::Struct)
{
- g_searchIndexInfo[SEARCH_INDEX_STRUCTS].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_STRUCTS].symbolList.append(letter,cd.get());
}
else if (cd->compoundType()==ClassDef::Exception)
{
- g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].symbolList.append(letter,cd.get());
}
else // cd->compoundType()==ClassDef::Class
{
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd.get());
}
}
else // non slice optimisation: group all types under classes
{
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd.get());
}
}
}
diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp
index bfbe25e..f06d6ee 100644
--- a/src/sqlite3gen.cpp
+++ b/src/sqlite3gen.cpp
@@ -1264,13 +1264,9 @@ I think the hurdles are:
inner_refid (unless I'm missing a method that would uniformly return
the correct refid for all types).
*/
-static void writeInnerClasses(const ClassSDict *cl, struct Refid outer_refid)
+static void writeInnerClasses(const ClassLinkedRefMap &cl, struct Refid outer_refid)
{
- if (!cl) return;
-
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : cl)
{
if (!cd->isHidden() && !cd->isAnonymous())
{
@@ -2018,7 +2014,7 @@ static void generateSqlite3ForClass(const ClassDef *cd)
}
// + list of inner classes
- writeInnerClasses(cd->getClassSDict(),refid);
+ writeInnerClasses(cd->getClasses(),refid);
// + template argument list(s)
writeTemplateList(cd);
@@ -2082,7 +2078,7 @@ static void generateSqlite3ForNamespace(const NamespaceDef *nd)
step(compounddef_insert);
// + contained class definitions
- writeInnerClasses(nd->getClassSDict(),refid);
+ writeInnerClasses(nd->getClasses(),refid);
// + contained namespace definitions
writeInnerNamespaces(nd->getNamespaceSDict(),refid);
@@ -2244,10 +2240,7 @@ static void generateSqlite3ForFile(const FileDef *fd)
}
// + contained class definitions
- if (fd->getClassSDict())
- {
- writeInnerClasses(fd->getClassSDict(),refid);
- }
+ writeInnerClasses(fd->getClasses(),refid);
// + contained namespace definitions
if (fd->getNamespaceSDict())
@@ -2555,12 +2548,10 @@ void generateSqlite3()
recordMetadata();
// + classes
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
msg("Generating Sqlite3 output for class %s\n",cd->name().data());
- generateSqlite3ForClass(cd);
+ generateSqlite3ForClass(cd.get());
}
// + namespaces
diff --git a/src/util.cpp b/src/util.cpp
index ef1e709..3aa5863 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -480,7 +480,7 @@ QCString resolveTypeDef(const Definition *context,const QCString &qualifiedName,
ClassDef *getClass(const char *n)
{
if (n==0 || n[0]=='\0') return 0;
- return Doxygen::classSDict->find(n);
+ return Doxygen::classLinkedMap->find(n);
}
NamespaceDef *getResolvedNamespace(const char *name)
@@ -3575,22 +3575,28 @@ bool hasVisibleRoot(const BaseClassList &bcl)
// copies the next UTF8 character from input stream into buffer ids
// returns the size of the character in bytes (or 0 if it is invalid)
// the character itself will be copied as a UTF-8 encoded string to ids.
-int getUtf8Char(const signed char *input,char ids[5])
+int getUtf8Char(const char *input,char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
{
int inputLen=1;
const unsigned char uc = (unsigned char)*input;
bool validUTF8Char = false;
if (uc <= 0xf7)
{
- ids[ 0 ] = *input;
- const signed char* pt = input+1;
+ const char* pt = input+1;
int l = 0;
if ((uc&0x80)==0x00)
{
+ switch (modifier)
+ {
+ case CaseModifier::None: ids[0]=*input; break;
+ case CaseModifier::ToUpper: ids[0]=toupper(*input); break;
+ case CaseModifier::ToLower: ids[0]=tolower(*input); break;
+ }
l=1; // 0xxx.xxxx => normal single byte ascii character
}
else
{
+ ids[ 0 ] = *input;
if ((uc&0xE0)==0xC0)
{
l=2; // 110x.xxxx: >=2 byte character
@@ -3635,7 +3641,7 @@ QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscor
if (name==0) return "";
GrowBuf growBuf;
signed char c;
- const signed char *p=(const signed char*)name;
+ const char *p=name;
while ((c=*p++)!=0)
{
switch(c)
@@ -3671,7 +3677,7 @@ QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscor
default:
if (c<0)
{
- char ids[5];
+ char ids[MAX_UTF8_CHAR_SIZE];
bool doEscape = true;
if (allowUnicodeNames)
{
@@ -6980,34 +6986,29 @@ bool namespaceHasNestedClass(const NamespaceDef *nd,bool filterClasses,ClassDef:
}
}
- const ClassSDict *d = nd->getClassSDict();
+ ClassLinkedRefMap list = nd->getClasses();
if (filterClasses)
{
if (ct == ClassDef::Interface)
{
- d = nd->getInterfaceSDict();
+ list = nd->getInterfaces();
}
else if (ct == ClassDef::Struct)
{
- d = nd->getStructSDict();
+ list = nd->getStructs();
}
else if (ct == ClassDef::Exception)
{
- d = nd->getExceptionSDict();
+ list = nd->getExceptions();
}
}
- if (d)
+ for (const auto &cd : list)
{
- ClassSDict::Iterator cli(*d);
- const ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
- if (cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- //printf("<namespaceHasVisibleChild(%s,includeClasses=%d): case3\n",nd->name().data(),includeClasses);
- return TRUE;
- }
+ //printf("<namespaceHasVisibleChild(%s,includeClasses=%d): case3\n",nd->name().data(),includeClasses);
+ return TRUE;
}
}
return FALSE;
diff --git a/src/util.h b/src/util.h
index 2c088c4..38e8b2e 100644
--- a/src/util.h
+++ b/src/util.h
@@ -48,7 +48,6 @@ class OutputList;
class OutputDocInterface;
class MemberDef;
class ExampleSDict;
-class ClassSDict;
class GroupDef;
class NamespaceSDict;
class ClassList;
@@ -460,6 +459,15 @@ QCString getDotImageExtension();
bool fileVisibleInIndex(const FileDef *fd,bool &genSourceFile);
+const int MAX_UTF8_CHAR_LEN = 4;
+const int MAX_UTF8_CHAR_SIZE = MAX_UTF8_CHAR_LEN+1; // include 0 terminator
+enum class CaseModifier
+{
+ None,
+ ToUpper,
+ ToLower
+};
+int getUtf8Char(const char *input,char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier=CaseModifier::None);
uint getUtf8Code( const QCString& s, int idx );
uint getUtf8CodeToLower( const QCString& s, int idx );
uint getUtf8CodeToUpper( const QCString& s, int idx );
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
index 93afb4b..dd208aa 100644
--- a/src/vhdldocgen.cpp
+++ b/src/vhdldocgen.cpp
@@ -174,10 +174,8 @@ static void createSVG()
// Brief descriptions for entities are shown too.
void VhdlDocGen::writeOverview()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
bool found=FALSE;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS )
{
@@ -201,14 +199,14 @@ void VhdlDocGen::writeOverview()
startDot(t);
- for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS )
{
continue;
}
- QList<MemberDef>* port= getPorts(cd);
+ QList<MemberDef>* port= getPorts(cd.get());
if (port==0)
{
continue;
@@ -221,12 +219,11 @@ void VhdlDocGen::writeOverview()
}
startTable(t,cd->name());
- writeClassToDot(t,cd);
+ writeClassToDot(t,cd.get());
writeTable(port,t);
endTable(t);
- // writeVhdlPortToolTip(t,port,cd);
- writeVhdlEntityToolTip(t,cd);
+ writeVhdlEntityToolTip(t,cd.get());
delete port;
for (const auto &bcd : cd->baseClasses())
@@ -637,7 +634,7 @@ const char* VhdlDocGen::findKeyWord(const QCString& kw)
ClassDef *VhdlDocGen::getClass(const char *name)
{
if (name==0 || name[0]=='\0') return 0;
- return Doxygen::classSDict->find(QCString(name).stripWhiteSpace());
+ return Doxygen::classLinkedMap->find(QCString(name).stripWhiteSpace());
}
ClassDef* VhdlDocGen::getPackageName(const QCString & name)
@@ -974,12 +971,10 @@ void VhdlDocGen::writeInlineClassLink(const ClassDef* cd ,OutputList& ol)
*/
void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd)
{
- ClassDef *citer;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- for ( ; (citer=cli.current()) ; ++cli )
+ for (const auto &citer : *Doxygen::classLinkedMap)
{
QCString jj=citer->className();
- if (cd != citer && jj.contains('-')!=-1)
+ if (cd != citer.get() && jj.contains('-')!=-1)
{
QCStringList ql=QCStringList::split("-",jj);
QCString temp=ql[1];
@@ -992,13 +987,10 @@ void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd)
}// for
}//findAllArchitectures
-ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd)
+const ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd)
{
- ClassDef *citer;
QCString nn=cd->name();
- ClassSDict::Iterator cli(*Doxygen::classSDict);
-
- for ( ; (citer=cli.current()) ; ++cli )
+ for (const auto &citer : *Doxygen::classLinkedMap)
{
QCString jj=citer->name();
QCStringList ql=QCStringList::split(":",jj);
@@ -1006,7 +998,7 @@ ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd)
{
if (ql[0]==nn )
{
- return citer;
+ return citer.get();
}
}
}
@@ -2570,21 +2562,18 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch)
- // find class with upper/lower letters
- ClassDef* VhdlDocGen::findVhdlClass(const char *className )
+// find class with upper/lower letters
+ClassDef* VhdlDocGen::findVhdlClass(const char *className )
+{
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
-
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
- {
- if (qstricmp(className,cd->name().data())==0)
- {
- return cd;
- }
- }
- return 0;
+ if (qstricmp(className,cd->name().data())==0)
+ {
+ return cd.get();
+ }
}
+ return 0;
+}
/*
@@ -2624,8 +2613,8 @@ void VhdlDocGen::computeVhdlComponentRelations()
ClassDefMutable *classEntity= toClassDefMutable(VhdlDocGen::findVhdlClass(entity.data()));
inst=VhdlDocGen::getIndexWord(cur->args.data(),0);
- ClassDefMutable *cd=toClassDefMutable(Doxygen::classSDict->find(inst));
- ClassDefMutable *ar=toClassDefMutable(Doxygen::classSDict->find(cur->args));
+ ClassDefMutable *cd=toClassDefMutable(Doxygen::classLinkedMap->find(inst));
+ ClassDefMutable *ar=toClassDefMutable(Doxygen::classLinkedMap->find(cur->args));
if (cd==0)
{
diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h
index b98ea44..22751c5 100644
--- a/src/vhdldocgen.h
+++ b/src/vhdldocgen.h
@@ -215,8 +215,8 @@ class VhdlDocGen
static void parseUCF(const char* input,Entry* entity,QCString f,bool vendor);
- static ClassDef* findArchitecture(const ClassDef *cd);
- static ClassDef* findArchitecture(QCString identifier, QCString entity_name);
+ static const ClassDef* findArchitecture(const ClassDef *cd);
+ //static const ClassDef* findArchitecture(QCString identifier, QCString entity_name);
static void correctMemberProperties(MemberDefMutable *md);
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 1993c1e..68ecdf0 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -1124,27 +1124,22 @@ static void writeListOfAllMembers(const ClassDef *cd,FTextStream &t)
t << " </listofallmembers>" << endl;
}
-static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
+static void writeInnerClasses(const ClassLinkedRefMap &cl,FTextStream &t)
{
- if (cl)
+ for (const auto &cd : cl)
{
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ if (!cd->isHidden() && !cd->isAnonymous())
{
- if (!cd->isHidden() && !cd->isAnonymous())
+ t << " <innerclass refid=\"" << classOutputFileBase(cd)
+ << "\" prot=\"";
+ switch(cd->protection())
{
- t << " <innerclass refid=\"" << classOutputFileBase(cd)
- << "\" prot=\"";
- switch(cd->protection())
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: t << "package"; break;
- }
- t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
}
+ t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
}
}
}
@@ -1363,7 +1358,7 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
}
}
- writeInnerClasses(cd->getClassSDict(),t);
+ writeInnerClasses(cd->getClasses(),t);
writeTemplateList(cd,t);
if (cd->getMemberGroupSDict())
@@ -1467,7 +1462,7 @@ static void generateXMLForNamespace(const NamespaceDef *nd,FTextStream &ti)
writeXMLString(t,nd->name());
t << "</compoundname>" << endl;
- writeInnerClasses(nd->getClassSDict(),t);
+ writeInnerClasses(nd->getClasses(),t);
writeInnerNamespaces(nd->getNamespaceSDict(),t);
if (nd->getMemberGroupSDict())
@@ -1598,10 +1593,7 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti)
t << " </invincdepgraph>" << endl;
}
- if (fd->getClassSDict())
- {
- writeInnerClasses(fd->getClassSDict(),t);
- }
+ writeInnerClasses(fd->getClasses(),t);
if (fd->getNamespaceSDict())
{
writeInnerNamespaces(fd->getNamespaceSDict(),t);
@@ -1965,23 +1957,10 @@ void generateXML()
t << "xml:lang=\"" << theTranslator->trISOLang() << "\"";
t << ">" << endl;
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- generateXMLForClass(cd,t);
- }
+ generateXMLForClass(cd.get(),t);
}
- //{
- // ClassSDict::Iterator cli(Doxygen::hiddenClasses);
- // ClassDef *cd;
- // for (cli.toFirst();(cd=cli.current());++cli)
- // {
- // msg("Generating XML output for class %s\n",cd->name().data());
- // generateXMLForClass(cd,t);
- // }
- //}
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
const NamespaceDef *nd;
for (nli.toFirst();(nd=nli.current());++nli)
diff --git a/templates/html/doxygen.css b/templates/html/doxygen.css
index d54f714..5898d87 100644
--- a/templates/html/doxygen.css
+++ b/templates/html/doxygen.css
@@ -103,30 +103,96 @@ caption {
}
span.legend {
- font-size: 70%;
- text-align: center;
+ font-size: 70%;
+ text-align: center;
}
h3.version {
- font-size: 90%;
- text-align: center;
+ font-size: 90%;
+ text-align: center;
}
-div.qindex, div.navtab{
- background-color: ##ee;
- border: 1px solid ##b0;
- text-align: center;
+div.navtab {
+ border-right: 1px solid ##b0;
+ padding-right: 15px;
+ text-align: right;
+ line-height: 110%;
}
-div.qindex, div.navpath {
+div.navtab table {
+ border-spacing: 0;
+}
+
+td.navtab {
+ padding-right: 6px;
+ padding-left: 6px;
+}
+td.navtabHL {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ padding-right: 6px;
+ padding-left: 6px;
+}
+
+td.navtabHL a, td.navtabHL a:visited {
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+a.navtab {
+ font-weight: bold;
+}
+
+div.qindex{
+ text-align: center;
width: 100%;
line-height: 140%;
+ font-size: 130%;
+ color: #A0A0A0;
}
-div.navtab {
- margin-right: 15px;
+dt.alphachar{
+ font-size: 180%;
+ font-weight: bold;
+}
+
+.alphachar a{
+ color: black;
+}
+
+.alphachar a:hover, .alphachar a:visited{
+ text-decoration: none;
+}
+
+.classindex dl {
+ padding: 25px;
+ column-count:1
+}
+
+.classindex dd {
+ display:inline-block;
+ margin-left: 50px;
+ width: 90%;
+ line-height: 1.15em;
+}
+
+.classindex dl.odd {
+ background-color: ##F9;
+}
+
+@media(min-width: 1120px) {
+ .classindex dl {
+ column-count:2
+ }
}
+@media(min-width: 1320px) {
+ .classindex dl {
+ column-count:3
+ }
+}
+
+
/* @group Link Styling */
a {
@@ -143,17 +209,6 @@ a:hover {
text-decoration: underline;
}
-a.qindex {
- font-weight: bold;
-}
-
-a.qindexHL {
- font-weight: bold;
- background-color: ##AA;
- color: ##ff;
- border: 1px double ##98;
-}
-
.contents a.qindexHL:visited {
color: ##ff;
}
diff --git a/templates/html/search.js b/templates/html/search.js
index 77ee7ab..c1fc7c9 100644
--- a/templates/html/search.js
+++ b/templates/html/search.js
@@ -441,12 +441,12 @@ function SearchResults(name)
while (element && element!=parentElement)
{
- if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+ if (element.nodeName == 'div' && element.className == 'SRChildren')
{
return element;
}
- if (element.nodeName == 'DIV' && element.hasChildNodes())
+ if (element.nodeName == 'div' && element.hasChildNodes())
{
element = element.firstChild;
}