From 54d939984cd99ee3414f6b8aee3a90a134ba8677 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Fri, 1 Jan 2021 11:23:23 +0100 Subject: Refactoring: replace Doxygen::directories by Doxygen::dirLinkedMap --- src/context.cpp | 21 +++++++------------- src/context.h | 9 +++++---- src/dirdef.cpp | 57 +++++++++++++++++++++++++++--------------------------- src/dirdef.h | 18 ++++++++++++++--- src/docbookgen.cpp | 13 +------------ src/doxygen.cpp | 18 +++++++---------- src/doxygen.h | 2 +- src/index.cpp | 18 +++++++---------- src/latexgen.cpp | 25 ++++++++---------------- src/rtfgen.cpp | 20 +++++++++++++------ src/sqlite3gen.cpp | 10 +++------- src/util.cpp | 2 +- src/xmlgen.cpp | 10 +++------- 13 files changed, 100 insertions(+), 123 deletions(-) diff --git a/src/context.cpp b/src/context.cpp index f597200..24ef4b4 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -6517,15 +6517,13 @@ class NestingContext::Private : public GenericNodeListContext addClass(cd.get(),rootOnly,visitedClasses); } } - void addDirs(const DirSDict &dirDict,ClassDefSet &visitedClasses) + void addDirs(const DirLinkedMap &dirLinkedMap,ClassDefSet &visitedClasses) { - SDict::Iterator dli(dirDict); - const DirDef *dd; - for (dli.toFirst();(dd=dli.current());++dli) + for (const auto &dd : dirLinkedMap) { if (dd->getOuterScope()==Doxygen::globalScope) { - append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE,visitedClasses)); + append(NestingNodeContext::alloc(m_parent,dd.get(),m_index,m_level,FALSE,FALSE,FALSE,visitedClasses)); m_index++; } } @@ -6721,7 +6719,7 @@ void NestingContext::addNamespaces(const NamespaceLinkedRefMap &nsLinkedRefMap,b p->addNamespaces(nsLinkedRefMap,rootOnly,addClasses,visitedClasses); } -void NestingContext::addDirs(const DirSDict &dirs,ClassDefSet &visitedClasses) +void NestingContext::addDirs(const DirLinkedMap &dirs,ClassDefSet &visitedClasses) { p->addDirs(dirs,visitedClasses); } @@ -7117,11 +7115,9 @@ class DirListContext::Private : public GenericNodeListContext public: Private() { - const DirDef *dir; - DirSDict::Iterator sdi(*Doxygen::directories); - for (sdi.toFirst();(dir=sdi.current());++sdi) + for (const auto &dir : *Doxygen::dirLinkedMap) { - append(DirContext::alloc(dir)); + append(DirContext::alloc(dir.get())); } } }; @@ -7217,10 +7213,7 @@ class FileTreeContext::Private // Add dirs tree m_dirFileTree.reset(NestingContext::alloc(0,0)); ClassDefSet visitedClasses; - if (Doxygen::directories) - { - m_dirFileTree->addDirs(*Doxygen::directories,visitedClasses); - } + m_dirFileTree->addDirs(*Doxygen::dirLinkedMap,visitedClasses); if (Doxygen::inputNameLinkedMap) { m_dirFileTree->addFiles(*Doxygen::inputNameLinkedMap,visitedClasses); diff --git a/src/context.h b/src/context.h index 4baa164..c6bf1ac 100644 --- a/src/context.h +++ b/src/context.h @@ -20,7 +20,6 @@ #include "template.h" #include #include -#include "dirdef.h" #include "classdef.h" #include "searchindex.h" #include "membergroup.h" @@ -43,10 +42,12 @@ class FileNameLinkedMap; class ClassLinkedMap; class MemberNameInfoLinkedMap; +class DirDef; +class DirLinkedMap; +class DirList; + class FileDef; class FileList; -class DirSDict; -class DirDef; struct IncludeInfo; class MemberList; class MemberSDict; @@ -550,7 +551,7 @@ class NestingContext : public RefCountedContext, public TemplateListIntf void addNamespaces(const NamespaceLinkedRefMap &nsLinkedMap,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses); void addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses); void addClasses(const ClassLinkedRefMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses); - void addDirs(const DirSDict &,ClassDefSet &visitedClasses); + void addDirs(const DirLinkedMap &,ClassDefSet &visitedClasses); void addDirs(const DirList &,ClassDefSet &visitedClasses); void addFiles(const FileNameLinkedMap &,ClassDefSet &visitedClasses); void addFiles(const FileList &,ClassDefSet &visitedClasses); diff --git a/src/dirdef.cpp b/src/dirdef.cpp index 52cbe6f..c8198ab 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -799,13 +799,14 @@ FilePair *UsedDir::findFilePair(const char *name) DirDef *DirDefImpl::createNewDir(const char *path) { ASSERT(path!=0); - DirDef *dir = Doxygen::directories->find(path); + DirDef *dir = Doxygen::dirLinkedMap->find(path); if (dir==0) // new dir { + dir = Doxygen::dirLinkedMap->add(path, + std::unique_ptr( + createDirDef(path))); //printf("Adding new dir %s\n",path); - dir = createDirDef(path); //printf("createNewDir %s short=%s\n",path,dir->shortName().data()); - Doxygen::directories->append(path,dir); } return dir; } @@ -939,14 +940,11 @@ void DirRelation::writeDocumentation(OutputList &ol) static void computeCommonDirPrefix() { QCString path; - DirDef *dir; - DirSDict::Iterator sdi(*Doxygen::directories); - if (Doxygen::directories->count()>0) // we have at least one dir + auto it = Doxygen::dirLinkedMap->begin(); + if (!Doxygen::dirLinkedMap->empty()) // we have at least one dir { // start will full path of first dir - sdi.toFirst(); - dir=sdi.current(); - path=dir->name(); + path=(*it)->name(); int i=path.findRev('/',(int)path.length()-2); path=path.left(i+1); bool done=FALSE; @@ -959,8 +957,8 @@ static void computeCommonDirPrefix() while (!done) { uint l = path.length(); - uint count=0; - for (sdi.toFirst();(dir=sdi.current());++sdi) + size_t count=0; + for (const auto &dir : *Doxygen::dirLinkedMap) { QCString dirName = dir->name(); if (dirName.length()>path.length()) @@ -998,7 +996,7 @@ static void computeCommonDirPrefix() } count++; } - if (count==Doxygen::directories->count()) + if (count==Doxygen::dirLinkedMap->size()) // path matches for all directories -> found the common prefix { done=TRUE; @@ -1006,7 +1004,7 @@ static void computeCommonDirPrefix() } } } - for (sdi.toFirst();(dir=sdi.current());++sdi) + for (const auto &dir : *Doxygen::dirLinkedMap) { QCString diskName = dir->name().right(dir->name().length()-path.length()); dir->setDiskName(diskName); @@ -1025,7 +1023,7 @@ void buildDirectories() if (fd->getReference().isEmpty()) { DirDef *dir; - if ((dir=Doxygen::directories->find(fd->getPath()))==0) // new directory + if ((dir=Doxygen::dirLinkedMap->find(fd->getPath()))==0) // new directory { dir = DirDefImpl::mergeDirectoryInTree(fd->getPath()); } @@ -1038,45 +1036,48 @@ void buildDirectories() } } - //DirDef *root = new DirDef("root:"); // compute relations between directories => introduce container dirs. - DirDef *dir; - DirSDict::Iterator sdi(*Doxygen::directories); - for (sdi.toFirst();(dir=sdi.current());++sdi) + for (const auto &dir : *Doxygen::dirLinkedMap) { QCString name = dir->name(); int i=name.findRev('/',(int)name.length()-2); if (i>0) { - DirDef *parent = Doxygen::directories->find(name.left(i+1)); + DirDef *parent = Doxygen::dirLinkedMap->find(name.left(i+1)); //if (parent==0) parent=root; if (parent) { - parent->addSubDir(dir); + parent->addSubDir(dir.get()); //printf("DirDefImpl::addSubdir(): Adding subdir\n%s to\n%s\n", // dir->displayName().data(), parent->displayName().data()); } } } - for (sdi.toFirst();(dir=sdi.current());++sdi) + + // sort the directory contents + for (const auto &dir : *Doxygen::dirLinkedMap) { dir->sort(); } - Doxygen::directories->sort(); + + // short the directories themselves + std::sort(Doxygen::dirLinkedMap->begin(), + Doxygen::dirLinkedMap->end(), + [](const auto &d1,const auto &d2) + { return qstricmp(d1->shortName(),d2->shortName()) < 0; }); + computeCommonDirPrefix(); } void computeDirDependencies() { - DirDef *dir; - DirSDict::Iterator sdi(*Doxygen::directories); // compute nesting level for each directory - for (sdi.toFirst();(dir=sdi.current());++sdi) + for (const auto &dir : *Doxygen::dirLinkedMap) { dir->setLevel(); } // compute uses dependencies between directories - for (sdi.toFirst();(dir=sdi.current());++sdi) + for (const auto &dir : *Doxygen::dirLinkedMap) { //printf("computeDependencies for %s: #dirs=%d\n",dir->name().data(),Doxygen::directories.count()); dir->computeDependencies(); @@ -1086,9 +1087,7 @@ void computeDirDependencies() void generateDirDocs(OutputList &ol) { - DirDef *dir; - DirSDict::Iterator sdi(*Doxygen::directories); - for (sdi.toFirst();(dir=sdi.current());++sdi) + for (const auto &dir : *Doxygen::dirLinkedMap) { ol.pushGeneratorState(); if (!dir->hasDocumentation()) diff --git a/src/dirdef.h b/src/dirdef.h index bbb5fe6..66cc97d 100644 --- a/src/dirdef.h +++ b/src/dirdef.h @@ -25,6 +25,7 @@ #include #include + class FileList; class QStrList; class FileDef; @@ -34,9 +35,7 @@ class FTextStream; class FilePair; class FilePairDict; class DirDef; - -/** A list of directories. */ -typedef std::vector DirList; +class DirList; bool compareDirDefs(const DirDef *item1, const DirDef *item2); @@ -153,6 +152,7 @@ class DirRelation UsedDir *m_dst; }; +#if 0 /** A sorted dictionary of DirDef objects. */ class DirSDict : public SDict { @@ -163,6 +163,18 @@ class DirSDict : public SDict return qstricmp(item1->shortName(),item2->shortName()); } }; +#endif + +/** A linked map of directories */ +class DirLinkedMap : public LinkedMap +{ +}; + +/** A list of directories. */ +class DirList : public std::vector +{ +}; + // ------------------ diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp index f810d7b..05e9347 100644 --- a/src/docbookgen.cpp +++ b/src/docbookgen.cpp @@ -497,22 +497,11 @@ DB_GEN_C2("IndexSections " << is) case isDirDocumentation: { t << "" << endl; - SDict::Iterator dli(*Doxygen::directories); - DirDef *dd; - bool found=FALSE; - for (dli.toFirst();(dd=dli.current()) && !found;++dli) + for (const auto &dd : *Doxygen::dirLinkedMap) { if (dd->isLinkableInProject()) { t << "< xi:include href=\"" << dd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; - found=TRUE; - } - } - for (;(dd=dli.current());++dli) - { - if (dd->isLinkableInProject()) - { - t << " getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; } } } diff --git a/src/doxygen.cpp b/src/doxygen.cpp index c8813ef..bd2f69e 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -148,7 +148,7 @@ QDict *Doxygen::clangUsrMap = 0; bool Doxygen::outputToWizard=FALSE; QDict * Doxygen::htmlDirMap = 0; Cache *Doxygen::lookupCache; -DirSDict *Doxygen::directories; +DirLinkedMap *Doxygen::dirLinkedMap; SDict Doxygen::dirRelations(257); ParserManager *Doxygen::parserManager = 0; QCString Doxygen::htmlFileExtension; @@ -4956,9 +4956,7 @@ static void addListReferences() } } - DirSDict::Iterator ddi(*Doxygen::directories); - DirDef *dd = 0; - for (ddi.toFirst();(dd=ddi.current());++ddi) + for (const auto &dd : *Doxygen::dirLinkedMap) { QCString name = dd->getOutputFileBase(); //if (dd->getGroupDef()) @@ -8573,9 +8571,8 @@ static void findDirDocumentation(const Entry *root) { normalizedName+='/'; } - DirDef *dir,*matchingDir=0; - SDict::Iterator sdi(*Doxygen::directories); - for (sdi.toFirst();(dir=sdi.current());++sdi) + DirDef *matchingDir=0; + for (const auto &dir : *Doxygen::dirLinkedMap) { //printf("Dir: %s<->%s\n",dir->name().data(),normalizedName.data()); if (dir->name().right(normalizedName.length())==normalizedName) @@ -8591,7 +8588,7 @@ static void findDirDocumentation(const Entry *root) } else { - matchingDir=dir; + matchingDir=dir.get(); } } } @@ -10153,8 +10150,7 @@ void initDoxygen() Doxygen::namespaceLinkedMap = new NamespaceLinkedMap; Doxygen::classLinkedMap = new ClassLinkedMap; Doxygen::hiddenClassLinkedMap = new ClassLinkedMap; - Doxygen::directories = new DirSDict(17); - Doxygen::directories->setAutoDelete(TRUE); + Doxygen::dirLinkedMap = new DirLinkedMap; Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples Doxygen::tagDestinationDict.setAutoDelete(TRUE); @@ -10211,7 +10207,7 @@ void cleanUpDoxygen() delete Doxygen::functionNameLinkedMap; delete Doxygen::groupLinkedMap; delete Doxygen::namespaceLinkedMap; - delete Doxygen::directories; + delete Doxygen::dirLinkedMap; DotManager::deleteInstance(); } diff --git a/src/doxygen.h b/src/doxygen.h index 8fbd51a..a75618c 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -128,7 +128,7 @@ class Doxygen static bool outputToWizard; static QDict *htmlDirMap; static Cache *lookupCache; - static DirSDict *directories; + static DirLinkedMap *dirLinkedMap; static SDict dirRelations; static ParserManager *parserManager; static bool suppressDocWarnings; diff --git a/src/index.cpp b/src/index.cpp index f8ee056..c54f7a2 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -534,7 +534,7 @@ static void writeClassTreeToOutput(OutputList &ol,const BaseClassList &bcl,int l //---------------------------------------------------------------------------- -static bool dirHasVisibleChildren(DirDef *dd) +static bool dirHasVisibleChildren(const DirDef *dd) { if (dd->hasDocumentation()) return TRUE; @@ -553,7 +553,7 @@ static bool dirHasVisibleChildren(DirDef *dd) } } - for(const auto subdd : dd->subDirs()) + for(const auto &subdd : dd->subDirs()) { if (dirHasVisibleChildren(subdd)) { @@ -564,7 +564,7 @@ static bool dirHasVisibleChildren(DirDef *dd) } //---------------------------------------------------------------------------- -static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv,bool addToIndex) +static void writeDirTreeNode(OutputList &ol, const DirDef *dd, int level, FTVHelp* ftv,bool addToIndex) { if (level>20) { @@ -613,7 +613,7 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv if (dd->subDirs().size()>0) { startIndexHierarchy(ol,level+1); - for(const auto subdd : dd->subDirs()) + for(const auto &subdd : dd->subDirs()) { writeDirTreeNode(ol,subdd,level+1,ftv,addToIndex); } @@ -726,13 +726,11 @@ static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex) startIndexHierarchy(ol,0); if (fullPathNames) { - SDict::Iterator dli(*Doxygen::directories); - DirDef *dd; - for (dli.toFirst();(dd=dli.current());++dli) + for (const auto &dd : *Doxygen::dirLinkedMap) { if (dd->getOuterScope()==Doxygen::globalScope) { - writeDirTreeNode(ol,dd,0,ftv,addToIndex); + writeDirTreeNode(ol,dd.get(),0,ftv,addToIndex); } } } @@ -3670,9 +3668,7 @@ static int countGroups() static int countDirs() { int count=0; - SDict::Iterator dli(*Doxygen::directories); - DirDef *dd; - for (dli.toFirst();(dd=dli.current());++dli) + for (const auto &dd : *Doxygen::dirLinkedMap) { if (dd->isLinkableInProject()) { diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 485b513..ece344f 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -1011,9 +1011,7 @@ void LatexGenerator::startIndexSection(IndexSections is) break; case isDirDocumentation: { - SDict::Iterator dli(*Doxygen::directories); - DirDef *dd; - for (dli.toFirst();(dd=dli.current());++dli) + for (const auto &dd : *Doxygen::dirLinkedMap) { if (dd->isLinkableInProject()) { @@ -1159,24 +1157,17 @@ void LatexGenerator::endIndexSection(IndexSections is) break; case isDirDocumentation: { - SDict::Iterator dli(*Doxygen::directories); - DirDef *dd; bool found=FALSE; - for (dli.toFirst();(dd=dli.current()) && !found;++dli) + for (const auto &dd : *Doxygen::dirLinkedMap) { if (dd->isLinkableInProject()) { - t << "}\n\\input{" << dd->getOutputFileBase() << "}\n"; - found=TRUE; - } - } - for (;(dd=dli.current());++dli) - { - if (dd->isLinkableInProject()) - { - //if (compactLatex) t << "\\input"; else t << "\\include"; - t << "\\input"; - t << "{" << dd->getOutputFileBase() << "}\n"; + if (!found) + { + t << "}\n"; + found = TRUE; + } + t << "\\input{" << dd->getOutputFileBase() << "}\n"; } } } diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index a7cb1e3..94b6893 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -484,9 +484,7 @@ void RTFGenerator::startIndexSection(IndexSections is) case isDirDocumentation: { //Directory Documentation - SDict::Iterator dli(*Doxygen::directories); - DirDef *dd; - for (dli.toFirst();(dd=dli.current());++dli) + for (const auto &dd : *Doxygen::dirLinkedMap) { if (dd->isLinkableInProject()) { @@ -739,12 +737,18 @@ void RTFGenerator::endIndexSection(IndexSections is) break; case isModuleDocumentation: { + bool first=true; t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl; for (const auto &gd : *Doxygen::groupLinkedMap) { if (!gd->isReference()) { t << "\\par " << rtf_Style_Reset << endl; + if (!first) + { + beginRTFSection(); + } + first=false; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << gd->getOutputFileBase(); t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; @@ -754,14 +758,18 @@ void RTFGenerator::endIndexSection(IndexSections is) break; case isDirDocumentation: { - SDict::Iterator dli(*Doxygen::directories); - DirDef *dd; + bool first=true; t << "{\\tc \\v " << theTranslator->trDirDocumentation() << "}"<< endl; - for (dli.toFirst();(dd=dli.current());++dli) + for (const auto &dd : *Doxygen::dirLinkedMap) { if (dd->isLinkableInProject()) { t << "\\par " << rtf_Style_Reset << endl; + if (!first) + { + beginRTFSection(); + } + first=false; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; t << dd->getOutputFileBase(); t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp index 7c7e77b..38654bc 100644 --- a/src/sqlite3gen.cpp +++ b/src/sqlite3gen.cpp @@ -2548,14 +2548,10 @@ void generateSqlite3() } // + dirs + for (const auto &dd : *Doxygen::dirLinkedMap) { - const DirDef *dir; - DirSDict::Iterator sdi(*Doxygen::directories); - for (sdi.toFirst();(dir=sdi.current());++sdi) - { - msg("Generating Sqlite3 output for dir %s\n",dir->name().data()); - generateSqlite3ForDir(dir); - } + msg("Generating Sqlite3 output for dir %s\n",dd->name().data()); + generateSqlite3ForDir(dd.get()); } // + examples diff --git a/src/util.cpp b/src/util.cpp index b7fedc3..b520505 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -3254,7 +3254,7 @@ bool resolveLink(/* in */ const char *scName, *resContext=nd; return TRUE; } - else if ((dir=Doxygen::directories->find(QFileInfo(linkRef).absFilePath().utf8()+"/")) + else if ((dir=Doxygen::dirLinkedMap->find(QFileInfo(linkRef).absFilePath().utf8()+"/")) && dir->isLinkable()) // TODO: make this location independent like filedefs { *resContext=dir; diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index c6d5bc3..350be48 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -1955,14 +1955,10 @@ void generateXML() msg("Generating XML output for page %s\n",pd->name().data()); generateXMLForPage(pd.get(),t,FALSE); } + for (const auto &dd : *Doxygen::dirLinkedMap) { - DirDef *dir; - DirSDict::Iterator sdi(*Doxygen::directories); - for (sdi.toFirst();(dir=sdi.current());++sdi) - { - msg("Generate XML output for dir %s\n",dir->name().data()); - generateXMLForDir(dir,t); - } + msg("Generate XML output for dir %s\n",dd->name().data()); + generateXMLForDir(dd.get(),t); } for (const auto &pd : *Doxygen::exampleLinkedMap) { -- cgit v0.12