From 65d36226cfb37b8fc9113e69d54ed4cbd9cedd2b Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Wed, 13 Jan 2021 21:46:07 +0100 Subject: Refactoring: replace StringDict by StringMap --- src/classdef.h | 1 - src/containers.h | 1 + src/definition.cpp | 6 ++--- src/doxygen.cpp | 69 ++++++++++++++++++++++++------------------------------ src/doxygen.h | 11 ++------- src/util.cpp | 29 ++++++++++++----------- src/util.h | 2 +- 7 files changed, 53 insertions(+), 66 deletions(-) diff --git a/src/classdef.h b/src/classdef.h index 8e5d628..95b1b31 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -41,7 +41,6 @@ class ExampleList; class MemberNameInfoLinkedMap; class PackageDef; class GroupDef; -class StringDict; struct IncludeInfo; class ClassDefImpl; class FTextStream; diff --git a/src/containers.h b/src/containers.h index 770f92d..f8027fd 100644 --- a/src/containers.h +++ b/src/containers.h @@ -26,6 +26,7 @@ using StringUnorderedMap = std::unordered_map; using StringUnorderedSet = std::unordered_set; +using StringMap = std::map; using StringSet = std::set; using StringVector = std::vector; using BoolStack = std::stack; diff --git a/src/definition.cpp b/src/definition.cpp index 2a03ef9..88b5960 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -2097,10 +2097,10 @@ QCString DefinitionImpl::externalReference(const QCString &relPath) const QCString ref = getReference(); if (!ref.isEmpty()) { - QCString *dest = Doxygen::tagDestinationDict[ref]; - if (dest) + auto it = Doxygen::tagDestinationMap.find(ref.str()); + if (it!=Doxygen::tagDestinationMap.end()) { - QCString result = *dest; + QCString result = it->second; uint l = result.length(); if (!relPath.isEmpty() && l>0 && result.at(0)=='.') { // relative path -> prepend relPath. diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 74887ec..39135b5 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -126,7 +126,7 @@ FileNameLinkedMap *Doxygen::inputNameLinkedMap = 0; GroupLinkedMap *Doxygen::groupLinkedMap = 0; PageLinkedMap *Doxygen::pageLinkedMap = 0; PageLinkedMap *Doxygen::exampleLinkedMap = 0; -StringDict Doxygen::aliasDict(257); // aliases +StringMap Doxygen::aliasMap; // aliases StringSet Doxygen::inputPaths; FileNameLinkedMap *Doxygen::includeNameLinkedMap = 0; // include names FileNameLinkedMap *Doxygen::exampleNameLinkedMap = 0; // examples @@ -135,7 +135,7 @@ 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 +StringMap Doxygen::tagDestinationMap; // all tag locations StringUnorderedSet Doxygen::expandAsDefinedSet; // all macros that should be expanded MemberGroupInfoMap Doxygen::memberGroupInfoMap; // dictionary of the member groups heading std::unique_ptr Doxygen::mainPage; @@ -189,7 +189,7 @@ void clearAll() Doxygen::dotFileNameLinkedMap->clear(); Doxygen::mscFileNameLinkedMap->clear(); Doxygen::diaFileNameLinkedMap->clear(); - Doxygen::tagDestinationDict.clear(); + Doxygen::tagDestinationMap.clear(); SectionManager::instance().clear(); CitationManager::instance().clear(); Doxygen::mainPage.reset(); @@ -263,10 +263,10 @@ void statistics() #endif //fprintf(stderr,"--- g_excludeNameDict stats ----\n"); //g_excludeNameDict.statistics(); - fprintf(stderr,"--- aliasDict stats ----\n"); - Doxygen::aliasDict.statistics(); - fprintf(stderr,"--- tagDestinationDict stats ----\n"); - Doxygen::tagDestinationDict.statistics(); + //fprintf(stderr,"--- aliasDict stats ----\n"); + //Doxygen::aliasDict.statistics(); + //fprintf(stderr,"--- tagDestinationDict stats ----\n"); + //Doxygen::tagDestinationDict.statistics(); fprintf(stderr,"--- g_compoundKeywordDict stats ----\n"); g_compoundKeywordDict.statistics(); } @@ -9100,7 +9100,8 @@ static void readTagFile(const std::shared_ptr &root,const char *tl) destName = tagLine.right(tagLine.length()-eqPos-1).stripWhiteSpace(); if (fileName.isEmpty() || destName.isEmpty()) return; QFileInfo fi(fileName); - Doxygen::tagDestinationDict.insert(fi.absFilePath().utf8(),new QCString(destName)); + Doxygen::tagDestinationMap.insert( + std::make_pair(fi.absFilePath().utf8().str(), destName.str())); //printf("insert tagDestination %s->%s\n",fi.fileName().data(),destName.data()); } else @@ -9874,11 +9875,9 @@ int readFileOrDirectory(const char *s, static void expandAliases() { - QDictIterator adi(Doxygen::aliasDict); - QCString *s; - for (adi.toFirst();(s=adi.current());++adi) + for (auto &kv : Doxygen::aliasMap) { - *s = expandAlias(adi.currentKey(),*s); + kv.second = expandAlias(kv.first,kv.second); } } @@ -9886,11 +9885,10 @@ static void expandAliases() static void escapeAliases() { - QDictIterator adi(Doxygen::aliasDict); - QCString *s; - for (adi.toFirst();(s=adi.current());++adi) + for (auto &kv : Doxygen::aliasMap) { - QCString value=*s,newValue; + QCString value=kv.second; + QCString newValue; int in,p=0; // for each \n in the alias command value while ((in=value.find("\\n",p))!=-1) @@ -9913,7 +9911,6 @@ static void escapeAliases() p=in+2; } newValue+=value.mid(p,value.length()-p); - *s=newValue; p = 0; newValue = ""; while ((in=value.find("^^",p))!=-1) @@ -9923,7 +9920,7 @@ static void escapeAliases() p=in+2; } newValue+=value.mid(p,value.length()-p); - *s=newValue; + kv.second=newValue.str(); //printf("Alias %s has value %s\n",adi.currentKey().data(),s->data()); } } @@ -9933,30 +9930,26 @@ static void escapeAliases() void readAliases() { // add aliases to a dictionary - Doxygen::aliasDict.setAutoDelete(TRUE); const StringVector &aliasList = Config_getList(ALIASES); - for (const auto &s : aliasList) + for (const auto &al : aliasList) { - QCString alias=s.c_str(); - if (Doxygen::aliasDict[alias]==0) + QCString alias = al; + int i=alias.find('='); + if (i>0) { - int i=alias.find('='); - if (i>0) + QCString name=alias.left(i).stripWhiteSpace(); + QCString value=alias.right(alias.length()-i-1); + //printf("Alias: found name='%s' value='%s'\n",name.data(),value.data()); + if (!name.isEmpty()) { - QCString name=alias.left(i).stripWhiteSpace(); - QCString value=alias.right(alias.length()-i-1); - //printf("Alias: found name='%s' value='%s'\n",name.data(),value.data()); - if (!name.isEmpty()) + auto it = Doxygen::aliasMap.find(name.str()); + if (it==Doxygen::aliasMap.end()) // insert new alias { - QCString *dn=Doxygen::aliasDict[name]; - if (dn==0) // insert new alias - { - Doxygen::aliasDict.insert(name,new QCString(value)); - } - else // overwrite previous alias - { - *dn=value; - } + Doxygen::aliasMap.insert(std::make_pair(name.str(),value.str())); + } + else // overwrite previous alias + { + it->second=value.str(); } } } @@ -10134,7 +10127,7 @@ void initDoxygen() Doxygen::dirLinkedMap = new DirLinkedMap; Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples - Doxygen::tagDestinationDict.setAutoDelete(TRUE); + //Doxygen::tagDestinationDict.setAutoDelete(TRUE); Doxygen::indexList = new IndexList; // initialisation of these globals depends on diff --git a/src/doxygen.h b/src/doxygen.h index fdfa7da..02eb790 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -64,13 +64,6 @@ class NamespaceDefMutable; typedef QList StringList; typedef QListIterator StringListIterator; -class StringDict : public QDict -{ - public: - StringDict(uint size=17) : QDict(size) {} - virtual ~StringDict() {} -}; - struct LookupInfo { LookupInfo() = default; @@ -110,8 +103,8 @@ class Doxygen static StringUnorderedMap namespaceAliasMap; static GroupLinkedMap *groupLinkedMap; static NamespaceLinkedMap *namespaceLinkedMap; - static StringDict tagDestinationDict; - static StringDict aliasDict; + static StringMap tagDestinationMap; + static StringMap aliasMap; static MemberGroupInfoMap memberGroupInfoMap; static StringUnorderedSet expandAsDefinedSet; static NamespaceDefMutable *globalScope; diff --git a/src/util.cpp b/src/util.cpp index 50f3aec..87698d7 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -5976,25 +5976,26 @@ static QCString expandAliasRec(StringUnorderedSet &aliasesProcessed,const QCStri numArgs = countAliasArguments(args); cmd += QCString().sprintf("{%d}",numArgs); // alias name + {n} } - QCString *aliasText=Doxygen::aliasDict.find(cmd); - if (numArgs>1 && aliasText==0) + auto it = Doxygen::aliasMap.find(cmd.str()); + + if (numArgs>1 && it==Doxygen::aliasMap.end()) { // in case there is no command with numArgs parameters, but there is a command with 1 parameter, // we also accept all text as the argument of that command (so you don't have to escape commas) - aliasText=Doxygen::aliasDict.find(cmdNoArgs+"{1}"); - if (aliasText) + it = Doxygen::aliasMap.find((cmdNoArgs+"{1}").str()); + if (it!=Doxygen::aliasMap.end()) { cmd = cmdNoArgs+"{1}"; args = escapeCommas(args); // escape , so that everything is seen as one argument } } //printf("Found command s='%s' cmd='%s' numArgs=%d args='%s' aliasText=%s\n", - // s.data(),cmd.data(),numArgs,args.data(),aliasText?aliasText->data():""); + // s.data(),cmd.data(),numArgs,args.data(),it!=Doxygen::aliasMap.end()?it->second.c_str():""); if ((allowRecursion || aliasesProcessed.find(cmd.str())==aliasesProcessed.end()) && - aliasText) // expand the alias + it!=Doxygen::aliasMap.end()) // expand the alias { //printf("is an alias!\n"); if (!allowRecursion) aliasesProcessed.insert(cmd.str()); - QCString val = *aliasText; + QCString val = it->second; if (hasArgs) { val = replaceAliasArguments(aliasesProcessed,val,args); @@ -6079,17 +6080,17 @@ QCString resolveAliasCmd(const QCString aliasCmd) return result; } -QCString expandAlias(const QCString &aliasName,const QCString &aliasValue) +std::string expandAlias(const std::string &aliasName,const std::string &aliasValue) { QCString result; StringUnorderedSet aliasesProcessed; // avoid expanding this command recursively - aliasesProcessed.insert(aliasName.str()); + aliasesProcessed.insert(aliasName); // expand embedded commands //printf("Expanding: '%s'->'%s'\n",aliasName.data(),aliasValue.data()); - result = expandAliasRec(aliasesProcessed,aliasValue); + result = expandAliasRec(aliasesProcessed,aliasValue.c_str()); //printf("Expanding result: '%s'->'%s'\n",aliasName.data(),result.data()); - return result; + return result.str(); } void writeTypeConstraints(OutputList &ol,const Definition *d,const ArgumentList &al) @@ -6378,10 +6379,10 @@ QCString externalRef(const QCString &relPath,const QCString &ref,bool href) QCString result; if (!ref.isEmpty()) { - QCString *dest = Doxygen::tagDestinationDict[ref]; - if (dest) + auto it = Doxygen::tagDestinationMap.find(ref.str()); + if (it!=Doxygen::tagDestinationMap.end()) { - result = *dest; + result = it->second; int l = result.length(); if (!relPath.isEmpty() && l>0 && result.at(0)=='.') { // relative path -> prepend relPath. diff --git a/src/util.h b/src/util.h index 298d89f..685bfa0 100644 --- a/src/util.h +++ b/src/util.h @@ -377,7 +377,7 @@ QCString extractAliasArgs(const QCString &args,int pos); int countAliasArguments(const QCString argList); QCString resolveAliasCmd(const QCString aliasCmd); -QCString expandAlias(const QCString &aliasName,const QCString &aliasValue); +std::string expandAlias(const std::string &aliasName,const std::string &aliasValue); void writeTypeConstraints(OutputList &ol,const Definition *d,const ArgumentList &al); -- cgit v0.12