From 0252f61004cada8f9e10644b850dd6ba47d61438 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Mon, 4 Jan 2021 12:04:45 +0100 Subject: Refactoring: replace MemberSDict by MemberLinkedRefMap --- src/classdef.h | 1 - src/code.l | 12 ++++++------ src/context.cpp | 18 ------------------ src/context.h | 4 ---- src/definition.h | 1 - src/filedef.cpp | 49 +++++++++++++++++++------------------------------ src/filedef.h | 6 +++--- src/fortrancode.l | 6 +++--- src/memberlist.cpp | 10 ---------- src/memberlist.h | 18 ++---------------- src/namespacedef.cpp | 24 ++++++------------------ src/namespacedef.h | 2 +- src/pycode.l | 14 +++++++------- src/vhdlcode.l | 2 +- src/xmlcode.l | 2 +- 15 files changed, 49 insertions(+), 120 deletions(-) diff --git a/src/classdef.h b/src/classdef.h index b0ce4b1..2a96d22 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -34,7 +34,6 @@ struct Argument; class MemberDef; class MemberDefMutable; class MemberList; -class MemberDict; class ClassLinkedRefMap; class OutputList; class FileDef; diff --git a/src/code.l b/src/code.l index 94a7bcd..a2dd6e2 100644 --- a/src/code.l +++ b/src/code.l @@ -121,7 +121,7 @@ struct codeYY_state FileDef * sourceFileDef = 0; bool lineNumbers = FALSE; const Definition * currentDefinition = 0; - MemberDef * currentMemberDef = 0; + const MemberDef * currentMemberDef = 0; bool includeCodeFragment = FALSE; const char * currentFontClass = 0; bool searchingForBody = FALSE; @@ -224,7 +224,7 @@ static bool getLink(yyscan_t yyscanner,const char *className, bool varOnly=FALSE); static void generateClassOrGlobalLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *clName, bool typeOnly=FALSE,bool varOnly=FALSE); -static bool generateClassMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,MemberDef *xmd,const char *memName); +static bool generateClassMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,const MemberDef *xmd,const char *memName); static bool generateClassMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,const Definition *def,const char *memName); static void generateMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,const QCString &varName, const char *memName); @@ -2344,7 +2344,7 @@ static void startCodeLine(yyscan_t yyscanner) //lineNumber.sprintf("%05d",yyextra->yyLineNr); //lineAnchor.sprintf("l%05d",yyextra->yyLineNr); - Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); + const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); //printf("%s:startCodeLine(%d)=%p\n",yyextra->sourceFileDef->name().data(),yyextra->yyLineNr,d); if (!yyextra->includeCodeFragment && d) { @@ -2613,7 +2613,7 @@ static const MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString & const NamespaceDef *mnd = getResolvedNamespace(scope); if (mnd && !locName.isEmpty()) { - MemberDef *md=mnd->getMemberByName(locName); + const MemberDef *md=mnd->getMemberByName(locName); if (md) { //printf("name=%s scope=%s\n",locName.data(),scope.data()); @@ -2981,7 +2981,7 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner, static bool generateClassMemberLink(yyscan_t yyscanner, CodeOutputInterface &ol, - MemberDef *xmd, + const MemberDef *xmd, const char *memName) { struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; @@ -3050,7 +3050,7 @@ static bool generateClassMemberLink(yyscan_t yyscanner, if (def && def->definitionType()==Definition::TypeClass) { const ClassDef *cd = toClassDef(def); - MemberDef *xmd = cd->getMemberByName(memName); + const MemberDef *xmd = cd->getMemberByName(memName); //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",def->name().data(),memName,xmd); if (xmd) { diff --git a/src/context.cpp b/src/context.cpp index 9b4100c..95fb82d 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -8532,24 +8532,6 @@ MemberListContext::MemberListContext(const MemberList *list) : RefCountedContext } } -MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCountedContext("MemberListContext") -{ - p = new Private; - if (list) - { - if (doSort) - { - list->sort(); - } - MemberSDict::Iterator it(*list); - MemberDef *md; - for (it.toFirst();(md=it.current());++it) - { - p->addMember(md); - } - } -} - MemberListContext::MemberListContext(std::vector &&ml) : RefCountedContext("MemberListContext") { p = new Private; diff --git a/src/context.h b/src/context.h index c6bf1ac..a975d3d 100644 --- a/src/context.h +++ b/src/context.h @@ -50,7 +50,6 @@ class FileDef; class FileList; struct IncludeInfo; class MemberList; -class MemberSDict; class MemberDef; struct Argument; class ArgumentList; @@ -962,8 +961,6 @@ class MemberListContext : public RefCountedContext, public TemplateListIntf { return new MemberListContext; } static MemberListContext *alloc(const MemberList *ml) { return new MemberListContext(ml); } - static MemberListContext *alloc(MemberSDict *ml,bool doSort) - { return new MemberListContext(ml,doSort); } static MemberListContext *alloc(std::vector &&ml) { return new MemberListContext(std::move(ml)); } @@ -977,7 +974,6 @@ class MemberListContext : public RefCountedContext, public TemplateListIntf private: MemberListContext(); MemberListContext(const MemberList *ml); - MemberListContext(MemberSDict *ml,bool doSort); MemberListContext(std::vector &&ml); ~MemberListContext(); class Private; diff --git a/src/definition.h b/src/definition.h index eb4c42a..444b188 100644 --- a/src/definition.h +++ b/src/definition.h @@ -34,7 +34,6 @@ class FileDef; class OutputList; class SectionRefs; -class MemberSDict; class MemberDef; class GroupDef; class GroupList; diff --git a/src/filedef.cpp b/src/filedef.cpp index 3fd542f..6c31940 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -48,6 +48,9 @@ //--------------------------------------------------------------------------- +using DefinitionLineMap = std::unordered_map; +using MemberDefLineMap = std::unordered_map; + class FileDefImpl : public DefinitionMixin { public: @@ -69,8 +72,8 @@ class FileDefImpl : public DefinitionMixin virtual const QCString &docName() const { return m_docname; } virtual bool isSource() const { return m_isSource; } virtual bool isDocumentationFile() const; - virtual Definition *getSourceDefinition(int lineNr) const; - virtual MemberDef *getSourceMember(int lineNr) const; + virtual const Definition *getSourceDefinition(int lineNr) const; + virtual const MemberDef *getSourceMember(int lineNr) const; virtual QCString getPath() const { return m_path; } virtual QCString getVersion() const { return m_fileVersion; } virtual bool isLinkableInProject() const; @@ -95,7 +98,7 @@ class FileDefImpl : public DefinitionMixin virtual void countMembers(); virtual int numDocMembers() const; virtual int numDecMembers() const; - virtual void addSourceRef(int line,Definition *d,MemberDef *md); + virtual void addSourceRef(int line,const Definition *d,const MemberDef *md); virtual void writeDocumentation(OutputList &ol); virtual void writeMemberPages(OutputList &ol); virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const; @@ -162,8 +165,8 @@ class FileDefImpl : public DefinitionMixin QCString m_outputDiskName; QCString m_fileName; QCString m_docname; - QIntDict *m_srcDefDict; - QIntDict *m_srcMemberDict; + DefinitionLineMap m_srcDefMap; + MemberDefLineMap m_srcMemberMap; bool m_isSource; QCString m_fileVersion; PackageDef *m_package; @@ -230,8 +233,6 @@ FileDefImpl::FileDefImpl(const char *p,const char *nm, m_includeDict = 0; m_includedByList = 0; m_includedByDict = 0; - m_srcDefDict = 0; - m_srcMemberDict = 0; m_package = 0; m_isSource = guessSection(nm)==Entry::SOURCE_SEC; m_docname = nm; @@ -252,8 +253,6 @@ FileDefImpl::~FileDefImpl() delete m_includeList; delete m_includedByDict; delete m_includedByList; - delete m_srcDefDict; - delete m_srcMemberDict; } void FileDefImpl::setDiskName(const QCString &name) @@ -1368,40 +1367,30 @@ QCString FileDefImpl::name() const return DefinitionMixin::name(); } -void FileDefImpl::addSourceRef(int line,Definition *d,MemberDef *md) +void FileDefImpl::addSourceRef(int line,const Definition *d,const MemberDef *md) { //printf("FileDefImpl::addSourceDef(%d,%p,%p)\n",line,d,md); if (d) { - if (m_srcDefDict==0) m_srcDefDict = new QIntDict(257); - if (m_srcMemberDict==0) m_srcMemberDict = new QIntDict(257); - m_srcDefDict->insert(line,d); - if (md) m_srcMemberDict->insert(line,md); + m_srcDefMap.insert(std::make_pair(line,d)); + if (md) m_srcMemberMap.insert(std::make_pair(line,md)); //printf("Adding member %s with anchor %s at line %d to file %s\n", // md?md->name().data():"",md?md->anchor().data():"",line,name().data()); } } -Definition *FileDefImpl::getSourceDefinition(int lineNr) const +const Definition *FileDefImpl::getSourceDefinition(int lineNr) const { - Definition *result=0; - if (m_srcDefDict) - { - result = m_srcDefDict->find(lineNr); - } - //printf("%s::getSourceDefinition(%d)=%s\n",name().data(),lineNr,result?result->name().data():"none"); - return result; + auto it = m_srcDefMap.find(lineNr); + //printf("%s::getSourceDefinition(%d)=%s\n",name().data(),lineNr,it!=m_srcDefMap.end()?it->second->name().data():"none"); + return it!=m_srcDefMap.end() ? it->second : 0; } -MemberDef *FileDefImpl::getSourceMember(int lineNr) const +const MemberDef *FileDefImpl::getSourceMember(int lineNr) const { - MemberDef *result=0; - if (m_srcMemberDict) - { - result = m_srcMemberDict->find(lineNr); - } - //printf("%s::getSourceMember(%d)=%s\n",name().data(),lineNr,result?result->name().data():"none"); - return result; + auto it = m_srcMemberMap.find(lineNr); + //printf("%s::getSourceMember(%d)=%s\n",name().data(),lineNr,it!=m_srcMemberMap.end()?it->second->name().data():"none"); + return it!=m_srcMemberMap.end() ? it->second : 0; } diff --git a/src/filedef.h b/src/filedef.h index e08002b..f27ff6d 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -104,8 +104,8 @@ class FileDef : public DefinitionMutable, public Definition virtual bool isDocumentationFile() const = 0; - virtual Definition *getSourceDefinition(int lineNr) const = 0; - virtual MemberDef *getSourceMember(int lineNr) const = 0; + virtual const Definition *getSourceDefinition(int lineNr) const = 0; + virtual const MemberDef *getSourceMember(int lineNr) const = 0; /*! Returns the absolute path of this file. */ virtual QCString getPath() const = 0; @@ -146,7 +146,7 @@ class FileDef : public DefinitionMutable, public Definition //--------------------------------- - virtual void addSourceRef(int line,Definition *d,MemberDef *md) = 0; + virtual void addSourceRef(int line,const Definition *d,const MemberDef *md) = 0; virtual void writeDocumentation(OutputList &ol) = 0; virtual void writeMemberPages(OutputList &ol) = 0; diff --git a/src/fortrancode.l b/src/fortrancode.l index 0ddddd1..df6acf4 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -159,8 +159,8 @@ struct fortrancodeYY_state QCString exampleFile; FileDef * sourceFileDef = 0; - Definition * currentDefinition = 0; - MemberDef * currentMemberDef = 0; + const Definition * currentDefinition = 0; + const MemberDef * currentMemberDef = 0; bool includeCodeFragment = false; char stringStartSymbol = '\0'; // single or double quote @@ -923,7 +923,7 @@ static void startCodeLine(yyscan_t yyscanner) //lineNumber.sprintf("%05d",yyextra->yyLineNr); //lineAnchor.sprintf("l%05d",yyextra->yyLineNr); - Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); + const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); //printf("startCodeLine %d d=%s\n", yyextra->yyLineNr,d ? d->name().data() : ""); if (!yyextra->includeCodeFragment && d) { diff --git a/src/memberlist.cpp b/src/memberlist.cpp index 4daedb5..c71390c 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -1099,13 +1099,3 @@ void MemberList::setAnchors() } } - - -//-------------------------------------------------------------------------- - -int MemberSDict::compareValues(const MemberDef *c1, const MemberDef *c2) const -{ - return genericCompareMembers(c1,c2); -} - - diff --git a/src/memberlist.h b/src/memberlist.h index 2c2d5ee..200767d 100644 --- a/src/memberlist.h +++ b/src/memberlist.h @@ -20,7 +20,7 @@ #include #include "memberdef.h" -#include "sortdict.h" +#include "linkedmap.h" #include "types.h" #include "membergroup.h" @@ -127,22 +127,8 @@ class MemberListIterator : public QListIterator virtual ~MemberListIterator() {} }; -/** An unsorted dictionary of MemberDef objects. */ -class MemberDict : public QDict +class MemberLinkedRefMap : public LinkedRefMap { - public: - MemberDict(uint size) : QDict(size) {} - virtual ~MemberDict() {} -}; - -/** A sorted dictionary of MemberDef objects. */ -class MemberSDict : public SDict -{ - public: - MemberSDict(uint size=17) : SDict(size) {} - virtual ~MemberSDict() {} - private: - int compareValues(const MemberDef *item1,const MemberDef *item2) const; }; int genericCompareMembers(const MemberDef *c1,const MemberDef *c2); diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 0651fdf..1108653 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -96,7 +96,7 @@ class NamespaceDefImpl : public DefinitionMixin virtual bool subGrouping() const { return m_subGrouping; } virtual MemberList *getMemberList(MemberListType lt) const; virtual const QList &getMemberLists() const { return m_memberLists; } - virtual MemberDef *getMemberByName(const QCString &) const; + virtual const MemberDef *getMemberByName(const QCString &) const; virtual const MemberGroupList &getMemberGroups() const { return m_memberGroups; } virtual ClassLinkedRefMap getClasses() const { return classes; } virtual ClassLinkedRefMap getInterfaces() const { return interfaces; } @@ -138,7 +138,7 @@ class NamespaceDefImpl : public DefinitionMixin LinkedRefMap m_usingDeclList; SDict *m_innerCompounds = 0; - MemberSDict *m_allMembersDict = 0; + MemberLinkedRefMap m_allMembers; QList m_memberLists; MemberGroupList m_memberGroups; ClassLinkedRefMap classes; @@ -210,7 +210,7 @@ class NamespaceDefAliasImpl : public DefinitionAliasMixin { return getNSAlias()->getMemberList(lt); } virtual const QList &getMemberLists() const { return getNSAlias()->getMemberLists(); } - virtual MemberDef *getMemberByName(const QCString &name) const + virtual const MemberDef *getMemberByName(const QCString &name) const { return getNSAlias()->getMemberByName(name); } virtual const MemberGroupList &getMemberGroups() const { return getNSAlias()->getMemberGroups(); } @@ -264,7 +264,6 @@ NamespaceDefImpl::NamespaceDefImpl(const char *df,int dl,int dc, setFileName(name); } m_innerCompounds = new SDict(17); - m_allMembersDict = 0; setReference(lref); m_inline=FALSE; m_subGrouping=Config_getBool(SUBGROUPING); @@ -289,7 +288,6 @@ NamespaceDefImpl::NamespaceDefImpl(const char *df,int dl,int dc, NamespaceDefImpl::~NamespaceDefImpl() { delete m_innerCompounds; - delete m_allMembersDict; } void NamespaceDefImpl::setFileName(const QCString &fn) @@ -455,12 +453,8 @@ void NamespaceDefImpl::insertMember(MemberDef *md) m_memberLists.append(allMemberList); } allMemberList->append(md); - if (m_allMembersDict==0) - { - m_allMembersDict = new MemberSDict; - } //printf("%s::m_allMembersDict->append(%s)\n",name().data(),md->localName().data()); - m_allMembersDict->append(md->localName(),md); + m_allMembers.add(md->localName(),md); //::addNamespaceMemberNameToIndex(md); //static bool sortBriefDocs=Config_getBool(SORT_BRIEF_DOCS); switch(md->memberType()) @@ -1465,15 +1459,9 @@ bool NamespaceDefImpl::isLinkable() const return isLinkableInProject() || isReference(); } -MemberDef * NamespaceDefImpl::getMemberByName(const QCString &n) const +const MemberDef * NamespaceDefImpl::getMemberByName(const QCString &n) const { - MemberDef *md = 0; - if (m_allMembersDict && !n.isEmpty()) - { - md = m_allMembersDict->find(n); - //printf("%s::m_allMembersDict->find(%s)=%p\n",name().data(),n.data(),md); - } - return md; + return m_allMembers.find(n); } QCString NamespaceDefImpl::title() const diff --git a/src/namespacedef.h b/src/namespacedef.h index fb6a0d5..6838157 100644 --- a/src/namespacedef.h +++ b/src/namespacedef.h @@ -76,7 +76,7 @@ class NamespaceDef : public Definition virtual bool subGrouping() const = 0; virtual MemberList *getMemberList(MemberListType lt) const = 0; virtual const QList &getMemberLists() const = 0; - virtual MemberDef *getMemberByName(const QCString &) const = 0; + virtual const MemberDef *getMemberByName(const QCString &) const = 0; /*! Returns the user defined member groups */ virtual const MemberGroupList &getMemberGroups() const = 0; diff --git a/src/pycode.l b/src/pycode.l index b7f3b66..65788cc 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -81,8 +81,8 @@ struct pycodeYY_state int inputLines = 0; //!< number of line in the code fragment int yyLineNr = 0; //!< current line number FileDef * sourceFileDef = 0; - Definition * currentDefinition = 0; - MemberDef * currentMemberDef = 0; + const Definition * currentDefinition = 0; + const MemberDef * currentMemberDef = 0; bool includeCodeFragment = FALSE; QCString realScope; int bodyCurlyCount = 0; @@ -1010,7 +1010,7 @@ static void startCodeLine(yyscan_t yyscanner) //lineNumber.sprintf("%05d",yyextra->yyLineNr); //lineAnchor.sprintf("l%05d",yyextra->yyLineNr); - Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); + const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); //printf("startCodeLine %d d=%p\n",yyextra->yyLineNr,d); //yyextra->code->startLineNumber(); @@ -1291,7 +1291,7 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner, if ((lcd=yyextra->theVarContext.findVariable(className))==0) // not a local variable { - Definition *d = yyextra->currentDefinition; + const Definition *d = yyextra->currentDefinition; QCString scope = substitute(className,".","::"); cd = yyextra->symbolResolver.resolveClass(d,substitute(className,".","::")); @@ -1378,7 +1378,7 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner, const NamespaceDef *mnd = getResolvedNamespace(scope); if (mnd) { - MemberDef *mmd=mnd->getMemberByName(locName); + const MemberDef *mmd=mnd->getMemberByName(locName); if (mmd) { //printf("name=%s scope=%s\n",locName.data(),scope.data()); @@ -1472,8 +1472,8 @@ static bool findMemberLink(yyscan_t yyscanner, sym->getOuterScope()->definitionType()==Definition::TypeClass && yyextra->currentDefinition->definitionType()==Definition::TypeClass) { - ClassDef *cd = toClassDef(sym->getOuterScope()); - ClassDef *thisCd = toClassDef(yyextra->currentDefinition); + const ClassDef *cd = toClassDef(sym->getOuterScope()); + const ClassDef *thisCd = toClassDef(yyextra->currentDefinition); if (sym->definitionType()==Definition::TypeMember) { if (yyextra->currentMemberDef && yyextra->collectXRefs) diff --git a/src/vhdlcode.l b/src/vhdlcode.l index efb367b..1139d29 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -1014,7 +1014,7 @@ static void startCodeLine(yyscan_t yyscanner) //lineAnchor.sprintf("l%05d",yyextra->yyLineNr); // if ((yyextra->yyLineNr % 500) == 0) // fprintf(stderr,"\n starting Line %d:",yyextra->yyLineNr); - Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); + const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); //printf("startCodeLine %d d=%s\n", yyextra->yyLineNr,d ? d->name().data() : ""); if (!yyextra->includeCodeFragment && d) { diff --git a/src/xmlcode.l b/src/xmlcode.l index c7322cb..41f5504 100644 --- a/src/xmlcode.l +++ b/src/xmlcode.l @@ -239,7 +239,7 @@ static void startCodeLine(yyscan_t yyscanner) struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; if (yyextra->sourceFileDef) { - Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); + const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr); if (!yyextra->includeCodeFragment && d && d->isLinkableInProject()) { -- cgit v0.12