From c38a6fe88ceb3658ae4c09fa9550c770195d9401 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Sun, 27 Oct 2019 12:55:16 +0100 Subject: Changed ArgumentList to be an STL container --- addon/doxyparse/doxyparse.cpp | 60 ++-- src/arguments.cpp | 48 ++-- src/arguments.h | 81 ++---- src/classdef.cpp | 408 +++++--------------------- src/classdef.h | 17 +- src/classlist.cpp | 8 +- src/code.l | 14 +- src/context.cpp | 103 +++---- src/context.h | 8 +- src/defargs.h | 2 +- src/defargs.l | 79 ++--- src/defgen.cpp | 97 +++---- src/definition.cpp | 2 +- src/docparser.cpp | 33 +-- src/doxygen.cpp | 582 ++++++++++++++++--------------------- src/entry.cpp | 33 +-- src/entry.h | 12 +- src/fortranscanner.l | 51 ++-- src/groupdef.cpp | 14 +- src/memberdef.cpp | 504 ++++++++++++++------------------ src/memberdef.h | 30 +- src/perlmodgen.cpp | 76 +++-- src/pre.l | 4 +- src/pyscanner.l | 24 +- src/scanner.l | 257 ++++++++--------- src/sqlite3gen.cpp | 135 +++++---- src/tagreader.cpp | 20 +- src/tclscanner.l | 23 +- src/util.cpp | 650 ++++++++++++++++-------------------------- src/util.h | 22 +- src/vhdlcode.l | 15 +- src/vhdldocgen.cpp | 171 ++++------- src/vhdldocgen.h | 22 +- src/vhdljjparser.cpp | 28 +- src/xmlgen.cpp | 97 +++---- 35 files changed, 1459 insertions(+), 2271 deletions(-) diff --git a/addon/doxyparse/doxyparse.cpp b/addon/doxyparse/doxyparse.cpp index 592ac42..415354d 100644 --- a/addon/doxyparse/doxyparse.cpp +++ b/addon/doxyparse/doxyparse.cpp @@ -183,28 +183,25 @@ std::string sanitizeString(std::string data) { return !new_data.isEmpty() ? new_data.data() : ""; } -std::string argumentData(Argument *argument) { +std::string argumentData(const Argument &argument) { std::string data = ""; - if (argument->type != NULL && argument->type.size() > 1) - data = sanitizeString(argument->type.data()); - else if (argument->name != NULL) - data = sanitizeString(argument->name.data()); + if (argument.type.size() > 1) + data = sanitizeString(argument.type.data()); + else if (!argument.name.isEmpty()) + data = sanitizeString(argument.name.data()); return data; } std::string functionSignature(MemberDef* md) { std::string signature = sanitizeString(md->name().data()); if(md->isFunction()){ - ArgumentList *argList = md->argumentList(); + const ArgumentList &argList = md->argumentList(); signature += "("; - if (argList) { - ArgumentListIterator iterator(*argList); - Argument * argument = iterator.toFirst(); - if(argument != NULL) { - signature += argumentData(argument); - for(++iterator; (argument = iterator.current()); ++iterator) { - signature += std::string(",") + argumentData(argument); - } + auto it = argList.begin(); + if(it!=argList.end()) { + signature += argumentData(*it); + for(++it; it!=argList.end(); ++it) { + signature += std::string(",") + argumentData(*it); } } signature += ")"; @@ -255,19 +252,14 @@ void cModule(ClassDef* cd) { } } -static bool checkOverrideArg(ArgumentList *argList, MemberDef *md) { - ArgumentListIterator iterator(*argList); - Argument * argument = iterator.toFirst(); - - if(!md->isFunction() || argList->count() == 0){ - return false; +static bool checkOverrideArg(const ArgumentList &argList, MemberDef *md) { + if(!md->isFunction() || argList.empty()){ + return false; } - if(argument != NULL) { - for(; (argument = iterator.current()); ++iterator){ - if(md->name() == argument->name) { - return true; - } + for (const Argument &argument : argList) { + if(md->name() == argument.name) { + return true; } } @@ -278,17 +270,15 @@ void functionInformation(MemberDef* md) { std::string temp = ""; int size = md->getEndBodyLine() - md->getStartBodyLine() + 1; printNumberOfLines(size); - ArgumentList *argList = md->argumentList(); - if (argList) { - ArgumentListIterator iterator(*argList); - Argument * argument = iterator.toFirst(); - if(argument != NULL) { - temp = argumentData(argument); + const ArgumentList &argList = md->argumentList(); + if (!argList.empty()) + { + temp = argumentData(argList.front()); // TODO: This is a workaround; better not include "void" in argList, in the first place. - if(temp != "void") { - printNumberOfArguments(argList->count()); - } - } + if (temp!="void") + { + printNumberOfArguments(argList.size()); + } } printNumberOfConditionalPaths(md); diff --git a/src/arguments.cpp b/src/arguments.cpp index 6d3e13b..69636f5 100644 --- a/src/arguments.cpp +++ b/src/arguments.cpp @@ -1,39 +1,25 @@ +/***************************************************************************** + * Copyright (C) 1997-2019 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 + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + */ + +#include + #include "arguments.h" -#include /*! the argument list is documented if one of its - * arguments is documented + * arguments is documented */ bool ArgumentList::hasDocumentation() const { - bool hasDocs=FALSE; - ArgumentListIterator ali(*this); - Argument *a; - for (ali.toFirst();!hasDocs && (a=ali.current());++ali) - { - hasDocs = a->hasDocumentation(); - } - return hasDocs; -} - -ArgumentList *ArgumentList::deepCopy() const -{ - ArgumentList *argList = new ArgumentList; - argList->setAutoDelete(TRUE); - - QListIterator ali(*this); - Argument *a; - for (;(a=ali.current());++ali) - { - argList->append(new Argument(*a)); - } - argList->constSpecifier = constSpecifier; - argList->volatileSpecifier = volatileSpecifier; - argList->pureSpecifier = pureSpecifier; - argList->trailingReturnType = trailingReturnType; - argList->isDeleted = isDeleted; - argList->refQualifier = refQualifier; - - return argList; + return std::any_of(begin(),end(),[](const Argument &a){ return a.hasDocumentation(); }); } diff --git a/src/arguments.h b/src/arguments.h index 7ef9642..58aaa4f 100644 --- a/src/arguments.h +++ b/src/arguments.h @@ -16,7 +16,7 @@ #ifndef ARGUMENTS_H #define ARGUMENTS_H -#include +#include #include class StorageIntf; @@ -27,34 +27,6 @@ class StorageIntf; */ struct Argument { - /*! Construct a new argument. */ - Argument() {} - /*! Copy an argument (does a deep copy of all strings). */ - Argument(const Argument &a) - { - attrib=a.attrib; - type=a.type; - name=a.name; - array=a.array; - defval=a.defval; - docs=a.docs; - typeConstraint=a.typeConstraint; - } - /*! Assignment of an argument (does a deep copy of all strings). */ - Argument &operator=(const Argument &a) - { - if (this!=&a) - { - attrib=a.attrib; - type=a.type; - name=a.name; - array=a.array; - defval=a.defval; - docs=a.docs; - typeConstraint=a.typeConstraint; - } - return *this; - } /*! return TRUE if this argument is documentation and the argument has a * non empty name. */ @@ -86,37 +58,42 @@ enum RefQualifierType * put after the argument list, such as whether the member is const, * volatile or pure virtual. */ -class ArgumentList : public QList +class ArgumentList : public std::vector { public: - /*! Creates an empty argument list */ - ArgumentList() : QList(), - constSpecifier(FALSE), - volatileSpecifier(FALSE), - pureSpecifier(FALSE), - isDeleted(FALSE), - refQualifier(RefQualifierNone) - { setAutoDelete(TRUE); } - /*! Destroys the argument list */ - ~ArgumentList() {} - /*! Makes a deep copy of this object */ - ArgumentList *deepCopy() const; /*! Does any argument of this list have documentation? */ bool hasDocumentation() const; - /*! Does the member modify the state of the class? default: FALSE. */ - bool constSpecifier; - /*! Is the member volatile? default: FALSE. */ - bool volatileSpecifier; - /*! Is this a pure virtual member? default: FALSE */ - bool pureSpecifier; + /*! Does this list have zero or more parameters */ + bool hasParameters() const + { + return !empty() || noParameters; + } + void reset() + { + clear(); + constSpecifier = FALSE; + volatileSpecifier = FALSE; + pureSpecifier = FALSE; + trailingReturnType.resize(0); + isDeleted = FALSE; + refQualifier = RefQualifierNone; + noParameters = FALSE; + } + + /*! Does the member modify the state of the class? */ + bool constSpecifier = FALSE; + /*! Is the member volatile? */ + bool volatileSpecifier = FALSE; + /*! Is this a pure virtual member? */ + bool pureSpecifier = FALSE; /*! C++11 style Trailing return type? */ QCString trailingReturnType; /*! method with =delete */ - bool isDeleted; + bool isDeleted = FALSE; /*! C++11 ref qualifier */ - RefQualifierType refQualifier; + RefQualifierType refQualifier = RefQualifierNone; + /*! is it an explicit empty list */ + bool noParameters = FALSE; }; -typedef QListIterator ArgumentListIterator; - #endif diff --git a/src/classdef.cpp b/src/classdef.cpp index 7548c6c..88bec11 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -87,7 +87,7 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef virtual bool isLinkable() const; virtual bool isVisibleInHierarchy() const; virtual bool visibleInParentsDeclList() const; - virtual ArgumentList *templateArguments() const; + virtual const ArgumentList &templateArguments() const; virtual NamespaceDef *getNamespaceDef() const; virtual FileDef *getFileDef() const; virtual MemberDef *getMemberByName(const QCString &) const; @@ -104,9 +104,9 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef virtual ConstraintClassDict *templateTypeConstraints() const; virtual bool isTemplateArgument() const; virtual Definition *findInnerCompound(const char *name) const; - virtual void getTemplateParameterLists(QList &lists) const; + virtual std::vector getTemplateParameterLists() const; virtual QCString qualifiedNameWithTemplateParameters( - QList *actualParams=0,int *actualParamIndex=0) const; + const std::vector *actualParams=0,int *actualParamIndex=0) const; virtual bool isAbstract() const; virtual bool isObjectiveC() const; virtual bool isFortran() const; @@ -138,7 +138,7 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef virtual QCString title() const; virtual QCString generatedFromFiles() const; virtual const FileList &usedFiles() const; - virtual const ArgumentList *typeConstraints() const; + virtual const ArgumentList &typeConstraints() const; virtual const ExampleSDict *exampleList() const; virtual bool hasExamples() const; virtual QCString getMemberListFileName() const; @@ -167,10 +167,10 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef virtual void setCompoundType(CompoundType t); virtual void setClassName(const char *name); virtual void setClassSpecifier(uint64 spec); - virtual void setTemplateArguments(ArgumentList *al); + virtual void setTemplateArguments(const ArgumentList &al); virtual void setTemplateBaseClassNames(QDict *templateNames); virtual void setTemplateMaster(const ClassDef *tm); - virtual void setTypeConstraints(ArgumentList *al); + virtual void setTypeConstraints(const ArgumentList &al); virtual void addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec); virtual void makeTemplateArgument(bool b=TRUE); virtual void setCategoryOf(ClassDef *cd); @@ -332,7 +332,7 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef { return getCdAlias()->isVisibleInHierarchy(); } virtual bool visibleInParentsDeclList() const { return getCdAlias()->visibleInParentsDeclList(); } - virtual ArgumentList *templateArguments() const + virtual const ArgumentList &templateArguments() const { return getCdAlias()->templateArguments(); } virtual NamespaceDef *getNamespaceDef() const { return getCdAlias()->getNamespaceDef(); } @@ -366,10 +366,10 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef { return getCdAlias()->isTemplateArgument(); } virtual Definition *findInnerCompound(const char *name) const { return getCdAlias()->findInnerCompound(name); } - virtual void getTemplateParameterLists(QList &lists) const - { return getCdAlias()->getTemplateParameterLists(lists); } + virtual std::vector getTemplateParameterLists() const + { return getCdAlias()->getTemplateParameterLists(); } virtual QCString qualifiedNameWithTemplateParameters( - QList *actualParams=0,int *actualParamIndex=0) const + const std::vector *actualParams=0,int *actualParamIndex=0) const { return getCdAlias()->qualifiedNameWithTemplateParameters(actualParams,actualParamIndex); } virtual bool isAbstract() const { return getCdAlias()->isAbstract(); } @@ -433,7 +433,7 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef { return getCdAlias()->generatedFromFiles(); } virtual const FileList &usedFiles() const { return getCdAlias()->usedFiles(); } - virtual const ArgumentList *typeConstraints() const + virtual const ArgumentList &typeConstraints() const { return getCdAlias()->typeConstraints(); } virtual const ExampleSDict *exampleList() const { return getCdAlias()->exampleList(); } @@ -470,10 +470,10 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef virtual void setCompoundType(CompoundType t) {} virtual void setClassName(const char *name) {} virtual void setClassSpecifier(uint64 spec) {} - virtual void setTemplateArguments(ArgumentList *al) {} + virtual void setTemplateArguments(const ArgumentList &al) {} virtual void setTemplateBaseClassNames(QDict *templateNames) {} virtual void setTemplateMaster(const ClassDef *tm) {} - virtual void setTypeConstraints(ArgumentList *al) {} + virtual void setTypeConstraints(const ArgumentList &al) {} virtual void addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec) {} virtual void makeTemplateArgument(bool b=TRUE) {} virtual void setCategoryOf(ClassDef *cd) {} @@ -586,10 +586,10 @@ class ClassDefImpl::IMPL MemberNameInfoSDict *allMemberNameInfoSDict; /*! Template arguments of this class */ - ArgumentList *tempArgs; + ArgumentList tempArgs; /*! Type constraints for template parameters */ - ArgumentList *typeConstraints; + ArgumentList typeConstraints; /*! Files that were used for generating the class documentation. */ FileList files; @@ -710,8 +710,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name, inheritedBy = 0; allMemberNameInfoSDict = 0; incInfo=0; - tempArgs=0; - typeConstraints=0; prot=Public; nspace=0; fileDef=0; @@ -777,8 +775,6 @@ ClassDefImpl::IMPL::~IMPL() delete templateInstances; delete variableInstances; delete templBaseClassNames; - delete tempArgs; - delete typeConstraints; delete taggedInnerClasses; } @@ -1376,7 +1372,7 @@ void ClassDefImpl::setIncludeFile(FileDef *fd, //} static void searchTemplateSpecs(/*in*/ const Definition *d, - /*out*/ QList &result, + /*out*/ std::vector &result, /*out*/ QCString &name, /*in*/ SrcLangExt lang) { @@ -1395,9 +1391,9 @@ static void searchTemplateSpecs(/*in*/ const Definition *d, } name+=clName; bool isSpecialization = d->localName().find('<')!=-1; - if (cd->templateArguments()) + if (!cd->templateArguments().empty()) { - result.append(cd->templateArguments()); + result.push_back(cd->templateArguments()); if (!isSpecialization) { name+=tempArgListToString(cd->templateArguments(),lang); @@ -1413,35 +1409,32 @@ static void searchTemplateSpecs(/*in*/ const Definition *d, static void writeTemplateSpec(OutputList &ol,const Definition *d, const QCString &type,SrcLangExt lang) { - QList specs; + std::vector specs; QCString name; searchTemplateSpecs(d,specs,name,lang); - if (specs.count()>0) // class has template scope specifiers + if (!specs.empty()) // class has template scope specifiers { ol.startSubsubsection(); - QListIterator spi(specs); - ArgumentList *al; - for (spi.toFirst();(al=spi.current());++spi) + for (const ArgumentList &al : specs) { ol.docify("template<"); - QListIterator ali(*al); - Argument *a; - while ((a=ali.current())) + auto it = al.begin(); + while (it!=al.end()) { - ol.docify(a->type); - if (!a->name.isEmpty()) + Argument a = *it; + ol.docify(a.type); + if (!a.name.isEmpty()) { ol.docify(" "); - ol.docify(a->name); + ol.docify(a.name); } - if (a->defval.length()!=0) + if (a.defval.length()!=0) { ol.docify(" = "); - ol.docify(a->defval); + ol.docify(a.defval); } - ++ali; - a=ali.current(); - if (a) ol.docify(", "); + ++it; + if (it!=al.end()) ol.docify(", "); } ol.docify(">"); ol.lineBreak(); @@ -2268,14 +2261,9 @@ void ClassDefImpl::writeTagFile(FTextStream &tagFile) { tagFile << " " << convertToXML(idStr) << "" << endl; } - if (m_impl->tempArgs) + for (const Argument &a : m_impl->tempArgs) { - ArgumentListIterator ali(*m_impl->tempArgs); - Argument *a; - for (;(a=ali.current());++ali) - { - tagFile << " " << convertToXML(a->name) << "" << endl; - } + tagFile << " " << convertToXML(a.name) << "" << endl; } if (m_impl->inherits) { @@ -2816,7 +2804,7 @@ QCString ClassDefImpl::title() const { pageTitle = theTranslator->trCompoundReferenceFortran(displayName(), m_impl->compType, - m_impl->tempArgs != 0); + !m_impl->tempArgs.empty()); } else if (lang==SrcLangExt_Slice) { @@ -2850,7 +2838,7 @@ QCString ClassDefImpl::title() const { pageTitle = theTranslator->trCompoundReference(displayName(), m_impl->compType == Interface && getLanguage()==SrcLangExt_ObjC ? Class : m_impl->compType, - m_impl->tempArgs != 0); + !m_impl->tempArgs.empty()); } } return pageTitle; @@ -3362,55 +3350,33 @@ void ClassDefImpl::addTypeConstraint(const QCString &typeConstraint,const QCStri // Java Type Constrains: A void ClassDefImpl::addTypeConstraints() { - if (m_impl->tempArgs) + for (const Argument &a : m_impl->tempArgs) { - ArgumentListIterator ali(*m_impl->tempArgs); - Argument *a; - for (;(a=ali.current());++ali) + if (!a.typeConstraint.isEmpty()) { - if (!a->typeConstraint.isEmpty()) + QCString typeConstraint; + int i=0,p=0; + while ((i=a.typeConstraint.find('&',p))!=-1) // typeConstraint="A &I" for C { - QCString typeConstraint; - int i=0,p=0; - while ((i=a->typeConstraint.find('&',p))!=-1) // typeConstraint="A &I" for C - { - typeConstraint = a->typeConstraint.mid(p,i-p).stripWhiteSpace(); - addTypeConstraint(typeConstraint,a->type); - p=i+1; - } - typeConstraint = a->typeConstraint.right(a->typeConstraint.length()-p).stripWhiteSpace(); - addTypeConstraint(typeConstraint,a->type); + typeConstraint = a.typeConstraint.mid(p,i-p).stripWhiteSpace(); + addTypeConstraint(typeConstraint,a.type); + p=i+1; } + typeConstraint = a.typeConstraint.right(a.typeConstraint.length()-p).stripWhiteSpace(); + addTypeConstraint(typeConstraint,a.type); } } } // C# Type Constraints: D where T : C, I -void ClassDefImpl::setTypeConstraints(ArgumentList *al) +void ClassDefImpl::setTypeConstraints(const ArgumentList &al) { - if (al==0) return; - if (!m_impl->typeConstraints) delete m_impl->typeConstraints; - m_impl->typeConstraints = new ArgumentList; - ArgumentListIterator ali(*al); - Argument *a; - for (;(a=ali.current());++ali) - { - m_impl->typeConstraints->append(new Argument(*a)); - } + m_impl->typeConstraints = al; } -void ClassDefImpl::setTemplateArguments(ArgumentList *al) +void ClassDefImpl::setTemplateArguments(const ArgumentList &al) { - if (al==0) return; - if (m_impl->tempArgs) delete m_impl->tempArgs; // delete old list if needed - //printf("setting template args '%s' for '%s'\n",tempArgListToString(al,getLanguage()).data(),name().data()); - m_impl->tempArgs=new ArgumentList; - ArgumentListIterator ali(*al); - Argument *a; - for (;(a=ali.current());++ali) - { - m_impl->tempArgs->append(new Argument(*a)); - } + m_impl->tempArgs = al; } /*! Returns \c TRUE iff this class or a class inheriting from this class @@ -3704,8 +3670,8 @@ void ClassDefImpl::mergeMembers() if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE)) // member is in the same or a base class { - const ArgumentList *srcAl = srcMd->argumentList(); - const ArgumentList *dstAl = dstMd->argumentList(); + ArgumentList &srcAl = srcMd->argumentList(); + ArgumentList &dstAl = dstMd->argumentList(); found=matchArguments2( srcMd->getOuterScope(),srcMd->getFileDef(),srcAl, dstMd->getOuterScope(),dstMd->getFileDef(),dstAl, @@ -4099,203 +4065,6 @@ void ClassDefImpl::addUsedByClass(ClassDef *cd,const char *accessName, } -#if 0 -/*! Builds up a dictionary of all classes that are used by the state of this - * class (the "implementation"). - * Must be called before mergeMembers() is called! - */ - -void ClassDefImpl::determineImplUsageRelation() -{ - MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict); - MemberNameInfo *mni; - for (;(mni=mnili.current());++mnili) - { - MemberNameInfoIterator mnii(*mni); - MemberInfo *mi; - for (mnii.toFirst();(mi=mnii.current());++mnii) - { - MemberDef *md=mi->memberDef; - if (md->isVariable()) // for each member variable in this class - { - QCString type=removeRedundantWhiteSpace(md->typeString()); - //printf("in class %s found var type='%s' name='%s'\n", - // name().data(),type.data(),md->name().data()); - int pos=0; - QCString usedClassName; - QCString templSpec; - bool found=FALSE; - while (extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1 && !found) - { - //printf("usedClassName='%s' templSpec=%s\n",usedClassName.data(),templSpec.data()); - // check if usedClassName is a template argument of its class - ClassDef *cd=md->getClassDef(); - if (cd && cd->templateArguments()) - { - ArgumentListIterator ali(*cd->templateArguments()); - Argument *arg; - int count=0; - for (ali.toFirst();(arg=ali.current());++ali,++count) - { - if (arg->name==usedClassName) // type is a template argument - { - found=TRUE; - if (m_impl->usesImplClassDict==0) m_impl->usesImplClassDict = new UsesClassDict(257); - cd = new ClassDef(cd->getDefFileName(),cd->getDefLine(), - usedClassName,ClassDef::Class); - cd->setIsTemplateBaseClass(count); - UsesClassDef *ucd = new UsesClassDef(cd); - m_impl->usesImplClassDict->insert(cd->name(),ucd); - ucd->templSpecifiers = templSpec; - ucd->addAccessor(md->name()); - Doxygen::hiddenClasses.append(cd); - //printf("Adding used template argument %s to class %s\n", - // cd->name().data(),name().data()); - //printf("Adding accessor %s to class %s\n", - // md->name().data(),ucd->classDef->name().data()); - } - } - } - - if (!found) - { - cd=0; - if (getNamespaceDef()!=0) - { - cd=getResolvedClass(getNamespaceDef()->name()+"::"+usedClassName,0,&templSpec); - } - if (cd==0) cd=getResolvedClass(name()+"::"+usedClassName,0,&templSpec); - if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try in-between scopes! - //printf("Search for class %s result=%p\n",usedClassName.data(),cd); - if (cd) // class exists - { - found=TRUE; - if (m_impl->usesImplClassDict==0) - { - m_impl->usesImplClassDict = new UsesClassDict(257); - m_impl->usesImplClassDict->setAutoDelete(TRUE); - } - UsesClassDef *ucd=m_impl->usesImplClassDict->find(cd->name()); - if (ucd==0 || ucd->templSpecifiers!=templSpec) - { - ucd = new UsesClassDef(cd); - m_impl->usesImplClassDict->insert(cd->name(),ucd); - ucd->templSpecifiers = templSpec; - //printf("Adding used class %s to class %s\n", - // cd->name().data(),name().data()); - } - ucd->addAccessor(md->name()); - //printf("Adding accessor %s to class %s\n", - // md->name().data(),ucd->classDef->name().data()); - } - } - } - } - } - } -#ifdef DUMP - if (m_impl->usesClassDict) - { - msg("Class %s uses the following classes:\n",name().data()); - UsesClassDictIterator ucdi(*m_impl->usesClassDict); - UsesClassDef *ucd; - for (;(ucd=ucdi.current());++ucdi) - { - msg(" %s via ",ucd->classDef->name().data()); - QDictIterator dvi(*ucd->accessors); - const char *s; - for (;(s=dvi.currentKey());++dvi) - { - msg("%s ",s); - } - msg("\n"); - } - } -#endif -} - -//---------------------------------------------------------------------------- - -// I have disabled this code because the graphs it renders quickly become -// too large to be of practical use. - -void ClassDefImpl::addUsedInterfaceClasses(MemberDef *md,const char *typeStr) -{ - QCString type = typeStr; - static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*"); - int p=0,i,l; - while ((i=re.match(type,p,&l))!=-1) // for each class name in the type - { - ClassDef *cd=getClass(name()+"::"+type.mid(i,l)); - if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try in-between scopes! - if (cd && cd!=this && !isBaseClass(cd)) - { - if (m_impl->usesIntfClassDict==0) - { - m_impl->usesIntfClassDict = new UsesClassDict(257); - } - UsesClassDef *ucd=m_impl->usesIntfClassDict->find(cd->name()); - if (ucd==0) - { - ucd = new UsesClassDef(cd); - m_impl->usesIntfClassDict->insert(cd->name(),ucd); - //printf("in class '%s' adding used intf class '%s'\n", - // name().data(),cd->name().data()); - } - ucd->addAccessor(md->name()); - //printf("in class '%s' adding accessor '%s' to class '%s'\n", - // name().data(),md->name().data(),ucd->classDef->name().data()); - } - p=i+l; - } -} - -void ClassDefImpl::determineIntfUsageRelation() -{ - MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoList); - MemberNameInfo *mni; - for (;(mni=mnili.current());++mnili) - { - MemberNameInfoIterator mnii(*mni); - MemberInfo *mi; - for (mnii.toFirst();(mi=mnii.current());++mnii) - { - MemberDef *md=mi->memberDef; - - // compute the protection level for this member - Protection protect=md->protection(); - if (mi->prot==Protected) // inherited protection - { - if (protect==Public) protect=Protected; - else if (protect==Protected) protect=Private; - } - - if (!md->name().isEmpty() && md->name()[0]!='@' && - (mi->prot!=Private && protect!=Private) - ) - { - // add classes found in the return type - addUsedInterfaceClasses(md,md->typeString()); - ArgumentList *al = md->argumentList(); - if (al) // member has arguments - { - // add classes found in the types of the argument list - ArgumentListIterator ali(*al); - Argument *a; - for (;(a=ali.current());++ali) - { - if (!a->type.isEmpty() && a->type.at(0)!='@') - { - addUsedInterfaceClasses(md,a->type); - } - } - } - } - } - } -} -#endif - QCString ClassDefImpl::compoundTypeString() const { if (getLanguage()==SrcLangExt_Fortran) @@ -4431,46 +4200,6 @@ Definition *ClassDefImpl::findInnerCompound(const char *name) const return result; } -//void ClassDefImpl::initTemplateMapping() -//{ -// m_impl->templateMapping->clear(); -// ArgumentList *al = templateArguments(); -// if (al) -// { -// ArgumentListIterator ali(*al); -// Argument *arg; -// for (ali.toFirst();(arg=ali.current());++ali) -// { -// setTemplateArgumentMapping(arg->name,arg->defval); -// } -// } -//} -//void ClassDefImpl::setTemplateArgumentMapping(const char *formal,const char *actual) -//{ -// //printf("ClassDefImpl::setTemplateArgumentMapping(%s,%s)\n",formal,actual); -// if (m_impl->templateMapping && formal) -// { -// if (m_impl->templateMapping->find(formal)) -// { -// m_impl->templateMapping->remove(formal); -// } -// m_impl->templateMapping->insert(formal,new QCString(actual)); -// } -//} -// -//QCString ClassDefImpl::getTemplateArgumentMapping(const char *formal) const -//{ -// if (m_impl->templateMapping && formal) -// { -// QCString *s = m_impl->templateMapping->find(formal); -// if (s) -// { -// return *s; -// } -// } -// return ""; -//} - ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName, int startLine, int startColumn, const QCString &templSpec,bool &freshInstance) const { @@ -4552,12 +4281,11 @@ void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const char *t MemberInfo *mi; for (mnii.toFirst();(mi=mnii.current());++mnii) { - ArgumentList *actualArguments = new ArgumentList; + ArgumentList actualArguments; stringToArgumentList(templSpec,actualArguments); MemberDef *md = mi->memberDef; MemberDef *imd = md->createTemplateInstanceMember( cd->templateArguments(),actualArguments); - delete actualArguments; //printf("%s->setMemberClass(%p)\n",imd->name().data(),this); imd->setMemberClass(this); imd->setTemplateMaster(md); @@ -4607,25 +4335,24 @@ bool ClassDefImpl::isReference() const } } -void ClassDefImpl::getTemplateParameterLists(QList &lists) const +std::vector ClassDefImpl::getTemplateParameterLists() const { + std::vector result; Definition *d=getOuterScope(); - if (d) + while (d && d->definitionType()==Definition::TypeClass) { - if (d->definitionType()==Definition::TypeClass) - { - ClassDef *cd=dynamic_cast(d); - cd->getTemplateParameterLists(lists); - } + result.insert(result.begin(),dynamic_cast(d)->templateArguments()); + d = d->getOuterScope(); } - if (templateArguments()) + if (!templateArguments().empty()) { - lists.append(templateArguments()); + result.push_back(templateArguments()); } + return result; } QCString ClassDefImpl::qualifiedNameWithTemplateParameters( - QList *actualParams,int *actualParamIndex) const + const std::vector *actualParams,int *actualParamIndex) const { //static bool optimizeOutputJava = Config_getBool(OPTIMIZE_OUTPUT_JAVA); static bool hideScopeNames = Config_getBool(HIDE_SCOPE_NAMES); @@ -4659,12 +4386,11 @@ QCString ClassDefImpl::qualifiedNameWithTemplateParameters( //} //printf("m_impl->lang=%d clName=%s isSpecialization=%d\n",getLanguage(),clName.data(),isSpecialization); scName+=clName; - ArgumentList *al=0; - if (templateArguments()) + if (!templateArguments().empty()) { - if (actualParams && *actualParamIndex<(int)actualParams->count()) + if (actualParams && *actualParamIndex<(int)actualParams->size()) { - al = actualParams->at(*actualParamIndex); + const ArgumentList &al = actualParams->at(*actualParamIndex); if (!isSpecialization) { scName+=tempArgListToString(al,lang); @@ -5238,7 +4964,7 @@ Protection ClassDefImpl::protection() const return m_impl->prot; } -ArgumentList *ClassDefImpl::templateArguments() const +const ArgumentList &ClassDefImpl::templateArguments() const { return m_impl->tempArgs; } @@ -5265,7 +4991,7 @@ const ClassDef *ClassDefImpl::templateMaster() const bool ClassDefImpl::isTemplate() const { - return m_impl->tempArgs!=0; + return !m_impl->tempArgs.empty(); } IncludeInfo *ClassDefImpl::includeInfo() const @@ -5551,7 +5277,7 @@ const FileList &ClassDefImpl::usedFiles() const return m_impl->files; } -const ArgumentList *ClassDefImpl::typeConstraints() const +const ArgumentList &ClassDefImpl::typeConstraints() const { return m_impl->typeConstraints; } diff --git a/src/classdef.h b/src/classdef.h index e64f0eb..c9cc806 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -18,6 +18,8 @@ #ifndef CLASSDEF_H #define CLASSDEF_H +#include + #include #include #include @@ -154,10 +156,9 @@ class ClassDef : virtual public Definition /** show this class in the declaration section of its parent? */ virtual bool visibleInParentsDeclList() const = 0; - /** Returns the template arguments of this class - * Will return 0 if not applicable. + /** Returns the template arguments of this class */ - virtual ArgumentList *templateArguments() const = 0; + virtual const ArgumentList &templateArguments() const = 0; /** Returns the namespace this compound is in, or 0 if it has a global * scope. @@ -228,10 +229,10 @@ class ClassDef : virtual public Definition * will return a list with one ArgumentList containing one argument * with type="class" and name="T". */ - virtual void getTemplateParameterLists(QList &lists) const = 0; + virtual std::vector getTemplateParameterLists() const = 0; virtual QCString qualifiedNameWithTemplateParameters( - QList *actualParams=0,int *actualParamIndex=0) const = 0; + const std::vector *actualParams=0,int *actualParamIndex=0) const = 0; /** Returns TRUE if there is at least one pure virtual member in this * class. @@ -308,7 +309,7 @@ class ClassDef : virtual public Definition virtual QCString generatedFromFiles() const = 0; virtual const FileList &usedFiles() const = 0; - virtual const ArgumentList *typeConstraints() const = 0; + virtual const ArgumentList &typeConstraints() const = 0; virtual const ExampleSDict *exampleList() const = 0; virtual bool hasExamples() const = 0; virtual QCString getMemberListFileName() const = 0; @@ -331,10 +332,10 @@ class ClassDef : virtual public Definition virtual void setCompoundType(CompoundType t) = 0; virtual void setClassName(const char *name) = 0; virtual void setClassSpecifier(uint64 spec) = 0; - virtual void setTemplateArguments(ArgumentList *al) = 0; + virtual void setTemplateArguments(const ArgumentList &al) = 0; virtual void setTemplateBaseClassNames(QDict *templateNames) = 0; virtual void setTemplateMaster(const ClassDef *tm) = 0; - virtual void setTypeConstraints(ArgumentList *al) = 0; + 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; diff --git a/src/classlist.cpp b/src/classlist.cpp index 93ae8aa..6928c52 100644 --- a/src/classlist.cpp +++ b/src/classlist.cpp @@ -167,8 +167,8 @@ void GenericsSDict::insert(const QCString &key,ClassDef *cd) int i=key.find('<'); if (i==-1) return; ArgumentList argList; - stringToArgumentList(key.mid(i),&argList); - int c = argList.count(); + stringToArgumentList(key.mid(i),argList); + int c = argList.size(); if (c==0) return; GenericsCollection *collection = m_dict.find(key.left(i)); if (collection==0) // new name @@ -200,8 +200,8 @@ ClassDef *GenericsSDict::find(const QCString &key) if (collection) { ArgumentList argList; - stringToArgumentList(key.mid(i),&argList); - int c = argList.count(); + stringToArgumentList(key.mid(i),argList); + int c = argList.size(); return collection->find(c); } } diff --git a/src/code.l b/src/code.l index 9428432..46de92c 100644 --- a/src/code.l +++ b/src/code.l @@ -276,7 +276,7 @@ void VariableContext::addVariable(const QCString &type,const QCString &name) // otherwise look for global class definitions (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,typeName,0,0,TRUE,TRUE)) ) && // and it must be a template - varType->templateArguments()) + !varType->templateArguments().empty()) { newDef = varType->getVariableInstance( templateArgs ); } @@ -679,14 +679,10 @@ static void addUsingDirective(const char *name) static void setParameterList(const MemberDef *md) { g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : ""; - const ArgumentList *al = md->argumentList(); - if (al==0) return; - ArgumentListIterator it(*al); - const Argument *a; - for (;(a=it.current());++it) - { - g_parmName = a->name.copy(); - g_parmType = a->type.copy(); + for (const Argument &a : md->argumentList()) + { + g_parmName = a.name; + g_parmType = a.type; int i = g_parmType.find('*'); if (i!=-1) g_parmType = g_parmType.left(i); i = g_parmType.find('&'); diff --git a/src/context.cpp b/src/context.cpp index 8b7643a..361bfa2 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -2381,7 +2381,7 @@ class ClassContext::Private : public DefinitionContext addTemplateDecls(parent,tl); } const ClassDef *cd=dynamic_cast(d); - if (cd->templateArguments()) + if (!cd->templateArguments().empty()) { ArgumentListContext *al = ArgumentListContext::alloc(cd->templateArguments(),cd,relPathAsString()); // since a TemplateVariant does take ownership of the object, we add it @@ -2422,10 +2422,10 @@ class ClassContext::Private : public DefinitionContext } TemplateVariant typeConstraints() const { - if (m_classDef->typeConstraints()) + if (!m_classDef->typeConstraints().empty()) { Cachable &cache = getCache(); - if (!cache.typeConstraints && m_classDef->typeConstraints()) + if (!cache.typeConstraints && !m_classDef->typeConstraints().empty()) { cache.typeConstraints.reset(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString())); } @@ -4529,7 +4529,7 @@ class MemberContext::Private : public DefinitionContext TemplateVariant templateArgs() const { Cachable &cache = getCache(); - if (!cache.templateArgs && m_memberDef->templateArguments()) + if (!cache.templateArgs && !m_memberDef->templateArguments().empty()) { cache.templateArgs.reset(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString())); } @@ -4644,7 +4644,7 @@ class MemberContext::Private : public DefinitionContext return createLinkedText(m_memberDef,relPathAsString(), m_memberDef->displayDefinition()); } - const ArgumentList *getDefArgList() const + const ArgumentList &getDefArgList() const { return (m_memberDef->isDocsForDefinition()) ? m_memberDef->argumentList() : m_memberDef->declArgumentList(); @@ -4654,8 +4654,8 @@ class MemberContext::Private : public DefinitionContext Cachable &cache = getCache(); if (!cache.arguments) { - const ArgumentList *defArgList = getDefArgList(); - if (defArgList && !m_memberDef->isProperty()) + const ArgumentList &defArgList = getDefArgList(); + if (!m_memberDef->isProperty()) { cache.arguments.reset(ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString())); } @@ -4668,35 +4668,31 @@ class MemberContext::Private : public DefinitionContext } TemplateVariant hasParameters() const { - return getDefArgList()!=0; + return !getDefArgList().empty(); } TemplateVariant hasConstQualifier() const { - const ArgumentList *al = getDefArgList(); - return al ? al->constSpecifier : FALSE; + return getDefArgList().constSpecifier; } TemplateVariant hasVolatileQualifier() const { - const ArgumentList *al = getDefArgList(); - return al ? al->volatileSpecifier : FALSE; + return getDefArgList().volatileSpecifier; } TemplateVariant hasRefQualifierLValue() const { - const ArgumentList *al = getDefArgList(); - return al ? al->refQualifier==RefQualifierLValue : FALSE; + return getDefArgList().refQualifier==RefQualifierLValue; } TemplateVariant hasRefQualifierRValue() const { - const ArgumentList *al = getDefArgList(); - return al ? al->refQualifier==RefQualifierRValue : FALSE; + return getDefArgList().refQualifier==RefQualifierRValue; } TemplateVariant trailingReturnType() const { - const ArgumentList *al = getDefArgList(); - if (al && !al->trailingReturnType.isEmpty()) + const ArgumentList &al = getDefArgList(); + if (!al.trailingReturnType.isEmpty()) { return createLinkedText(m_memberDef,relPathAsString(), - al->trailingReturnType); + al.trailingReturnType); } else { @@ -4710,13 +4706,11 @@ class MemberContext::Private : public DefinitionContext void addTemplateDecls(TemplateList *tl) const { const ClassDef *cd=m_memberDef->getClassDef(); - if (m_memberDef->definitionTemplateParameterLists()) + if (!m_memberDef->definitionTemplateParameterLists().empty()) { - QListIterator ali(*m_memberDef->definitionTemplateParameterLists()); - ArgumentList *tal; - for (ali.toFirst();(tal=ali.current());++ali) + for (const ArgumentList &tal : m_memberDef->definitionTemplateParameterLists()) { - if (tal->count()>0) + if (!tal.empty()) { ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString()); tl->append(al); @@ -4727,21 +4721,16 @@ class MemberContext::Private : public DefinitionContext { if (cd && !m_memberDef->isRelated() && !m_memberDef->isTemplateSpecialization()) { - QList tempParamLists; - cd->getTemplateParameterLists(tempParamLists); - //printf("#tempParamLists=%d\n",tempParamLists.count()); - QListIterator ali(tempParamLists); - ArgumentList *tal; - for (ali.toFirst();(tal=ali.current());++ali) + for (const ArgumentList &tal : cd->getTemplateParameterLists()) { - if (tal->count()>0) + if (!tal.empty()) { ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString()); tl->append(al); } } } - if (m_memberDef->templateArguments()) // function template prefix + if (!m_memberDef->templateArguments().empty()) // function template prefix { ArgumentListContext *al = ArgumentListContext::alloc( m_memberDef->templateArguments(),m_memberDef,relPathAsString()); @@ -4785,18 +4774,15 @@ class MemberContext::Private : public DefinitionContext Cachable &cache = getCache(); if (!cache.paramDocs) { - if (m_memberDef->argumentList() && m_memberDef->argumentList()->hasDocumentation()) + if (m_memberDef->argumentList().hasDocumentation()) { QCString paramDocs; - ArgumentListIterator ali(*m_memberDef->argumentList()); - Argument *a; - // convert the parameter documentation into a list of @param commands - for (ali.toFirst();(a=ali.current());++ali) + for (Argument &a : m_memberDef->argumentList()) { - if (a->hasDocumentation()) + if (a.hasDocumentation()) { - QCString direction = extractDirection(a->docs); - paramDocs+="@param"+direction+" "+a->name+" "+a->docs; + QCString direction = extractDirection(a.docs); + paramDocs+="@param"+direction+" "+a.name+" "+a.docs; } } cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef, @@ -4929,7 +4915,7 @@ class MemberContext::Private : public DefinitionContext TemplateVariant typeConstraints() const { Cachable &cache = getCache(); - if (!cache.typeConstraints && m_memberDef->typeConstraints()) + if (cache.typeConstraints && !m_memberDef->typeConstraints().empty()) { cache.typeConstraints.reset(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString())); } @@ -9413,7 +9399,7 @@ TemplateListIntf::ConstIterator *InheritedMemberInfoListContext::createIterator( class ArgumentContext::Private { public: - Private(const Argument *arg,const Definition *def,const QCString &relPath) : + Private(const Argument &arg,const Definition *def,const QCString &relPath) : m_argument(arg), m_def(def), m_relPath(relPath) { static bool init=FALSE; @@ -9435,33 +9421,33 @@ class ArgumentContext::Private } TemplateVariant type() const { - return createLinkedText(m_def,m_relPath,m_argument->type); + return createLinkedText(m_def,m_relPath,m_argument.type); } TemplateVariant attrib() const { - return m_argument->attrib; + return m_argument.attrib; } TemplateVariant name() const { - return m_argument->name; + return m_argument.name; } TemplateVariant defVal() const { - return createLinkedText(m_def,m_relPath,m_argument->defval); + return createLinkedText(m_def,m_relPath,m_argument.defval); } TemplateVariant array() const { - return m_argument->array; + return m_argument.array; } TemplateVariant docs() const { if (!m_cache.docs && m_def) { - if (!m_argument->docs.isEmpty()) + if (!m_argument.docs.isEmpty()) { m_cache.docs.reset(new TemplateVariant( parseDoc(m_def,m_def->docFile(),m_def->docLine(), - m_relPath,m_argument->docs,TRUE))); + m_relPath,m_argument.docs,TRUE))); } else { @@ -9472,7 +9458,7 @@ class ArgumentContext::Private } TemplateVariant namePart() const { - QCString result = m_argument->attrib; + QCString result = m_argument.attrib; int l = result.length(); if (l>2 && result.at(0)=='[' && result.at(l-1)==']') { @@ -9482,7 +9468,7 @@ class ArgumentContext::Private return result; } private: - const Argument *m_argument; + const Argument &m_argument; const Definition *m_def; QCString m_relPath; struct Cachable @@ -9496,7 +9482,7 @@ class ArgumentContext::Private PropertyMapper ArgumentContext::Private::s_inst; -ArgumentContext::ArgumentContext(const Argument *al,const Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext") +ArgumentContext::ArgumentContext(const Argument &al,const Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext") { p = new Private(al,def,relPath); } @@ -9517,7 +9503,7 @@ TemplateVariant ArgumentContext::get(const char *name) const class ArgumentListContext::Private : public GenericNodeListContext { public: - void addArgument(const Argument *arg,const Definition *def,const QCString &relPath) + void addArgument(const Argument &arg,const Definition *def,const QCString &relPath) { append(ArgumentContext::alloc(arg,def,relPath)); } @@ -9528,18 +9514,13 @@ ArgumentListContext::ArgumentListContext() : RefCountedContext("ArgumentListCont p = new Private; } -ArgumentListContext::ArgumentListContext(const ArgumentList *list, +ArgumentListContext::ArgumentListContext(const ArgumentList &list, const Definition *def,const QCString &relPath) : RefCountedContext("ArgumentListContext") { p = new Private; - if (list) + for (const Argument &arg : list) { - ArgumentListIterator ali(*list); - const Argument *arg; - for (ali.toFirst();(arg=ali.current());++ali) - { - p->addArgument(arg,def,relPath); - } + p->addArgument(arg,def,relPath); } } diff --git a/src/context.h b/src/context.h index ecd1227..fc1278b 100644 --- a/src/context.h +++ b/src/context.h @@ -1138,7 +1138,7 @@ class AllMembersListContext : public RefCountedContext, public TemplateListIntf class ArgumentContext : public RefCountedContext, public TemplateStructIntf { public: - static ArgumentContext *alloc(const Argument *arg,const Definition *def,const QCString &relPath) + static ArgumentContext *alloc(const Argument &arg,const Definition *def,const QCString &relPath) { return new ArgumentContext(arg,def,relPath); } // TemplateStructIntf methods @@ -1147,7 +1147,7 @@ class ArgumentContext : public RefCountedContext, public TemplateStructIntf virtual int release() { return RefCountedContext::release(); } private: - ArgumentContext(const Argument *arg,const Definition *def,const QCString &relPath); + ArgumentContext(const Argument &arg,const Definition *def,const QCString &relPath); ~ArgumentContext(); class Private; Private *p; @@ -1159,7 +1159,7 @@ class ArgumentListContext : public RefCountedContext, public TemplateListIntf { public: static ArgumentListContext *alloc() { return new ArgumentListContext; } - static ArgumentListContext *alloc(const ArgumentList *al,const Definition *def,const QCString &relPath) + static ArgumentListContext *alloc(const ArgumentList &al,const Definition *def,const QCString &relPath) { return new ArgumentListContext(al,def,relPath); } // TemplateListIntf @@ -1171,7 +1171,7 @@ class ArgumentListContext : public RefCountedContext, public TemplateListIntf private: ArgumentListContext(); - ArgumentListContext(const ArgumentList *al,const Definition *def,const QCString &relPath); + ArgumentListContext(const ArgumentList &al,const Definition *def,const QCString &relPath); ~ArgumentListContext(); class Private; Private *p; diff --git a/src/defargs.h b/src/defargs.h index 34a19a2..1b08671 100644 --- a/src/defargs.h +++ b/src/defargs.h @@ -21,7 +21,7 @@ class ArgumentList; class QCString; -extern void stringToArgumentList(const char *argsString,ArgumentList* argList, +extern void stringToArgumentList(const char *argsString,ArgumentList& argList, QCString *extraTypeChars=0); #endif diff --git a/src/defargs.l b/src/defargs.l index 070103a..a213688 100644 --- a/src/defargs.l +++ b/src/defargs.l @@ -387,12 +387,12 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" int i=l-1; while (i>=0 && (isspace((uchar)g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--; while (i>=0 && (isId(g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='$')) i--; - Argument *a = new Argument; - a->attrib = g_curArgAttrib.copy(); - a->typeConstraint = g_curTypeConstraint.stripWhiteSpace(); + Argument a; + a.attrib = g_curArgAttrib.copy(); + a.typeConstraint = g_curTypeConstraint.stripWhiteSpace(); //printf("a->type=%s a->name=%s i=%d l=%d\n", // a->type.data(),a->name.data(),i,l); - a->array.resize(0); + a.array.resize(0); if (i==l-1 && g_curArgTypeName.at(i)==')') // function argument { int bi=g_curArgTypeName.find('('); @@ -401,67 +401,67 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" while (fi>=0 && (isId(g_curArgTypeName.at(fi)) || g_curArgTypeName.at(fi)==':')) fi--; if (fi>=0) { - a->type = g_curArgTypeName.left(fi+1); - a->name = g_curArgTypeName.mid(fi+1,bi-fi-1).stripWhiteSpace(); - a->array = g_curArgTypeName.right(l-bi); + a.type = g_curArgTypeName.left(fi+1); + a.name = g_curArgTypeName.mid(fi+1,bi-fi-1).stripWhiteSpace(); + a.array = g_curArgTypeName.right(l-bi); } else { - a->type = g_curArgTypeName; + a.type = g_curArgTypeName; } } else if (i>=0 && g_curArgTypeName.at(i)!=':') { // type contains a name - a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1)).stripWhiteSpace(); - a->name = g_curArgTypeName.right(l-i-1).stripWhiteSpace(); + a.type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1)).stripWhiteSpace(); + a.name = g_curArgTypeName.right(l-i-1).stripWhiteSpace(); // if the type becomes a type specifier only then we make a mistake // and need to correct it to avoid seeing a nameless parameter // "struct A" as a parameter with type "struct" and name "A". int sv=0; - if (a->type.left(6)=="const ") sv=6; - else if (a->type.left(9)=="volatile ") sv=9; + if (a.type.left(6)=="const ") sv=6; + else if (a.type.left(9)=="volatile ") sv=9; - if (a->type.mid(sv)=="struct" || - a->type.mid(sv)=="union" || - a->type.mid(sv)=="class" || - a->type.mid(sv)=="typename" || - nameIsActuallyPartOfType(a->name) + if (a.type.mid(sv)=="struct" || + a.type.mid(sv)=="union" || + a.type.mid(sv)=="class" || + a.type.mid(sv)=="typename" || + nameIsActuallyPartOfType(a.name) ) { - a->type = a->type + " " + a->name; - a->name.resize(0); + a.type = a.type + " " + a.name; + a.name.resize(0); } //printf(" --> a->type='%s' a->name='%s'\n",a->type.data(),a->name.data()); } else // assume only the type was specified, try to determine name later { - a->type = removeRedundantWhiteSpace(g_curArgTypeName); + a.type = removeRedundantWhiteSpace(g_curArgTypeName); } - if (!a->type.isEmpty() && a->type.at(0)=='$') // typeless PHP name? + if (!a.type.isEmpty() && a.type.at(0)=='$') // typeless PHP name? { - a->name = a->type; - a->type = ""; + a.name = a.type; + a.type = ""; } - a->array += removeRedundantWhiteSpace(g_curArgArray); + a.array += removeRedundantWhiteSpace(g_curArgArray); //printf("array=%s\n",a->array.data()); - int alen = a->array.length(); - if (alen>2 && a->array.at(0)=='(' && - a->array.at(alen-1)==')') // fix-up for int *(a[10]) + int alen = a.array.length(); + if (alen>2 && a.array.at(0)=='(' && + a.array.at(alen-1)==')') // fix-up for int *(a[10]) { - int i=a->array.find('[')-1; - a->array = a->array.mid(1,alen-2); - if (i>0 && a->name.isEmpty()) + int i=a.array.find('[')-1; + a.array = a.array.mid(1,alen-2); + if (i>0 && a.name.isEmpty()) { - a->name = a->array.left(i).stripWhiteSpace(); - a->array = a->array.mid(i); + a.name = a.array.left(i).stripWhiteSpace(); + a.array = a.array.mid(i); } } - a->defval = g_curArgDefValue.copy(); + a.defval = g_curArgDefValue.copy(); //printf("a->type=%s a->name=%s a->defval=\"%s\"\n",a->type.data(),a->name.data(),a->defval.data()); - a->docs = g_curArgDocs.stripWhiteSpace(); + a.docs = g_curArgDocs.stripWhiteSpace(); //printf("Argument '%s' '%s' adding docs='%s'\n",a->type.data(),a->name.data(),a->docs.data()); - g_argList->append(a); + g_argList->push_back(a); } g_curArgAttrib.resize(0); g_curArgTypeName.resize(0); @@ -601,9 +601,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" * for complex types are written to */ -void stringToArgumentList(const char *argsString,ArgumentList* al,QCString *extraTypeChars) +void stringToArgumentList(const char *argsString,ArgumentList& al,QCString *extraTypeChars) { - if (al==0) return; if (argsString==0) return; printlex(yy_flex_debug, TRUE, __FILE__, NULL); @@ -623,10 +622,14 @@ void stringToArgumentList(const char *argsString,ArgumentList* al,QCString *extr g_curArgTypeName.resize(0); g_curArgDefValue.resize(0); g_curArgName.resize(0); - g_argList = al; + g_argList = &al; defargsYYrestart( defargsYYin ); BEGIN( Start ); defargsYYlex(); + if (g_argList->empty()) + { + g_argList->noParameters = TRUE; + } if (extraTypeChars) *extraTypeChars=g_extraTypeChars; //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data()); printlex(yy_flex_debug, FALSE, __FILE__, NULL); diff --git a/src/defgen.cpp b/src/defgen.cpp index aa9a1da..f5e12aa 100644 --- a/src/defgen.cpp +++ b/src/defgen.cpp @@ -144,71 +144,66 @@ void generateDEFForMember(MemberDef *md, if (isFunc) //function { - ArgumentList *declAl = new ArgumentList; - const ArgumentList *defAl = md->argumentList(); + const ArgumentList &defAl = md->argumentList(); + ArgumentList declAl; stringToArgumentList(md->argsString(),declAl); QCString fcnPrefix = " " + memPrefix + "param-"; - if (defAl && declAl->count()>0) + auto defIt = defAl.begin(); + for (const Argument &a : declAl) { - ArgumentListIterator declAli(*declAl); - ArgumentListIterator defAli(*defAl); - Argument *a; - for (declAli.toFirst();(a=declAli.current());++declAli) + const Argument *defArg = 0; + if (defIt!=defAl.end()) { - Argument *defArg = defAli.current(); - t << memPrefix << "param = {" << endl; - if (!a->attrib.isEmpty()) - { - t << fcnPrefix << "attributes = "; - writeDEFString(t,a->attrib); - t << ';' << endl; - } - if (!a->type.isEmpty()) - { - t << fcnPrefix << "type = <<_EnD_oF_dEf_TeXt_" << endl - << a->type << endl << "_EnD_oF_dEf_TeXt_;" << endl; - } - if (!a->name.isEmpty()) - { - t << fcnPrefix << "declname = "; - writeDEFString(t,a->name); - t << ';' << endl; - } - if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name) - { - t << fcnPrefix << "defname = "; - writeDEFString(t,defArg->name); - t << ';' << endl; - } - if (!a->array.isEmpty()) - { - t << fcnPrefix << "array = "; - writeDEFString(t,a->array); - t << ';' << endl; - } - if (!a->defval.isEmpty()) - { - t << fcnPrefix << "defval = <<_EnD_oF_dEf_TeXt_" << endl - << a->defval << endl << "_EnD_oF_dEf_TeXt_;" << endl; - } - if (defArg) ++defAli; - t << " }; /*" << fcnPrefix << "-param */" << endl; + defArg = &(*defIt); + ++defIt; } + t << memPrefix << "param = {" << endl; + if (!a.attrib.isEmpty()) + { + t << fcnPrefix << "attributes = "; + writeDEFString(t,a.attrib); + t << ';' << endl; + } + if (!a.type.isEmpty()) + { + t << fcnPrefix << "type = <<_EnD_oF_dEf_TeXt_" << endl + << a.type << endl << "_EnD_oF_dEf_TeXt_;" << endl; + } + if (!a.name.isEmpty()) + { + t << fcnPrefix << "declname = "; + writeDEFString(t,a.name); + t << ';' << endl; + } + if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name) + { + t << fcnPrefix << "defname = "; + writeDEFString(t,defArg->name); + t << ';' << endl; + } + if (!a.array.isEmpty()) + { + t << fcnPrefix << "array = "; + writeDEFString(t,a.array); + t << ';' << endl; + } + if (!a.defval.isEmpty()) + { + t << fcnPrefix << "defval = <<_EnD_oF_dEf_TeXt_" << endl + << a.defval << endl << "_EnD_oF_dEf_TeXt_;" << endl; + } + t << " }; /*" << fcnPrefix << "-param */" << endl; } - delete declAl; } else if ( md->memberType()==MemberType_Define && md->argsString()!=0) { - ArgumentListIterator ali(*md->argumentList()); - Argument *a; QCString defPrefix = " " + memPrefix + "def-"; - - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : md->argumentList()) { t << memPrefix << "param = {" << endl; - t << defPrefix << "name = '" << a->type << "';" << endl; + t << defPrefix << "name = '" << a.type << "';" << endl; t << " }; /*" << defPrefix << "-param */" << endl; } } diff --git a/src/definition.cpp b/src/definition.cpp index 3b5fea1..b44f2d1 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -420,7 +420,7 @@ void DefinitionImpl::setId(const char *id) m_impl->id = id; if (Doxygen::clangUsrMap) { - //printf("DefinitionImpl::setId '%s'->'%s'\n",id,m_name.data()); + //printf("DefinitionImpl::setId '%s'->'%s'\n",id,m_impl->name.data()); Doxygen::clangUsrMap->insert(id,this); } } diff --git a/src/docparser.cpp b/src/docparser.cpp index 5253b04..4c6d2f8 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -413,12 +413,12 @@ static void checkArgumentName(const QCString &name) { if (!Config_getBool(WARN_IF_DOC_ERROR)) return; if (g_memberDef==0) return; // not a member - const ArgumentList *al=g_memberDef->isDocsForDefinition() ? + const ArgumentList &al=g_memberDef->isDocsForDefinition() ? g_memberDef->argumentList() : g_memberDef->declArgumentList(); SrcLangExt lang = g_memberDef->getLanguage(); //printf("isDocsForDefinition()=%d\n",g_memberDef->isDocsForDefinition()); - if (al==0) return; // no argument list + if (al.empty()) return; // no argument list static QRegExp re("$?[a-zA-Z0-9_\\x80-\\xFF]+\\.*"); int p=0,i=0,l; @@ -427,12 +427,10 @@ static void checkArgumentName(const QCString &name) QCString aName=name.mid(i,l); if (lang==SrcLangExt_Fortran) aName=aName.lower(); //printf("aName='%s'\n",aName.data()); - ArgumentListIterator ali(*al); - const Argument *a; bool found=FALSE; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : al) { - QCString argName = g_memberDef->isDefine() ? a->type : a->name; + QCString argName = g_memberDef->isDefine() ? a.type : a.name; if (lang==SrcLangExt_Fortran) argName=argName.lower(); argName=argName.stripWhiteSpace(); //printf("argName='%s' aName=%s\n",argName.data(),aName.data()); @@ -460,7 +458,6 @@ static void checkArgumentName(const QCString &name) inheritedMd->docLine(),qPrint(inheritedMd->docFile())); docFile = g_memberDef->getDefFileName(); docLine = g_memberDef->getDefLine(); - } QCString alStr = argListToString(al); warn_doc_error(docFile,docLine, @@ -500,28 +497,26 @@ static void checkUnOrMultipleDocumentedParams() { if (g_memberDef && g_hasParamCommand && Config_getBool(WARN_IF_DOC_ERROR)) { - const ArgumentList *al=g_memberDef->isDocsForDefinition() ? + const ArgumentList &al=g_memberDef->isDocsForDefinition() ? g_memberDef->argumentList() : g_memberDef->declArgumentList(); SrcLangExt lang = g_memberDef->getLanguage(); - if (al!=0) + if (!al.empty()) { - ArgumentListIterator ali(*al); - const Argument *a; bool found=FALSE; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a: al) { int count = 0; - QCString argName = g_memberDef->isDefine() ? a->type : a->name; + QCString argName = g_memberDef->isDefine() ? a.type : a.name; if (lang==SrcLangExt_Fortran) argName = argName.lower(); argName=argName.stripWhiteSpace(); QCString aName = argName; if (argName.right(3)=="...") argName=argName.left(argName.length()-3); if (lang==SrcLangExt_Python && (argName=="self" || argName=="cls")) - { + { // allow undocumented self / cls parameter for Python } - else if (!argName.isEmpty() && g_paramsFound.find(argName)==0 && a->docs.isEmpty()) + else if (!argName.isEmpty() && g_paramsFound.find(argName)==0 && a.docs.isEmpty()) { found = TRUE; } @@ -552,16 +547,16 @@ static void checkUnOrMultipleDocumentedParams() QCString(g_memberDef->qualifiedName()) + QCString(argListToString(al)) + " are not documented:\n"; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : al) { - QCString argName = g_memberDef->isDefine() ? a->type : a->name; + QCString argName = g_memberDef->isDefine() ? a.type : a.name; if (lang==SrcLangExt_Fortran) argName = argName.lower(); argName=argName.stripWhiteSpace(); if (lang==SrcLangExt_Python && (argName=="self" || argName=="cls")) - { + { // allow undocumented self / cls parameter for Python } - else if (!argName.isEmpty() && g_paramsFound.find(argName)==0) + else if (!argName.isEmpty() && g_paramsFound.find(argName)==0) { if (!first) { diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 7b3c7d9..8ef124e 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -294,7 +294,7 @@ void statistics() static void addMemberDocs(const Entry *root,MemberDef *md, const char *funcDecl, - ArgumentList *al,bool over_load,uint64 spec); + const ArgumentList *al,bool over_load,uint64 spec); static void findMember(const Entry *root, const QCString &relates, const QCString &type, @@ -464,21 +464,18 @@ static void addSTLClass(const std::unique_ptr &root,const STLInfo *info) // add template arguments to class if (info->templType1) { - ArgumentList *al = new ArgumentList; - Argument *a=new Argument; - a->type="typename"; - a->name=info->templType1; - al->append(a); + ArgumentList al; + Argument a; + a.type="typename"; + a.name=info->templType1; + al.push_back(a); if (info->templType2) // another template argument { - a=new Argument; - a->type="typename"; - a->name=info->templType2; - al->append(a); + a.type="typename"; + a.name=info->templType2; + al.push_back(a); } - classEntry->tArgLists = new QList; - classEntry->tArgLists->setAutoDelete(TRUE); - classEntry->tArgLists->append(al); + classEntry->tArgLists.push_back(al); } // add member variables if (info->templName1) @@ -1105,17 +1102,15 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr return resultScope; } -ArgumentList *getTemplateArgumentsFromName( +ArgumentList getTemplateArgumentsFromName( const QCString &name, - const QList *tArgLists) + const std::vector &tArgLists) { - if (tArgLists==0) return 0; - - QListIterator ali(*tArgLists); // for each scope fragment, check if it is a template and advance through // the list if so. int i,p=0; - while ((i=name.find("::",p))!=-1) + auto alIt = tArgLists.begin(); + while ((i=name.find("::",p))!=-1 && alIt!=tArgLists.end()) { NamespaceDef *nd = Doxygen::namespaceSDict->find(name.left(i)); if (nd==0) @@ -1123,15 +1118,15 @@ ArgumentList *getTemplateArgumentsFromName( ClassDef *cd = getClass(name.left(i)); if (cd) { - if (cd->templateArguments()) + if (!cd->templateArguments().empty()) { - ++ali; + ++alIt; } } } p=i+2; } - return ali.current(); + return alIt!=tArgLists.end() ? *alIt : ArgumentList(); } static @@ -1240,13 +1235,12 @@ static void addClassToContext(const Entry *root) } //cd->setName(fullName); // change name to match docs - if (cd->templateArguments()==0 || (cd->isForwardDeclared() && (root->spec&Entry::ForwardDecl)==0)) + if (cd->templateArguments().empty() || (cd->isForwardDeclared() && (root->spec&Entry::ForwardDecl)==0)) { // this happens if a template class declared with @class is found // before the actual definition or if a forward declaration has different template // parameter names. - ArgumentList *tArgList = - getTemplateArgumentsFromName(cd->name(),root->tArgLists); + ArgumentList tArgList = getTemplateArgumentsFromName(cd->name(),root->tArgLists); cd->setTemplateArguments(tArgList); } @@ -1280,12 +1274,11 @@ static void addClassToContext(const Entry *root) buildScopeFromQualifiedName(fullName,fullName.contains("::"),root->lang,tagInfo); } } - ArgumentList *tArgList = 0; + ArgumentList tArgList; if ((root->lang==SrcLangExt_CSharp || root->lang==SrcLangExt_Java) && (i=fullName.find('<'))!=-1) { // a Java/C# generic class looks like a C++ specialization, so we need to split the // name and template arguments here - tArgList = new ArgumentList; stringToArgumentList(fullName.mid(i),tArgList); fullName=fullName.left(i); } @@ -1296,7 +1289,7 @@ static void addClassToContext(const Entry *root) cd=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 ? (int)root->tArgLists->count() : -1, tagInfo); + qPrint(fullName),sec,root->tArgLists.size(), tagInfo); cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); cd->setLanguage(root->lang); @@ -1561,7 +1554,7 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC md->typeString(),md->name(),md->argsString(),md->excpString(), md->protection(),md->virtualness(),md->isStatic(),Member, md->memberType(), - 0,0,""); + ArgumentList(),ArgumentList(),""); imd->setMemberClass(cd); imd->setDocumentation(md->documentation(),md->docFile(),md->docLine()); imd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine()); @@ -2055,7 +2048,7 @@ static void findUsingDeclarations(const Entry *root) if (usingCd==0) // definition not in the input => add an artificial class { Debug::print(Debug::Classes,0," New using class '%s' (sec=0x%08x)! #tArgLists=%d\n", - qPrint(name),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1); + qPrint(name),root->section,root->tArgLists.size()); usingCd = createClassDef( "",1,1, name, @@ -2135,8 +2128,8 @@ static void findUsingDeclImports(const Entry *root) { fileName = root->tagInfo->tagName; } - const ArgumentList *templAl = md->templateArguments(); - const ArgumentList *al = md->templateArguments(); + const ArgumentList &templAl = md->templateArguments(); + const ArgumentList &al = md->templateArguments(); newMd = createMemberDef( fileName,root->startLine,root->startColumn, md->typeString(),memName,md->argsString(), @@ -2336,7 +2329,8 @@ static MemberDef *addVariableToClass( fileName,root->startLine,root->startColumn, type,name,args,root->exception, prot,Normal,root->stat,related, - mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0, root->metaData); + mtype,!root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(), + ArgumentList(), root->metaData); md->setTagInfo(root->tagInfo); md->setMemberClass(cd); // also sets outer scope (i.e. getOuterScope()) //md->setDefFile(root->fileName); @@ -2595,7 +2589,8 @@ static MemberDef *addVariableToFile( fileName,root->startLine,root->startColumn, type,name,args,0, root->protection, Normal,root->stat,Member, - mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0, root->metaData); + mtype,!root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(), + ArgumentList(), root->metaData); md->setTagInfo(root->tagInfo); md->setMemberSpecifiers(root->spec); md->setDocumentation(root->doc,root->docFile,root->docLine); @@ -2739,19 +2734,16 @@ static bool isVarWithConstructor(const Entry *root) // we need to rely on heuristics :-( { //printf("typeIsClass\n"); - ArgumentList *al = root->argList; - if (al==0 || al->isEmpty()) + if (root->argList.empty()) { result=FALSE; // empty arg list -> function prototype. goto done; } - ArgumentListIterator ali(*al); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : root->argList) { - if (!a->name.isEmpty() || !a->defval.isEmpty()) + if (!a.name.isEmpty() || !a.defval.isEmpty()) { - if (a->name.find(initChars)==0) + if (a.name.find(initChars)==0) { result=TRUE; } @@ -2761,31 +2753,31 @@ static bool isVarWithConstructor(const Entry *root) } goto done; } - if (a->type.isEmpty() || getResolvedClass(ctx,fd,a->type)!=0) + if (a.type.isEmpty() || getResolvedClass(ctx,fd,a.type)!=0) { result=FALSE; // arg type is a known type goto done; } - if (checkIfTypedef(ctx,fd,a->type)) + if (checkIfTypedef(ctx,fd,a.type)) { //printf("%s:%d: false (arg is typedef)\n",__FILE__,__LINE__); result=FALSE; // argument is a typedef goto done; } - if (a->type.at(a->type.length()-1)=='*' || - a->type.at(a->type.length()-1)=='&') + if (a.type.at(a.type.length()-1)=='*' || + a.type.at(a.type.length()-1)=='&') // type ends with * or & => pointer or reference { result=FALSE; goto done; } - if (a->type.find(initChars)==0) + if (a.type.find(initChars)==0) { result=TRUE; // argument type starts with typical initializer char goto done; } - QCString resType=resolveTypeDef(ctx,a->type); - if (resType.isEmpty()) resType=a->type; + QCString resType=resolveTypeDef(ctx,a.type); + if (resType.isEmpty()) resType=a.type; int len; if (idChars.match(resType,0,&len)==0) // resType starts with identifier { @@ -3129,7 +3121,7 @@ static void addInterfaceOrServiceToServiceOrSingleton( MemberDef *const md = createMemberDef( fileName, root->startLine, root->startColumn, root->type, rname, "", "", root->protection, root->virt, root->stat, Member, - type, 0, root->argList, root->metaData); + type, ArgumentList(), root->argList, root->metaData); md->setTagInfo(root->tagInfo); md->setMemberClass(cd); md->setDocumentation(root->doc,root->docFile,root->docLine); @@ -3206,7 +3198,7 @@ static void buildInterfaceAndServiceList(const Entry *root) qPrint(root->fileName), root->startLine, root->bodyLine, - root->tArgLists ? (int)root->tArgLists->count() : -1, + root->tArgLists.size(), root->mGrpId, root->spec, root->proto, @@ -3317,7 +3309,8 @@ static void addMethodToClass(const Entry *root,ClassDef *cd, stat && root->relatesType != MemberOf, relates.isEmpty() ? Member : root->relatesType == MemberOf ? Foreign : Related, - mtype,root->tArgLists ? root->tArgLists->getLast() : 0,root->argList, root->metaData); + mtype,!root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(), + root->argList, root->metaData); md->setTagInfo(root->tagInfo); md->setMemberClass(cd); md->setDocumentation(root->doc,root->docFile,root->docLine); @@ -3347,54 +3340,27 @@ static void addMethodToClass(const Entry *root,ClassDef *cd, // for PHP we use Class::method and Namespace\method scopeSeparator="::"; } +// QCString optArgs = root->argList.empty() ? args : QCString(); if (!relates.isEmpty() || isFriend || Config_getBool(HIDE_SCOPE_NAMES)) { if (!type.isEmpty()) { - if (root->argList) - { - def=type+" "+name; - } - else - { - def=type+" "+name+args; - } + def=type+" "+name; //+optArgs; } else { - if (root->argList) - { - def=name; - } - else - { - def=name+args; - } + def=name; //+optArgs; } } else { if (!type.isEmpty()) { - if (root->argList) - { - def=type+" "+qualScope+scopeSeparator+name; - } - else - { - def=type+" "+qualScope+scopeSeparator+name+args; - } + def=type+" "+qualScope+scopeSeparator+name; //+optArgs; } else { - if (root->argList) - { - def=qualScope+scopeSeparator+name; - } - else - { - def=qualScope+scopeSeparator+name+args; - } + def=qualScope+scopeSeparator+name; //+optArgs; } } if (def.left(7)=="friend ") def=def.right(def.length()-7); @@ -3457,7 +3423,7 @@ static void buildFunctionList(const Entry *root) qPrint(root->fileName), root->startLine, root->bodyLine, - root->tArgLists ? (int)root->tArgLists->count() : -1, + root->tArgLists.size(), root->mGrpId, root->spec, root->proto, @@ -3577,16 +3543,16 @@ static void buildFunctionList(const Entry *root) if (rnd) rnsName = rnd->name().copy(); //printf("matching arguments for %s%s %s%s\n", // md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data()); - ArgumentList *mdAl = md->argumentList(); - const ArgumentList *mdTempl = md->templateArguments(); + ArgumentList &mdAl = md->argumentList(); + const ArgumentList &mdTempl = md->templateArguments(); // in case of template functions, we need to check if the // functions have the same number of template parameters bool sameNumTemplateArgs = TRUE; bool matchingReturnTypes = TRUE; - if (mdTempl!=0 && root->tArgLists) + if (!mdTempl.empty() && !root->tArgLists.empty()) { - if (mdTempl->count()!=root->tArgLists->getLast()->count()) + if (mdTempl.size()!=root->tArgLists.back().size()) { sameNumTemplateArgs = FALSE; } @@ -3634,11 +3600,12 @@ static void buildFunctionList(const Entry *root) if (found) { // merge argument lists - mergeArguments(mdAl,root->argList,!root->doc.isEmpty()); + ArgumentList mergedArgList = root->argList; + mergeArguments(mdAl,mergedArgList,!root->doc.isEmpty()); // merge documentation if (md->documentation().isEmpty() && !root->doc.isEmpty()) { - ArgumentList *argList = new ArgumentList; + ArgumentList argList; stringToArgumentList(root->args,argList); if (root->proto) { @@ -3712,13 +3679,14 @@ static void buildFunctionList(const Entry *root) // root->type.data(),rname.data(),root->args.data(),root->bodyLine); // new global function - ArgumentList *tArgList = root->tArgLists ? root->tArgLists->getLast() : 0; QCString name=removeRedundantWhiteSpace(rname); md=createMemberDef( root->fileName,root->startLine,root->startColumn, root->type,name,root->args,root->exception, root->protection,root->virt,root->stat,Member, - MemberType_Function,tArgList,root->argList,root->metaData); + MemberType_Function, + !root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(), + root->argList,root->metaData); md->setTagInfo(root->tagInfo); md->setLanguage(root->lang); @@ -3762,27 +3730,14 @@ static void buildFunctionList(const Entry *root) } QCString def; + //QCString optArgs = root->argList.empty() ? QCString() : root->args; if (!root->type.isEmpty()) { - if (root->argList) - { - def=root->type+" "+scope+name; - } - else - { - def=root->type+" "+scope+name+root->args; - } + def=root->type+" "+scope+name; //+optArgs; } else { - if (root->argList) - { - def=scope+name.copy(); - } - else - { - def=scope+name+root->args; - } + def=scope+name; //+optArgs; } Debug::print(Debug::Functions,0, " Global Function:\n" @@ -3906,8 +3861,8 @@ static void findFriends() ) // if the member is related and the arguments match then the // function is actually a friend. { - ArgumentList *mmdAl = mmd->argumentList(); - ArgumentList *fmdAl = fmd->argumentList(); + ArgumentList &mmdAl = mmd->argumentList(); + ArgumentList &fmdAl = fmd->argumentList(); mergeArguments(mmdAl,fmdAl); if (!fmd->documentation().isEmpty()) { @@ -4023,8 +3978,8 @@ static void transferFunctionReferences() } if (mdef && mdec) { - ArgumentList *mdefAl = mdef->argumentList(); - ArgumentList *mdecAl = mdec->argumentList(); + ArgumentList &mdefAl = mdef->argumentList(); + ArgumentList &mdecAl = mdec->argumentList(); if ( matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl, mdec->getOuterScope(),mdec->getFileDef(),mdecAl, @@ -4144,31 +4099,26 @@ static void transferRelatedFunctionDocumentation() * Example: A template class A with template arguments * that inherits from B will have T and S in the dictionary. */ -static QDict *getTemplateArgumentsInName(ArgumentList *templateArguments,const QCString &name) +static QDict *getTemplateArgumentsInName(const ArgumentList &templateArguments,const QCString &name) { QDict *templateNames = new QDict(17); templateNames->setAutoDelete(TRUE); static QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*"); - if (templateArguments) + int count=0; + for (const Argument &arg : templateArguments) { - ArgumentListIterator ali(*templateArguments); - Argument *arg; - int count=0; - for (ali.toFirst();(arg=ali.current());++ali,count++) + int i,p=0,l; + while ((i=re.match(name,p,&l))!=-1) { - int i,p=0,l; - while ((i=re.match(name,p,&l))!=-1) + QCString n = name.mid(i,l); + if (n==arg.name) { - QCString n = name.mid(i,l); - if (n==arg->name) + if (templateNames->find(n)==0) { - if (templateNames->find(n)==0) - { - templateNames->insert(n,new int(count)); - } + templateNames->insert(n,new int(count)); } - p=i+l; } + p=i+l; } } return templateNames; @@ -4219,12 +4169,12 @@ static void findUsedClassesForClass(const Entry *root, ClassDef *masterCd, ClassDef *instanceCd, bool isArtificial, - ArgumentList *actualArgs=0, + const ArgumentList &actualArgs=ArgumentList(), QDict *templateNames=0 ) { masterCd->setVisited(TRUE); - ArgumentList *formalArgs = masterCd->templateArguments(); + const ArgumentList &formalArgs = masterCd->templateArguments(); if (masterCd->memberNameInfoSDict()) { MemberNameInfoSDict::Iterator mnili(*masterCd->memberNameInfoSDict()); @@ -4250,10 +4200,7 @@ static void findUsedClassesForClass(const Entry *root, QCString templSpec; bool found=FALSE; // the type can contain template variables, replace them if present - if (actualArgs) - { - type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs); - } + type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs); //printf(" template substitution gives=%s\n",type.data()); while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec,root->lang)!=-1) @@ -4293,37 +4240,32 @@ static void findUsedClassesForClass(const Entry *root, BaseInfo bi(usedName,Public,Normal); findClassRelation(root,context,instanceCd,&bi,templateNames,TemplateInstances,isArtificial); - if (masterCd->templateArguments()) + int count=0; + for (const Argument &arg : masterCd->templateArguments()) { - ArgumentListIterator ali(*masterCd->templateArguments()); - Argument *arg; - int count=0; - for (ali.toFirst();(arg=ali.current());++ali,++count) + if (arg.name==usedName) // type is a template argument { - if (arg->name==usedName) // type is a template argument - { - found=TRUE; - Debug::print(Debug::Classes,0," New used class '%s'\n", qPrint(usedName)); + found=TRUE; + Debug::print(Debug::Classes,0," New used class '%s'\n", qPrint(usedName)); - ClassDef *usedCd = Doxygen::hiddenClasses->find(usedName); - if (usedCd==0) - { - usedCd = 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())); - instanceCd->addUsedClass(usedCd,md->name(),md->protection()); - usedCd->addUsedByClass(instanceCd,md->name(),md->protection()); + ClassDef *usedCd = Doxygen::hiddenClasses->find(usedName); + if (usedCd==0) + { + usedCd = 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())); + instanceCd->addUsedClass(usedCd,md->name(),md->protection()); + usedCd->addUsedByClass(instanceCd,md->name(),md->protection()); } } @@ -4390,14 +4332,14 @@ static void findBaseClassesForClass( ClassDef *instanceCd, FindBaseClassRelation_Mode mode, bool isArtificial, - ArgumentList *actualArgs=0, + const ArgumentList &actualArgs=ArgumentList(), QDict *templateNames=0 ) { //if (masterCd->visited) return; masterCd->setVisited(TRUE); // The base class could ofcouse also be a non-nested class - ArgumentList *formalArgs = masterCd->templateArguments(); + const ArgumentList &formalArgs = masterCd->templateArguments(); QListIterator bii(*root->extends); BaseInfo *bi=0; for (bii.toFirst();(bi=bii.current());++bii) @@ -4411,10 +4353,7 @@ static void findBaseClassesForClass( delTempNames=TRUE; } BaseInfo tbi(bi->name,bi->prot,bi->virt); - if (actualArgs) // substitute the formal template arguments of the base class - { - tbi.name = substituteTemplateArgumentsInString(bi->name,formalArgs,actualArgs); - } + tbi.name = substituteTemplateArgumentsInString(bi->name,formalArgs,actualArgs); //printf("bi->name=%s tbi.name=%s\n",bi->name.data(),tbi.name.data()); if (mode==DocumentedOnly) @@ -4492,14 +4431,13 @@ static bool findTemplateInstanceRelation(const Entry *root, const Entry *templateRoot = it->second; Debug::print(Debug::Classes,0," template root found %s templSpec=%s!\n", qPrint(templateRoot->name),qPrint(templSpec)); - ArgumentList *templArgs = new ArgumentList; + ArgumentList templArgs; stringToArgumentList(templSpec,templArgs); findBaseClassesForClass(templateRoot,context,templateClass,instanceClass, TemplateInstances,isArtificial,templArgs,templateNames); findUsedClassesForClass(templateRoot,context,templateClass,instanceClass, isArtificial,templArgs,templateNames); - delete templArgs; } else { @@ -5107,7 +5045,7 @@ static void computeTemplateClassRelations() { Debug::print(Debug::Classes,0," Template instance %s : \n",qPrint(tcd->name())); QCString templSpec = tdi.currentKey(); - ArgumentList *templArgs = new ArgumentList; + ArgumentList templArgs; stringToArgumentList(templSpec,templArgs); QList *baseList=root->extends; QListIterator it(*baseList); @@ -5116,8 +5054,8 @@ static void computeTemplateClassRelations() { // check if the base class is a template argument BaseInfo tbi(bi->name,bi->prot,bi->virt); - ArgumentList *tl = cd->templateArguments(); - if (tl) + const ArgumentList &tl = cd->templateArguments(); + if (!tl.empty()) { QDict *baseClassNames = tcd->getTemplateBaseClassNames(); QDict *templateNames = getTemplateArgumentsInName(tl,bi->name); @@ -5129,18 +5067,20 @@ static void computeTemplateClassRelations() for (qdi.toFirst();qdi.current();++qdi) { int templIndex = *qdi.current(); - Argument *actArg = 0; - if (templIndex<(int)templArgs->count()) + Argument actArg; + bool hasActArg=FALSE; + if (templIndex<(int)templArgs.size()) { - actArg=templArgs->at(templIndex); + actArg=templArgs.at(templIndex); + hasActArg=TRUE; } - if (actArg!=0 && + if (hasActArg && baseClassNames!=0 && - baseClassNames->find(actArg->type)!=0 && - actualTemplateNames->find(actArg->type)==0 + baseClassNames->find(actArg.type)!=0 && + actualTemplateNames->find(actArg.type)==0 ) { - actualTemplateNames->insert(actArg->type,new int(templIndex)); + actualTemplateNames->insert(actArg.type,new int(templIndex)); } } delete templateNames; @@ -5155,7 +5095,6 @@ static void computeTemplateClassRelations() delete actualTemplateNames; } } - delete templArgs; } // class has no base classes } } @@ -5294,13 +5233,13 @@ static void generateXRefPages() static void addMemberDocs(const Entry *root, MemberDef *md, const char *funcDecl, - ArgumentList *al, + const ArgumentList *al, bool over_load, uint64 spec ) { - //printf("addMemberDocs: '%s'::'%s' '%s' funcDecl='%s' mSpec=%d\n", - // root->parent->name.data(),md->name().data(),md->argsString(),funcDecl,spec); + //printf("addMemberDocs: '%s'::'%s' '%s' funcDecl='%s' mSpec=%lld\n", + // root->parent()->name.data(),md->name().data(),md->argsString(),funcDecl,spec); QCString fDecl=funcDecl; // strip extern specifier fDecl.stripPrefix("extern "); @@ -5324,11 +5263,12 @@ static void addMemberDocs(const Entry *root, // TODO determine scope based on root not md Definition *rscope = md->getOuterScope(); - ArgumentList *mdAl = md->argumentList(); + ArgumentList &mdAl = md->argumentList(); if (al) { + ArgumentList mergedAl = *al; //printf("merging arguments (1) docs=%d\n",root->doc.isEmpty()); - mergeArguments(mdAl,al,!root->doc.isEmpty()); + mergeArguments(mdAl,mergedAl,!root->doc.isEmpty()); } else { @@ -5340,7 +5280,8 @@ static void addMemberDocs(const Entry *root, ) { //printf("merging arguments (2)\n"); - mergeArguments(mdAl,root->argList,!root->doc.isEmpty()); + ArgumentList mergedArgList = root->argList; + mergeArguments(mdAl,mergedArgList,!root->doc.isEmpty()); } } if (over_load) // the \overload keyword was used @@ -5511,9 +5452,9 @@ static bool findGlobalMember(const Entry *root, NamespaceDef *rnd = 0; if (!namespaceName.isEmpty()) rnd = Doxygen::namespaceSDict->find(namespaceName); - const ArgumentList *mdAl = const_cast(md)->argumentList(); + const ArgumentList &mdAl = const_cast(md)->argumentList(); bool matching= - (mdAl==0 && root->argList->count()==0) || + (mdAl.empty() && root->argList.empty()) || md->isVariable() || md->isTypedef() || /* in case of function pointers */ matchArguments2(md->getOuterScope(),const_cast(md)->getFileDef(),mdAl, rnd ? rnd : Doxygen::globalScope,fd,root->argList, @@ -5522,15 +5463,12 @@ static bool findGlobalMember(const Entry *root, // for template members we need to check if the number of // template arguments is the same, otherwise we are dealing with // different functions. - if (matching && root->tArgLists) + if (matching && !root->tArgLists.empty()) { - const ArgumentList *mdTempl = md->templateArguments(); - if (mdTempl) + const ArgumentList &mdTempl = md->templateArguments(); + if (root->tArgLists.back().size()!=mdTempl.size()) { - if (root->tArgLists->getLast()->count()!=mdTempl->count()) - { - matching=FALSE; - } + matching=FALSE; } } @@ -5550,11 +5488,11 @@ static bool findGlobalMember(const Entry *root, } // for template member we also need to check the return type - if (md->templateArguments()!=0 && root->tArgLists!=0) + if (!md->templateArguments().empty() && !root->tArgLists.empty()) { //printf("Comparing return types '%s'<->'%s'\n", // md->typeString(),type); - if (md->templateArguments()->count()!=root->tArgLists->getLast()->count() || + if (md->templateArguments().size()!=root->tArgLists.back().size() || qstrcmp(md->typeString(),type)!=0) { //printf(" ---> no matching\n"); @@ -5565,7 +5503,7 @@ static bool findGlobalMember(const Entry *root, if (matching) // add docs to the member { Debug::print(Debug::FindMembers,0,"5. Match found\n"); - addMemberDocs(root,md->resolveAlias(),decl,root->argList,FALSE,root->spec); + addMemberDocs(root,md->resolveAlias(),decl,&root->argList,FALSE,root->spec); found=TRUE; } } @@ -5573,7 +5511,7 @@ static bool findGlobalMember(const Entry *root, if (!found && root->relatesType != Duplicate && root->section==Entry::FUNCTION_SEC) // no match { QCString fullFuncDecl=decl; - if (root->argList) fullFuncDecl+=argListToString(root->argList,TRUE); + if (!root->argList.empty()) fullFuncDecl+=argListToString(root->argList,TRUE); QCString warnMsg = QCString("no matching file member found for \n")+substitute(fullFuncDecl,"%","%%"); if (mn->count()>0) @@ -5609,17 +5547,17 @@ static bool findGlobalMember(const Entry *root, } static bool isSpecialization( - const QList &srcTempArgLists, - const QList &dstTempArgLists + const std::vector &srcTempArgLists, + const std::vector &dstTempArgLists ) { - QListIterator srclali(srcTempArgLists); - QListIterator dstlali(dstTempArgLists); - for (;srclali.current();++srclali,++dstlali) + auto srcIt = srcTempArgLists.begin(); + auto dstIt = dstTempArgLists.begin(); + while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end()) { - ArgumentList *sal = srclali.current(); - ArgumentList *dal = dstlali.current(); - if (!(sal && dal && sal->count()==dal->count())) return TRUE; + if ((*srcIt).size()!=(*dstIt).size()) return TRUE; + ++srcIt; + ++dstIt; } return FALSE; } @@ -5629,15 +5567,15 @@ static bool scopeIsTemplate(const Definition *d) bool result=FALSE; if (d && d->definitionType()==Definition::TypeClass) { - result = (dynamic_cast(d))->templateArguments() || scopeIsTemplate(d->getOuterScope()); + result = !(dynamic_cast(d))->templateArguments().empty() || + scopeIsTemplate(d->getOuterScope()); } return result; } static QCString substituteTemplatesInString( - const QList &srcTempArgLists, - const QList &dstTempArgLists, - ArgumentList *funcTempArgList, // can be used to match template specializations + const std::vector &srcTempArgLists, + const std::vector &dstTempArgLists, const QCString &src ) { @@ -5651,61 +5589,59 @@ static QCString substituteTemplatesInString( dst+=src.mid(p,i-p); QCString name=src.mid(i,l); - QListIterator srclali(srcTempArgLists); - QListIterator dstlali(dstTempArgLists); - for (;srclali.current() && !found;++srclali,++dstlali) + auto srcIt = srcTempArgLists.begin(); + auto dstIt = dstTempArgLists.begin(); + while (srcIt!=srcTempArgLists.end() && !found) { - ArgumentListIterator tsali(*srclali.current()); - ArgumentListIterator tdali(*dstlali.current()); - ArgumentListIterator *fali=0; - Argument *tsa =0,*tda=0, *fa=0; - if (funcTempArgList) + const ArgumentList *tdAli = 0; + std::vector::const_iterator tdaIt; + if (dstIt!=dstTempArgLists.end()) { - fali = new ArgumentListIterator(*funcTempArgList); - fa = fali->current(); + tdAli = &(*dstIt); + tdaIt = tdAli->begin(); + ++dstIt; } - for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali) + const ArgumentList &tsaLi = *srcIt; + for (auto tsaIt = tsaLi.begin(); tsaIt!=tsaLi.end() && !found; ++tsaIt) { - tda = tdali.current(); + Argument tsa = *tsaIt; + const Argument *tda = 0; + if (tdAli && tdaIt!=tdAli->end()) + { + tda = &(*tdaIt); + ++tdaIt; + } //if (tda) printf("tsa=%s|%s tda=%s|%s\n", - // tsa->type.data(),tsa->name.data(), + // tsa.type.data(),tsa.name.data(), // tda->type.data(),tda->name.data()); - if (name==tsa->name) + if (name==tsa.name) { if (tda && tda->name.isEmpty()) { + QCString tdaName = tda->name; + QCString tdaType = tda->type; int vc=0; - if (tda->type.left(6)=="class ") vc=6; - else if (tda->type.left(9)=="typename ") vc=9; + if (tdaType.left(6)=="class ") vc=6; + else if (tdaType.left(9)=="typename ") vc=9; if (vc>0) // convert type=="class T" to type=="class" name=="T" { - tda->name = tda->type.mid(vc); - tda->type = tda->type.left(vc-1); + tdaName = tdaType.mid(vc); + } + if (!tdaName.isEmpty()) + { + name=tdaName; // substitute + found=TRUE; } - } - if (tda && !tda->name.isEmpty()) - { - name=tda->name; // substitute - found=TRUE; - } - else if (fa) - { - name=fa->type; - found=TRUE; } } - if (tda) - ++tdali; - else if (fali) - { ++(*fali); fa=fali->current(); } } - delete fali; //printf(" srcList='%s' dstList='%s faList='%s'\n", // argListToString(srclali.current()).data(), // argListToString(dstlali.current()).data(), // funcTempArgList ? argListToString(funcTempArgList).data() : ""); + ++srcIt; } dst+=name; p=i+l; @@ -5717,48 +5653,39 @@ static QCString substituteTemplatesInString( } static void substituteTemplatesInArgList( - const QList &srcTempArgLists, - const QList &dstTempArgLists, - ArgumentList *src, - ArgumentList *dst, - ArgumentList *funcTempArgs = 0 + const std::vector &srcTempArgLists, + const std::vector &dstTempArgLists, + const ArgumentList &src, + ArgumentList &dst ) { - ArgumentListIterator sali(*src); - ArgumentListIterator dali(*dst); - Argument *sa=0; - Argument *da=dali.current(); - - for (sali.toFirst();(sa=sali.current());++sali) // for each member argument + auto dstIt = dst.begin(); + for (const Argument &sa : src) { - QCString dstType = substituteTemplatesInString( - srcTempArgLists,dstTempArgLists,funcTempArgs, - sa->type); - QCString dstArray = substituteTemplatesInString( - srcTempArgLists,dstTempArgLists,funcTempArgs, - sa->array); - if (da==0) + QCString dstType = substituteTemplatesInString(srcTempArgLists,dstTempArgLists,sa.type); + QCString dstArray = substituteTemplatesInString(srcTempArgLists,dstTempArgLists,sa.array); + if (dstIt == dst.end()) { - da=new Argument(*sa); - dst->append(da); - da->type=dstType; - da->array=dstArray; - da=0; + Argument da = sa; + da.type = dstType; + da.array = dstArray; + dst.push_back(da); + dstIt = dst.end(); } else { - da->type=dstType; - da->type=dstArray; - ++dali; - da=dali.current(); + Argument da = *dstIt; + da.type = dstType; + da.array = dstArray; + ++dstIt; } } - dst->constSpecifier = src->constSpecifier; - dst->volatileSpecifier = src->volatileSpecifier; - dst->pureSpecifier = src->pureSpecifier; - dst->trailingReturnType = substituteTemplatesInString( + dst.constSpecifier = src.constSpecifier; + dst.volatileSpecifier = src.volatileSpecifier; + dst.pureSpecifier = src.pureSpecifier; + dst.trailingReturnType = substituteTemplatesInString( srcTempArgLists,dstTempArgLists, - funcTempArgs,src->trailingReturnType); + src.trailingReturnType); //printf("substituteTemplatesInArgList: replacing %s with %s\n", // argListToString(src).data(),argListToString(dst).data() // ); @@ -5786,10 +5713,10 @@ static void findMember(const Entry *root, { Debug::print(Debug::FindMembers,0, "findMember(root=%p,funcDecl='%s',related='%s',overload=%d," - "isFunc=%d mGrpId=%d tArgList=%p (#=%d) " + "isFunc=%d mGrpId=%d #tArgList=%d " "spec=%lld lang=%x\n", root,qPrint(funcDecl),qPrint(relates),overloaded,isFunc,root->mGrpId, - root->tArgLists,root->tArgLists ? root->tArgLists->count() : 0, + root->tArgLists.size(), root->spec,root->lang ); @@ -5946,9 +5873,8 @@ static void findMember(const Entry *root, // empty while funcSpec is not empty we assume this is a // specialization of a method. If not, we clear the funcSpec and treat // this as a normal method of a template class. - if (!(root->tArgLists && - root->tArgLists->count()>0 && - root->tArgLists->getFirst()->count()==0 + if (!(root->tArgLists.size()>0 && + root->tArgLists.front().size()==0 ) ) { @@ -5995,7 +5921,7 @@ static void findMember(const Entry *root, if (funcSpec.isEmpty()) { int argListIndex=0; - tempScopeName=cd->qualifiedNameWithTemplateParameters(root->tArgLists,&argListIndex); + tempScopeName=cd->qualifiedNameWithTemplateParameters(&root->tArgLists,&argListIndex); } else { @@ -6145,39 +6071,33 @@ static void findMember(const Entry *root, "4. class definition %s found\n",cd->name().data()); // get the template parameter lists found at the member declaration - QList declTemplArgs; - cd->getTemplateParameterLists(declTemplArgs); - const ArgumentList *templAl = md->templateArguments(); - if (templAl) + std::vector declTemplArgs = cd->getTemplateParameterLists(); + const ArgumentList &templAl = md->templateArguments(); + if (!templAl.empty()) { - declTemplArgs.append(templAl); + declTemplArgs.push_back(templAl); } // get the template parameter lists found at the member definition - QList *defTemplArgs = root->tArgLists; + const std::vector &defTemplArgs = root->tArgLists; //printf("defTemplArgs=%p\n",defTemplArgs); // do we replace the decl argument lists with the def argument lists? bool substDone=FALSE; - ArgumentList *argList=0; + ArgumentList argList; /* substitute the occurrences of class template names in the * argument list before matching */ - ArgumentList *mdAl = md->argumentList(); - if (declTemplArgs.count()>0 && defTemplArgs && - declTemplArgs.count()==defTemplArgs->count() && - mdAl - ) + const ArgumentList &mdAl = md->argumentList(); + if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size()) { /* the function definition has template arguments * and the class definition also has template arguments, so * we must substitute the template names of the class by that * of the function definition before matching. */ - argList = new ArgumentList; - substituteTemplatesInArgList(declTemplArgs,*defTemplArgs, - mdAl,argList); + substituteTemplatesInArgList(declTemplArgs,defTemplArgs,mdAl,argList); substDone=TRUE; } @@ -6194,7 +6114,7 @@ static void findMember(const Entry *root, bool matching= md->isVariable() || md->isTypedef() || // needed for function pointers - (mdAl==0 && root->argList->count()==0) || + (mdAl.empty() && root->argList.empty()) || matchArguments2( md->getClassDef(),md->getFileDef(),argList, cd,fd,root->argList, @@ -6206,7 +6126,7 @@ static void findMember(const Entry *root, } // for template member we also need to check the return type - if (md->templateArguments()!=0 && root->tArgLists!=0) + if (!md->templateArguments().empty() && !root->tArgLists.empty()) { QCString memType = md->typeString(); memType.stripPrefix("static "); // see bug700696 @@ -6217,8 +6137,8 @@ static void findMember(const Entry *root, Debug::print(Debug::FindMembers,0, "5b. Comparing return types '%s'<->'%s' #args %d<->%d\n", qPrint(md->typeString()),qPrint(funcType), - md->templateArguments()->count(),root->tArgLists->getLast()->count()); - if (md->templateArguments()->count()!=root->tArgLists->getLast()->count() || + md->templateArguments().size(),root->tArgLists.back().size()); + if (md->templateArguments().size()!=root->tArgLists.back().size() || qstrcmp(memType,funcType)) { //printf(" ---> no matching\n"); @@ -6227,9 +6147,9 @@ static void findMember(const Entry *root, } bool rootIsUserDoc = (root->section&Entry::MEMBERDOC_SEC)!=0; bool classIsTemplate = scopeIsTemplate(md->getClassDef()); - bool mdIsTemplate = md->templateArguments()!=0; + bool mdIsTemplate = md->templateArguments().hasParameters(); bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate; - bool rootIsTemplate = root->tArgLists!=0; + bool rootIsTemplate = !root->tArgLists.empty(); //printf("classIsTemplate=%d mdIsTemplate=%d rootIsTemplate=%d\n",classIsTemplate,mdIsTemplate,rootIsTemplate); if (!rootIsUserDoc && // don't check out-of-line @fn references, see bug722457 (mdIsTemplate || rootIsTemplate) && // either md or root is a template @@ -6245,19 +6165,19 @@ static void findMember(const Entry *root, Debug::print(Debug::FindMembers,0, - "6. match results of matchArguments2 = %d\n",matching); + "6. match results of matchArguments2 = %d substDone=%d\n",matching,substDone); if (substDone) // found a new argument list { if (matching) // replace member's argument list { md->setDefinitionTemplateParameterLists(root->tArgLists); - md->setArgumentList(argList); // new owner of the list => no delete + md->setArgumentList(argList); } else // no match { if (!funcTempList.isEmpty() && - isSpecialization(declTemplArgs,*defTemplArgs)) + isSpecialization(declTemplArgs,defTemplArgs)) { // check if we are dealing with a partial template // specialization. In this case we add it to the class @@ -6267,7 +6187,6 @@ static void findMember(const Entry *root, md->protection(),md->isStatic(),md->virtualness(),spec,relates); return; } - delete argList; } } if (matching) @@ -6303,9 +6222,9 @@ static void findMember(const Entry *root, //printf("ccd->name()==%s className=%s\n",ccd->name().data(),className.data()); if (ccd!=0 && rightScopeMatch(ccd->name(),className)) { - const ArgumentList *templAl = md->templateArguments(); - if (root->tArgLists && templAl!=0 && - root->tArgLists->getLast()->count()<=templAl->count()) + const ArgumentList &templAl = md->templateArguments(); + if (!root->tArgLists.empty() && !templAl.empty() && + root->tArgLists.back().size()<=templAl.size()) { Debug::print(Debug::FindMembers,0,"7. add template specialization\n"); addMethodToClass(root,ccd,type,md->name(),args,isFriend, @@ -6356,17 +6275,13 @@ static void findMember(const Entry *root, if (noMatchCount>1) warnMsg+="uniquely "; warnMsg+="matching class member found for \n"; - if (root->tArgLists) + for (const ArgumentList &al : root->tArgLists) { - QListIterator alli(*root->tArgLists); - ArgumentList *al; - for (;(al=alli.current());++alli) - { - warnMsg+=" template "; - warnMsg+=tempArgListToString(al,root->lang); - warnMsg+='\n'; - } + warnMsg+=" template "; + warnMsg+=tempArgListToString(al,root->lang); + warnMsg+='\n'; } + QCString fullFuncDecl=funcDecl.copy(); if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE); @@ -6382,8 +6297,8 @@ static void findMember(const Entry *root, const ClassDef *cd=md->getClassDef(); if (cd!=0 && rightScopeMatch(cd->name(),className)) { - const ArgumentList *templAl = md->templateArguments(); - if (templAl!=0) + const ArgumentList &templAl = md->templateArguments(); + if (templAl.hasParameters()) { warnMsg+=" 'template "; warnMsg+=tempArgListToString(templAl,root->lang); @@ -6430,7 +6345,7 @@ static void findMember(const Entry *root, } } MemberType mtype=MemberType_Function; - ArgumentList *tArgList = new ArgumentList; + ArgumentList tArgList; // getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists); md=createMemberDef( root->fileName,root->startLine,root->startColumn, @@ -6464,7 +6379,6 @@ static void findMember(const Entry *root, mn->append(md); cd->insertMember(md); md->setRefItems(root->sli); - delete tArgList; } else { @@ -6499,7 +6413,7 @@ static void findMember(const Entry *root, else mtype=MemberType_Function; // new overloaded member function - ArgumentList *tArgList = + ArgumentList tArgList = getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists); //printf("new related member %s args='%s'\n",md->name().data(),funcArgs.data()); MemberDef *md=createMemberDef( @@ -6590,7 +6504,7 @@ static void findMember(const Entry *root, MemberDef *rmd; while ((rmd=mni.current()) && newMember) // see if we got another member with matching arguments { - ArgumentList *rmdAl = rmd->argumentList(); + const ArgumentList &rmdAl = rmd->argumentList(); newMember= className!=rmd->getOuterScope()->name() || @@ -6645,8 +6559,9 @@ static void findMember(const Entry *root, root->stat && !isMemberOf, isMemberOf ? Foreign : Related, mtype, - (root->tArgLists ? root->tArgLists->getLast() : 0), - funcArgs.isEmpty() ? 0 : root->argList,root->metaData); + (!root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList()), + funcArgs.isEmpty() ? ArgumentList() : root->argList, + root->metaData); if (isDefine && mdDefine) { @@ -6685,7 +6600,7 @@ static void findMember(const Entry *root, const MemberDef *rmd; while ((rmd=rmni.current()) && !found) // see if we got another member with matching arguments { - const ArgumentList *rmdAl = rmd->argumentList(); + const ArgumentList &rmdAl = rmd->argumentList(); // check for matching argument lists if ( matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl, @@ -6786,7 +6701,7 @@ localObjCMethod: root->fileName,root->startLine,root->startColumn, funcType,funcName,funcArgs,exceptions, root->protection,root->virt,root->stat,Member, - MemberType_Function,0,root->argList,root->metaData); + MemberType_Function,ArgumentList(),root->argList,root->metaData); md->setTagInfo(root->tagInfo); md->setLanguage(root->lang); md->setId(root->id); @@ -7141,7 +7056,7 @@ static void findEnums(const Entry *root) root->protection,Normal,FALSE, isMemberOf ? Foreign : isRelated ? Related : Member, MemberType_Enumeration, - 0,0,root->metaData); + ArgumentList(),ArgumentList(),root->metaData); md->setTagInfo(root->tagInfo); md->setLanguage(root->lang); md->setId(root->id); @@ -7357,7 +7272,7 @@ static void addEnumValuesToEnums(const Entry *root) fileName,e->startLine,e->startColumn, e->type,e->name,e->args,0, e->protection, Normal,e->stat,Member, - MemberType_EnumValue,0,0,e->metaData); + MemberType_EnumValue,ArgumentList(),ArgumentList(),e->metaData); if (md->getClassDef()) fmd->setMemberClass(md->getClassDef()); else if (md->getNamespaceDef()) fmd->setNamespace(md->getNamespaceDef()); else if (md->getFileDef()) fmd->setFileDef(md->getFileDef()); @@ -7755,8 +7670,8 @@ static void computeMemberRelations() mcd->isBaseClass(bmcd,TRUE)) { //printf(" derived scope\n"); - ArgumentList *bmdAl = bmd->argumentList(); - ArgumentList *mdAl = md->argumentList(); + const ArgumentList &bmdAl = bmd->argumentList(); + const ArgumentList &mdAl = md->argumentList(); //printf(" Base argList='%s'\n Super argList='%s'\n", // argListToString(bmdAl.pointer()).data(), // argListToString(mdAl.pointer()).data() @@ -8591,7 +8506,8 @@ static void findDefineDocumentation(Entry *root) { MemberDef *md=createMemberDef(root->tagInfo->tagName,1,1, "#define",root->name,root->args,0, - Public,Normal,FALSE,Member,MemberType_Define,0,0,""); + Public,Normal,FALSE,Member,MemberType_Define, + ArgumentList(),ArgumentList(),""); md->setTagInfo(root->tagInfo); md->setLanguage(root->lang); //printf("Searching for '%s' fd=%p\n",filePathName.data(),fd); diff --git a/src/entry.cpp b/src/entry.cpp index 8ec7846..e700fab 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -43,11 +43,7 @@ Entry::Entry() groups = new QList; groups->setAutoDelete(TRUE); anchors = new QList; // Doxygen::sectionDict takes ownership of the items! - argList = new ArgumentList; - argList->setAutoDelete(TRUE); //printf("Entry::Entry() tArgList=0\n"); - tArgLists = 0; - typeConstr = 0; mGrpId = -1; tagInfo = 0; sli = 0; @@ -81,8 +77,8 @@ Entry::Entry(const Entry &e) virt = e.virt; args = e.args; bitfields = e.bitfields; - argList = e.argList->deepCopy(); - tArgLists = 0; + argList = e.argList; + tArgLists = e.tArgLists; program = e.program; initializer = e.initializer; includeFile = e.includeFile; @@ -102,7 +98,7 @@ Entry::Entry(const Entry &e) write = e.write; inside = e.inside; exception = e.exception; - typeConstr = 0; + typeConstr = e.typeConstr; bodyLine = e.bodyLine; endBodyLine = e.endBodyLine; mGrpId = e.mGrpId; @@ -167,18 +163,6 @@ Entry::Entry(const Entry &e) anchors->append(s); // shallow copy, object are owned by Doxygen::sectionDict } - // deep copy type constraint list - if (e.typeConstr) - { - typeConstr = e.typeConstr->deepCopy(); - } - - // deep copy template argument lists - if (e.tArgLists) - { - tArgLists = copyArgumentLists(e.tArgLists); - } - m_fileDef = e.m_fileDef; } @@ -192,10 +176,7 @@ Entry::~Entry() delete extends; delete groups; delete anchors; - delete argList; - delete tArgLists; delete tagInfo; - delete typeConstr; delete sli; num--; } @@ -324,12 +305,12 @@ void Entry::reset() extends->clear(); groups->clear(); anchors->clear(); - argList->clear(); + argList.clear(); + tArgLists.clear(); + argList.reset(); + typeConstr.reset(); if (tagInfo) { delete tagInfo; tagInfo=0; } - if (tArgLists) { delete tArgLists; tArgLists=0; } if (sli) { delete sli; sli=0; } - if (typeConstr) { delete typeConstr; typeConstr=0; } - //if (mtArgList) { delete mtArgList; mtArgList=0; } m_fileDef = 0; } diff --git a/src/entry.h b/src/entry.h index c078936..12bd897 100644 --- a/src/entry.h +++ b/src/entry.h @@ -18,20 +18,20 @@ #ifndef ENTRY_H #define ENTRY_H -#include "types.h" - #include #include #include #include +#include "types.h" +#include "arguments.h" + struct SectionInfo; class QFile; class FileDef; class FileStorage; class StorageIntf; -class ArgumentList; struct ListItemInfo; /** This class stores information about an inheritance relation @@ -268,8 +268,8 @@ class Entry Specifier virt; //!< virtualness of the entry QCString args; //!< member argument string QCString bitfields; //!< member's bit fields - ArgumentList *argList; //!< member arguments as a list - QList *tArgLists; //!< template argument declarations + ArgumentList argList; //!< member arguments as a list + std::vector tArgLists; //!< template argument declarations QGString program; //!< the program text QGString initializer; //!< initial value (for variables) QCString includeFile; //!< include file (2 arg of \\class, must be unique) @@ -289,7 +289,7 @@ class Entry QCString write; //!< property write accessor QCString inside; //!< name of the class in which documents are found QCString exception; //!< throw specification - ArgumentList *typeConstr; //!< where clause (C#) for type constraints + ArgumentList typeConstr; //!< where clause (C#) for type constraints int bodyLine; //!< line number of the definition in the source int endBodyLine; //!< line number where the definition ends int mGrpId; //!< member group id diff --git a/src/fortranscanner.l b/src/fortranscanner.l index d7eefd6..7fa9426 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -181,7 +181,7 @@ static Specifier virt; static QCString debugStr; static QCString result; // function result -static Argument *parameter; // element of parameter list +static Argument *parameter; // element of parameter list static QCString argType; // fortran type of an argument of a parameter list static QCString argName; // last identifier name in variable list static QCString initializer; // initial value of a variable @@ -1141,9 +1141,11 @@ private { } {COMMA}|{BS} { current->args += yytext; CommentInPrepass *c = locatePrepassComment(yyColNr-(int)yyleng, yyColNr); - if (c!=NULL) { - if(current->argList->count()>0) { - current->argList->at(current->argList->count()-1)->docs = c->str; + if (c!=NULL) + { + if (!current->argList.empty()) + { + current->argList.back().docs = c->str; } } } @@ -1152,15 +1154,13 @@ private { QCString param = yytext; // std::cout << "3=========> got parameter " << param << std::endl; current->args += param; - Argument *arg = new Argument; - arg->name = param; - arg->type = ""; - current->argList->append(arg); + Argument arg; + arg.name = param; + current->argList.push_back(arg); } {NOARGS} { newLine(); //printf("3=========> without parameterlist \n"); - //current->argList = ; addCurrentEntry(true); startScope(last_entry); BEGIN(SubprogBody); @@ -1280,9 +1280,9 @@ private { { "("|")"|","|{BS_} { current->args += yytext; } {ID} { current->args += yytext; - Argument *a = new Argument; - a->name = QCString(yytext).lower(); - current->argList->append(a); + Argument a; + a.name = QCString(yytext).lower(); + current->argList.push_back(a); } } @@ -1787,8 +1787,7 @@ static void copyEntry(Entry *dest, const std::unique_ptr &src) dest->bodyLine = src->bodyLine; dest->endBodyLine = src->endBodyLine; dest->args = src->args; - delete dest->argList; - dest->argList = new ArgumentList(*src->argList); + dest->argList = src->argList; dest->doc = src->doc; dest->brief = src->brief; } @@ -2011,14 +2010,13 @@ SymbolModifiers& SymbolModifiers::operator|=(QCString mdfStringArg) static Argument *findArgument(Entry* subprog, QCString name, bool byTypeName = FALSE) { QCString cname(name.lower()); - for (unsigned int i=0; iargList->count(); i++) + for (Argument &arg : subprog->argList) { - Argument *arg = subprog->argList->at(i); - if ((!byTypeName && arg->name.lower() == cname) || - (byTypeName && arg->type.lower() == cname) + if ((!byTypeName && arg.name.lower() == cname) || + (byTypeName && arg.type.lower() == cname) ) { - return arg; + return &arg; } } return 0; @@ -2212,7 +2210,9 @@ static bool endScope(Entry *scope, bool isGlobalRoot) Argument *arg = findArgument(scope, it.key()); if (arg) + { applyModifiers(arg, it.data()); + } } // find return type for function @@ -2384,7 +2384,7 @@ static void addSubprogram(const char *text) current->bodyLine = yyLineNr; // used for source reference start of body of routine current->startLine = yyLineNr; // used for source reference start of definition current->args.resize(0); - current->argList->clear(); + current->argList.clear(); docBlock.resize(0); } @@ -2439,18 +2439,15 @@ static void addInterface(QCString name, InterfaceType type) /*! Get the argument \a name. */ -static Argument* getParameter(const QCString &name) +static Argument *getParameter(const QCString &name) { // std::cout<<"addFortranParameter(): "<argList==0) return 0; - ArgumentListIterator ali(*current_root->argList); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (Argument &a:current_root->argList) { - if (a->name.lower()==name.lower()) + if (a.name.lower()==name.lower()) { - ret=a; + ret=&a; //printf("parameter found: %s\n",(const char*)name); break; } diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 00e42d7..bcdb3d0 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -396,15 +396,13 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly) (srcMd->getOuterScope()->definitionType()==Definition::TypeFile && md->getOuterScope()->definitionType()==Definition::TypeFile); - const ArgumentList *srcMdAl = srcMd->argumentList(); - const ArgumentList *mdAl = md->argumentList(); - const ArgumentList *tSrcMdAl = srcMd->templateArguments(); - const ArgumentList *tMdAl = md->templateArguments(); - + const ArgumentList &srcMdAl = srcMd->argumentList(); + const ArgumentList &mdAl = md->argumentList(); + const ArgumentList &tSrcMdAl = srcMd->templateArguments(); + const ArgumentList &tMdAl = md->templateArguments(); + if (srcMd->isFunction() && md->isFunction() && // both are a function - ((tSrcMdAl==0 && tMdAl==0) || - (tSrcMdAl!=0 && tMdAl!=0 && tSrcMdAl->count()==tMdAl->count()) - ) && // same number of template arguments + (tSrcMdAl.size()==tMdAl.size()) && // same number of template arguments matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl, md->getOuterScope(),md->getFileDef(),mdAl, TRUE diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 4f44baa..28c0abb 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -54,8 +54,8 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef MemberDefImpl(const char *defFileName,int defLine,int defColumn, const char *type,const char *name,const char *args, const char *excp,Protection prot,Specifier virt,bool stat, - Relationship related,MemberType t,const ArgumentList *tal, - const ArgumentList *al,const char *metaData); + Relationship related,MemberType t,const ArgumentList &tal, + const ArgumentList &al,const char *metaData); virtual ~MemberDefImpl(); virtual DefType definitionType() const { return TypeMember; } @@ -202,11 +202,11 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef virtual bool hasExamples() const; virtual ExampleSDict *getExamples() const; virtual bool isPrototype() const; - virtual const ArgumentList *argumentList() const; - virtual ArgumentList *argumentList(); - virtual const ArgumentList *declArgumentList() const; - virtual const ArgumentList *templateArguments() const; - virtual const QList *definitionTemplateParameterLists() const; + virtual const ArgumentList &argumentList() const; + virtual ArgumentList &argumentList(); + virtual const ArgumentList &declArgumentList() const; + virtual const ArgumentList &templateArguments() const; + virtual const std::vector &definitionTemplateParameterLists() const; virtual int getMemberGroupId() const; virtual MemberGroup *getMemberGroup() const; virtual bool fromAnonymousScope() const; @@ -233,7 +233,7 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef virtual QCString displayName(bool=TRUE) const; virtual QCString getDeclType() const; virtual void getLabels(QStrList &sl,const Definition *container) const; - virtual const ArgumentList *typeConstraints() const; + virtual const ArgumentList &typeConstraints() const; virtual QCString documentation() const; virtual QCString briefDescription(bool abbr=FALSE) const; virtual QCString fieldType() const; @@ -276,10 +276,10 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef virtual void setPrototype(bool p,const QCString &df,int line, int column); virtual void setExplicitExternal(bool b,const QCString &df,int line,int column); virtual void setDeclFile(const QCString &df,int line,int column); - virtual void setArgumentList(ArgumentList *al); - virtual void setDeclArgumentList(ArgumentList *al); - virtual void setDefinitionTemplateParameterLists(QList *lists); - virtual void setTypeConstraints(ArgumentList *al); + virtual void setArgumentList(const ArgumentList &al); + virtual void setDeclArgumentList(const ArgumentList &al); + virtual void setDefinitionTemplateParameterLists(const std::vector &lists); + virtual void setTypeConstraints(const ArgumentList &al); virtual void setType(const char *t); virtual void setAccessorType(ClassDef *cd,const char *t); virtual void setNamespace(NamespaceDef *nd); @@ -324,8 +324,8 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef virtual void warnIfUndocumented() const; virtual void warnIfUndocumentedParams() const; virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const; - virtual MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs, - ArgumentList *actualArgs) const; + virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs, + const ArgumentList &actualArgs) const; virtual void findSectionsInDocumentation(); virtual void writeLink(OutputList &ol, const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd, @@ -367,8 +367,8 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn, const char *type,const char *name,const char *args, const char *excp,Protection prot,Specifier virt,bool stat, - Relationship related,MemberType t,const ArgumentList *tal, - const ArgumentList *al,const char *metaData) + Relationship related,MemberType t,const ArgumentList &tal, + const ArgumentList &al,const char *metaData) { return new MemberDefImpl(defFileName,defLine,defColumn,type,name,args,excp,prot,virt, stat,related,t,tal,al,metaData); @@ -661,13 +661,13 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef { return getMdAlias()->getExamples(); } virtual bool isPrototype() const { return getMdAlias()->isPrototype(); } - virtual const ArgumentList *argumentList() const + virtual const ArgumentList &argumentList() const { return getMdAlias()->argumentList(); } - virtual const ArgumentList *declArgumentList() const + virtual const ArgumentList &declArgumentList() const { return getMdAlias()->declArgumentList(); } - virtual const ArgumentList *templateArguments() const + virtual const ArgumentList &templateArguments() const { return getMdAlias()->templateArguments(); } - virtual const QList *definitionTemplateParameterLists() const + virtual const std::vector &definitionTemplateParameterLists() const { return getMdAlias()->definitionTemplateParameterLists(); } virtual int getMemberGroupId() const { return getMdAlias()->getMemberGroupId(); } @@ -721,7 +721,7 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef { return getMdAlias()->getDeclType(); } virtual void getLabels(QStrList &sl,const Definition *container) const { return getMdAlias()->getLabels(sl,container); } - virtual const ArgumentList *typeConstraints() const + virtual const ArgumentList &typeConstraints() const { return getMdAlias()->typeConstraints(); } virtual QCString documentation() const { return getMdAlias()->documentation(); } @@ -747,8 +747,10 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef { err("non-const getNamespaceDef() called on aliased member. Please report as a bug.\n"); return 0; } virtual GroupDef *getGroupDef() { err("non-const getGroupDef() called on aliased member. Please report as a bug.\n"); return 0; } - virtual ArgumentList *argumentList() - { err("non-const argumentList() called on aliased member. Please report as bug.\n"); return 0; } + virtual ArgumentList &argumentList() + { err("non-const argumentList() called on aliased member. Please report as bug.\n"); + static ArgumentList dummy; return dummy; + } virtual void setEnumBaseType(const QCString &type) {} virtual void setMemberType(MemberType t) {} @@ -786,10 +788,10 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef virtual void setPrototype(bool p,const QCString &df,int line, int column) {} virtual void setExplicitExternal(bool b,const QCString &df,int line,int column) {} virtual void setDeclFile(const QCString &df,int line,int column) {} - virtual void setArgumentList(ArgumentList *al) {} - virtual void setDeclArgumentList(ArgumentList *al) {} - virtual void setDefinitionTemplateParameterLists(QList *lists) {} - virtual void setTypeConstraints(ArgumentList *al) {} + virtual void setArgumentList(const ArgumentList &al) {} + virtual void setDeclArgumentList(const ArgumentList &al) {} + virtual void setDefinitionTemplateParameterLists(const std::vector &lists) {} + virtual void setTypeConstraints(const ArgumentList &al) {} virtual void setType(const char *t) {} virtual void setAccessorType(ClassDef *cd,const char *t) {} virtual void setNamespace(NamespaceDef *nd) {} @@ -821,8 +823,8 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef virtual void setHidden(bool b) {} virtual void addToSearchIndex() const {} virtual void findSectionsInDocumentation() {} - virtual MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs, - ArgumentList *actualArgs) const + virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs, + const ArgumentList &actualArgs) const { return getMdAlias()->createTemplateInstanceMember(formalArgs,actualArgs); } virtual void incrementFlowKeyWordCount() {} @@ -934,10 +936,10 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const MemberDef *md) { - const ArgumentList *defArgList=(md->isDocsForDefinition()) ? + const ArgumentList &defArgList=(md->isDocsForDefinition()) ? md->argumentList() : md->declArgumentList(); //printf("writeDefArgumentList '%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition()); - if (defArgList==0 || md->isProperty()) + if (!defArgList.hasParameters() || md->isProperty()) { return FALSE; // member has no function like argument list } @@ -945,23 +947,21 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me // simple argument list for tcl if (md->getLanguage()==SrcLangExt_Tcl) { - if (defArgList->count()==0) return FALSE; - ArgumentListIterator ali(*defArgList); - Argument *a; + if (defArgList.empty()) return FALSE; ol.endMemberDocName(); ol.startParameterList(FALSE); ol.startParameterType(TRUE,0); ol.endParameterType(); ol.startParameterName(FALSE); - for (;(a=ali.current());++ali) + for (const Argument &a : defArgList) { - if (a->defval.isEmpty()) + if (a.defval.isEmpty()) { - ol.docify(a->name+" "); + ol.docify(a.name+" "); } else { - ol.docify("?"+a->name+"? "); + ol.docify("?"+a.name+"? "); } } ol.endParameterName(TRUE,FALSE,FALSE); @@ -1008,9 +1008,10 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me cName=cName.mid(il,ir-il+1); //printf("1. cName=%s\n",cName.data()); } - else if (scope->definitionType()==Definition::TypeClass && (dynamic_cast(scope))->templateArguments()) + else if (scope->definitionType()==Definition::TypeClass) { - cName=tempArgListToString((dynamic_cast(scope))->templateArguments(),scope->getLanguage()); + cName=tempArgListToString((dynamic_cast(scope))->templateArguments(), + scope->getLanguage()); //printf("2. cName=%s\n",cName.data()); } else // no template specifier @@ -1023,10 +1024,10 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me bool first=TRUE; bool paramTypeStarted=FALSE; bool isDefine = md->isDefine(); - ArgumentListIterator ali(*defArgList); - Argument *a=ali.current(); - while (a) + auto alIt = defArgList.begin(); + while (alIt!=defArgList.end()) { + Argument a = *alIt; if (isDefine || first) { ol.startParameterType(first,0); @@ -1038,30 +1039,30 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me } } QRegExp re(")("),res("(.*\\*"); - int vp=a->type.find(re); - int wp=a->type.find(res); + int vp=a.type.find(re); + int wp=a.type.find(res); // use the following to put the function pointer type before the name bool hasFuncPtrType=FALSE; - if (!a->attrib.isEmpty() && !md->isObjCMethod()) // argument has an IDL attribute + if (!a.attrib.isEmpty() && !md->isObjCMethod()) // argument has an IDL attribute { - ol.docify(a->attrib+" "); + ol.docify(a.attrib+" "); } if (hasFuncPtrType) // argument type is a function pointer { - //printf("a->type='%s' a->name='%s'\n",a->type.data(),a->name.data()); - QCString n=a->type.left(vp); - if (hasFuncPtrType) n=a->type.left(wp); + //printf("a.type='%s' a.name='%s'\n",a.type.data(),a.name.data()); + QCString n=a.type.left(vp); + if (hasFuncPtrType) n=a.type.left(wp); if (md->isObjCMethod()) { n.prepend("("); n.append(")"); } if (!cName.isEmpty()) n=addTemplateNames(n,scope->name(),cName); linkifyText(TextGeneratorOLImpl(ol),scope,md->getBodyDef(),md,n); } else // non-function pointer type { - QCString n=a->type; + QCString n=a.type; if (md->isObjCMethod()) { n.prepend("("); n.append(")"); } - if (a->type!="...") + if (a.type!="...") { if (!cName.isEmpty()) n=addTemplateNames(n,scope->name(),cName); linkifyText(TextGeneratorOLImpl(ol),scope,md->getBodyDef(),md,n); @@ -1074,13 +1075,13 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me ol.endParameterType(); paramTypeStarted=FALSE; } - ol.startParameterName(defArgList->count()<2); + ol.startParameterName(defArgList.size()<2); } if (hasFuncPtrType) { - ol.docify(a->type.mid(wp,vp-wp)); + ol.docify(a.type.mid(wp,vp-wp)); } - if (!a->name.isEmpty() || a->type=="...") // argument has a name + if (!a.name.isEmpty() || a.type=="...") // argument has a name { //if (!hasFuncPtrType) //{ @@ -1096,7 +1097,7 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me ol.enable(OutputGenerator::Man); if (latexOn) ol.enable(OutputGenerator::Latex); if (docbookOn) ol.enable(OutputGenerator::Docbook); - if (a->name.isEmpty()) ol.docify(a->type); else ol.docify(a->name); + if (a.name.isEmpty()) ol.docify(a.type); else ol.docify(a.name); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::Docbook); @@ -1105,19 +1106,19 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me if (latexOn) ol.enable(OutputGenerator::Latex); if (docbookOn) ol.enable(OutputGenerator::Docbook); } - if (!a->array.isEmpty()) + if (!a.array.isEmpty()) { - ol.docify(a->array); + ol.docify(a.array); } if (hasFuncPtrType) // write the part of the argument type // that comes after the name { linkifyText(TextGeneratorOLImpl(ol),scope,md->getBodyDef(), - md,a->type.right(a->type.length()-vp)); + md,a.type.right(a.type.length()-vp)); } - if (!a->defval.isEmpty()) // write the default value + if (!a.defval.isEmpty()) // write the default value { - QCString n=a->defval; + QCString n=a.defval; if (!cName.isEmpty()) n=addTemplateNames(n,scope->name(),cName); ol.docify(" = "); @@ -1126,19 +1127,19 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me ol.endTypewriter(); } - ++ali; - a=ali.current(); - if (a) + ++alIt; + if (alIt!=defArgList.end()) { + a = *alIt; if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments if (!isDefine) { QCString key; - if (md->isObjCMethod() && a->attrib.length()>=2) + if (md->isObjCMethod() && a.attrib.length()>=2) { - //printf("Found parameter keyword %s\n",a->attrib.data()); + //printf("Found parameter keyword %s\n",a.attrib.data()); // strip [ and ] - key=a->attrib.mid(1,a->attrib.length()-2); + key=a.attrib.mid(1,a.attrib.length()-2); if (key!=",") key+=":"; // for normal keywords add colon } ol.endParameterName(FALSE,FALSE,!md->isObjCMethod()); @@ -1165,36 +1166,36 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me if (htmlOn) ol.enable(OutputGenerator::Html); if (latexOn) ol.enable(OutputGenerator::Latex); if (docbookOn) ol.enable(OutputGenerator::Docbook); - if (first) ol.startParameterName(defArgList->count()<2); - ol.endParameterName(TRUE,defArgList->count()<2,!md->isObjCMethod()); + if (first) ol.startParameterName(defArgList.size()<2); + ol.endParameterName(TRUE,defArgList.size()<2,!md->isObjCMethod()); ol.popGeneratorState(); if (md->extraTypeChars()) { ol.docify(md->extraTypeChars()); } - if (defArgList->constSpecifier) + if (defArgList.constSpecifier) { ol.docify(" const"); } - if (defArgList->volatileSpecifier) + if (defArgList.volatileSpecifier) { ol.docify(" volatile"); } - if (defArgList->refQualifier==RefQualifierLValue) + if (defArgList.refQualifier==RefQualifierLValue) { ol.docify(" &"); } - else if (defArgList->refQualifier==RefQualifierRValue) + else if (defArgList.refQualifier==RefQualifierRValue) { ol.docify(" &&"); } - if (!defArgList->trailingReturnType.isEmpty()) + if (!defArgList.trailingReturnType.isEmpty()) { linkifyText(TextGeneratorOLImpl(ol), // out scope, // scope md->getBodyDef(), // fileScope md, // self - defArgList->trailingReturnType, // text + defArgList.trailingReturnType, // text FALSE // autoBreak ); @@ -1264,24 +1265,22 @@ static void writeExceptionList(OutputList &ol, const ClassDef *cd, const MemberD } } -static void writeTemplatePrefix(OutputList &ol,const ArgumentList *al) +static void writeTemplatePrefix(OutputList &ol,const ArgumentList &al) { ol.docify("template<"); - ArgumentListIterator ali(*al); - Argument *a = ali.current(); - while (a) + for (auto it = al.begin(); it!=al.end();) { - ol.docify(a->type); + Argument a = *it; + ol.docify(a.type); ol.docify(" "); - ol.docify(a->name); - if (a->defval.length()!=0) + ol.docify(a.name); + if (a.defval.length()!=0) { ol.docify(" = "); - ol.docify(a->defval); + ol.docify(a.defval); } - ++ali; - a=ali.current(); - if (a) ol.docify(", "); + ++it; + if (it!=al.end()) ol.docify(", "); } ol.docify("> "); } @@ -1297,8 +1296,8 @@ class MemberDefImpl::IMPL ~IMPL(); void init(Definition *def,const char *t,const char *a,const char *e, Protection p,Specifier v,bool s,Relationship r, - MemberType mt,const ArgumentList *tal, - const ArgumentList *al,const char *meta + MemberType mt,const ArgumentList &tal, + const ArgumentList &al,const char *meta ); ClassDef *classDef; // member of or related to @@ -1344,13 +1343,13 @@ class MemberDefImpl::IMPL int userInitLines; // result of explicit \hideinitializer or \showinitializer MemberDef *annMemb; - ArgumentList *defArgList; // argument list of this member definition - ArgumentList *declArgList; // argument list of this member declaration + ArgumentList defArgList; // argument list of this member definition + ArgumentList declArgList; // argument list of this member declaration - ArgumentList *tArgList; // template argument list of function template - ArgumentList *typeConstraints; // type constraints for template parameters + ArgumentList tArgList; // template argument list of function template + ArgumentList typeConstraints; // type constraints for template parameters MemberDef *templateMaster; - QList *defTmpArgLists; // lists of template argument lists + std::vector defTmpArgLists; // lists of template argument lists // (for template functions in nested template classes) QCString metaData; // Slice metadata. @@ -1422,11 +1421,6 @@ MemberDefImpl::IMPL::IMPL() : enumFields(0), redefinedBy(0), exampleSDict(0), - defArgList(0), - declArgList(0), - tArgList(0), - typeConstraints(0), - defTmpArgLists(0), classSectionSDict(0), category(0), categoryRelation(0), @@ -1441,19 +1435,14 @@ MemberDefImpl::IMPL::~IMPL() delete redefinedBy; delete exampleSDict; delete enumFields; - delete defArgList; - delete tArgList; - delete typeConstraints; - delete defTmpArgLists; delete classSectionSDict; - delete declArgList; } void MemberDefImpl::IMPL::init(Definition *def, const char *t,const char *a,const char *e, Protection p,Specifier v,bool s,Relationship r, - MemberType mt,const ArgumentList *tal, - const ArgumentList *al,const char *meta + MemberType mt,const ArgumentList &tal, + const ArgumentList &al,const char *meta ) { classDef=0; @@ -1471,7 +1460,6 @@ void MemberDefImpl::IMPL::init(Definition *def, enumFields=0; enumScope=0; livesInsideEnum=FALSE; - defTmpArgLists=0; hasCallGraph = FALSE; hasCallerGraph = FALSE; hasReferencedByRelation = FALSE; @@ -1508,36 +1496,17 @@ void MemberDefImpl::IMPL::init(Definition *def, userInitLines=-1; docEnumValues=FALSE; // copy function template arguments (if any) - if (tal) - { - tArgList = tal->deepCopy(); - } - else - { - tArgList=0; - } + tArgList = tal; //printf("new member al=%p\n",al); // copy function definition arguments (if any) - if (al) - { - defArgList = al->deepCopy(); - } - else - { - defArgList=0; - } + defArgList = al; // convert function declaration arguments (if any) if (!args.isEmpty()) { - declArgList = new ArgumentList; stringToArgumentList(args,declArgList,&extraTypeChars); //printf("setDeclArgList %s to %s const=%d\n",args.data(), // argListToString(declArgList).data(),declArgList->constSpecifier); } - else - { - declArgList = 0; - } metaData = meta; templateMaster = 0; classSectionSDict = 0; @@ -1584,7 +1553,7 @@ void MemberDefImpl::IMPL::init(Definition *def, MemberDefImpl::MemberDefImpl(const char *df,int dl,int dc, const char *t,const char *na,const char *a,const char *e, Protection p,Specifier v,bool s,Relationship r,MemberType mt, - const ArgumentList *tal,const ArgumentList *al,const char *meta + const ArgumentList &tal,const ArgumentList &al,const char *meta ) : DefinitionImpl(df,dl,dc,removeRedundantWhiteSpace(na)) { //printf("MemberDefImpl::MemberDef(%s)\n",na); @@ -1613,12 +1582,7 @@ MemberDef *MemberDefImpl::deepCopy() const result->m_impl->redefinedBy= 0; result->m_impl->exampleSDict=0; result->m_impl->enumFields=0; - result->m_impl->defArgList=0; - result->m_impl->tArgList=0; - result->m_impl->typeConstraints=0; - result->m_impl->defTmpArgLists=0; result->m_impl->classSectionSDict=0; - result->m_impl->declArgList=0; // replace pointers owned by the object by deep copies if (m_impl->redefinedBy) { @@ -1647,18 +1611,9 @@ MemberDef *MemberDefImpl::deepCopy() const result->insertEnumField(md); } } - if (m_impl->defArgList) - { - result->m_impl->defArgList = m_impl->defArgList->deepCopy(); - } - if (m_impl->tArgList) - { - result->m_impl->tArgList = m_impl->tArgList->deepCopy(); - } - if (m_impl->typeConstraints) - { - result->m_impl->typeConstraints = m_impl->typeConstraints->deepCopy(); - } + result->m_impl->defArgList = m_impl->defArgList; + result->m_impl->tArgList = m_impl->tArgList; + result->m_impl->typeConstraints = m_impl->typeConstraints; result->setDefinitionTemplateParameterLists(m_impl->defTmpArgLists); if (m_impl->classSectionSDict) { @@ -1670,10 +1625,7 @@ MemberDef *MemberDefImpl::deepCopy() const result->m_impl->classSectionSDict->append(it.currentKey(),ml); } } - if (m_impl->declArgList) - { - result->m_impl->declArgList = m_impl->declArgList->deepCopy(); - } + result->m_impl->declArgList = m_impl->declArgList; return result; } @@ -2033,13 +1985,9 @@ bool MemberDefImpl::isLinkable() const } -void MemberDefImpl::setDefinitionTemplateParameterLists(QList *lists) +void MemberDefImpl::setDefinitionTemplateParameterLists(const std::vector &lists) { - if (lists) - { - if (m_impl->defTmpArgLists) delete m_impl->defTmpArgLists; - m_impl->defTmpArgLists = copyArgumentLists(lists); - } + m_impl->defTmpArgLists = lists; } void MemberDefImpl::writeLink(OutputList &ol, @@ -2225,9 +2173,8 @@ bool MemberDefImpl::isBriefSectionVisible() const // hide default constructors or destructors (no args) without // documentation bool visibleIfNotDefaultCDTor = !(cOrDTor && - m_impl->defArgList && - (m_impl->defArgList->isEmpty() || - m_impl->defArgList->getFirst()->type == "void" + (m_impl->defArgList.empty() || + m_impl->defArgList.front().type == "void" ) && !hasDocs ); @@ -2313,7 +2260,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol, bool isAnonymous = annoClassDef || m_impl->annMemb || m_impl->annEnumType; ///printf("startMemberItem for %s\n",name().data()); ol.startMemberItem(anchor(), - isAnonymous ? 1 : m_impl->tArgList ? 3 : 0, + isAnonymous ? 1 : !m_impl->tArgList.empty() ? 3 : 0, inheritId ); @@ -2352,7 +2299,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol, } // *** write template lists - if (m_impl->tArgList && getLanguage()==SrcLangExt_Cpp) + if (m_impl->tArgList.hasParameters() && getLanguage()==SrcLangExt_Cpp) { if (!isAnonymous) ol.startMemberTemplateParams(); writeTemplatePrefix(ol,m_impl->tArgList); @@ -2474,7 +2421,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol, } else { - ol.insertMemberAlign(m_impl->tArgList!=0); + ol.insertMemberAlign(m_impl->tArgList.hasParameters()); } // *** write name @@ -2754,7 +2701,7 @@ bool MemberDefImpl::isDetailedSectionLinkable() const //(initLines>0 && initLinesdefArgList!=0 && m_impl->defArgList->hasDocumentation()) || + (m_impl->defArgList.hasDocumentation()) || // is an attribute or property - need to display that tag (m_impl->memSpec & (Entry::Attribute|Entry::Property)) || // has user comments @@ -3169,7 +3116,7 @@ void MemberDefImpl::_writeExamples(OutputList &ol) const void MemberDefImpl::_writeTypeConstraints(OutputList &ol) const { - if (m_impl->typeConstraints) + if (m_impl->typeConstraints.hasParameters()) { writeTypeConstraints(ol,this,m_impl->typeConstraints); } @@ -3460,7 +3407,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml, ldef=ldef.mid(2); } } - else if (isFunction()) + else if (isFunction() && !isObjCMethod()) { title += "()"; } @@ -3546,14 +3493,12 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml, { bool first=TRUE; SrcLangExt lang = getLanguage(); - if (m_impl->defTmpArgLists && lang==SrcLangExt_Cpp) + if (!m_impl->defTmpArgLists.empty() && lang==SrcLangExt_Cpp) // definition has explicit template parameter declarations { - QListIterator ali(*m_impl->defTmpArgLists); - ArgumentList *tal; - for (ali.toFirst();(tal=ali.current());++ali) + for (const ArgumentList &tal : m_impl->defTmpArgLists) { - if (tal->count()>0) + if (!tal.empty()) { if (!first) ol.docify(" "); ol.startMemberDocPrefixItem(); @@ -3567,14 +3512,9 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml, { if (cd && lang==SrcLangExt_Cpp && !isTemplateSpecialization()) { - QList tempParamLists; - cd->getTemplateParameterLists(tempParamLists); - //printf("#tempParamLists=%d\n",tempParamLists.count()); - QListIterator ali(tempParamLists); - ArgumentList *tal; - for (ali.toFirst();(tal=ali.current());++ali) + for (const ArgumentList &tal : cd->getTemplateParameterLists()) { - if (tal->count()>0) + if (!tal.empty()) { if (!first) ol.docify(" "); ol.startMemberDocPrefixItem(); @@ -3583,7 +3523,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml, } } } - if (m_impl->tArgList && lang==SrcLangExt_Cpp) // function template prefix + if (m_impl->tArgList.hasParameters() && lang==SrcLangExt_Cpp) // function template prefix { ol.startMemberDocPrefixItem(); writeTemplatePrefix(ol,m_impl->tArgList); @@ -3775,7 +3715,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml, QCString brief = briefDescription(); QCString detailed = documentation(); - ArgumentList *docArgList = m_impl->defArgList; + ArgumentList &docArgList = m_impl->defArgList; if (m_impl->templateMaster) { brief = m_impl->templateMaster->briefDescription(); @@ -3832,18 +3772,16 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml, //printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n", // defArgList, // defArgList?defArgList->hasDocumentation():-1); - if (docArgList!=0 && docArgList->hasDocumentation()) + if (docArgList.hasDocumentation()) { QCString paramDocs; - ArgumentListIterator ali(*docArgList); - Argument *a; - // convert the parameter documentation into a list of @param commands - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : docArgList) { - if (a->hasDocumentation()) + if (a.hasDocumentation()) { - QCString direction = extractDirection(a->docs); - paramDocs+="@param"+direction+" "+a->name+" "+a->docs; + QCString docsWithoutDir = a.docs; + QCString direction = extractDirection(docsWithoutDir); + paramDocs+="@param"+direction+" "+a.name+" "+a.docs; } } // feed the result to the documentation parser @@ -4146,41 +4084,37 @@ void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturn } else if (!m_impl->hasDocumentedParams) { - const ArgumentList *al = argumentList(); - const ArgumentList *declAl = declArgumentList(); + const ArgumentList &al = argumentList(); + const ArgumentList &declAl = declArgumentList(); bool allDoc=TRUE; // no parameter => all parameters are documented if ( // member has parameters - al!=0 && // but the member has a parameter list - al->count()>0 // with at least one parameter (that is not void) + al.hasParameters() // with at least one parameter (that is not void) ) { - ArgumentListIterator ali(*al); - Argument *a; - // see if all parameters have documentation - for (ali.toFirst();(a=ali.current()) && allDoc;++ali) + for (auto it = al.begin(); it!=al.end() && allDoc; ++it) { - if (!a->name.isEmpty() && a->type!="void" && - !(isPython && (a->name=="self" || a->name=="cls")) + Argument a = *it; + if (!a.name.isEmpty() && a.type!="void" && + !(isPython && (a.name=="self" || a.name=="cls")) ) { - allDoc = !a->docs.isEmpty(); + allDoc = !a.docs.isEmpty(); } //printf("a->type=%s a->name=%s doc=%s\n", // a->type.data(),a->name.data(),a->docs.data()); } - if (!allDoc && declAl!=0) // try declaration arguments as well + if (!allDoc && declAl.empty()) // try declaration arguments as well { allDoc=TRUE; - ArgumentListIterator ali(*declAl); - Argument *a; - for (ali.toFirst();(a=ali.current()) && allDoc;++ali) + for (auto it = al.begin(); it!=al.end() && allDoc; ++it) { - if (!a->name.isEmpty() && a->type!="void" && - !(isPython && (a->name=="self" || a->name=="cls")) + Argument a = *it; + if (!a.name.isEmpty() && a.type!="void" && + !(isPython && (a.name=="self" || a.name=="cls")) ) { - allDoc = !a->docs.isEmpty(); + allDoc = !a.docs.isEmpty(); } //printf("a->name=%s doc=%s\n",a->name.data(),a->docs.data()); } @@ -4269,14 +4203,14 @@ bool MemberDefImpl::isDocumentedFriendClass() const bool MemberDefImpl::isDeleted() const { - return m_impl->defArgList && m_impl->defArgList->isDeleted; + return m_impl->defArgList.isDeleted; } bool MemberDefImpl::hasDocumentation() const { return DefinitionImpl::hasDocumentation() || (m_impl->mtype==MemberType_Enumeration && m_impl->docEnumValues) || // has enum values - (m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()); // has doc arguments + (m_impl->defArgList.hasDocumentation()); // has doc arguments } #if 0 @@ -4344,10 +4278,10 @@ void MemberDefImpl::setAnchor() // include number of template arguments as well, // to distinguish between two template // specializations that only differ in the template parameters. - if (m_impl->tArgList) + if (m_impl->tArgList.hasParameters()) { char buf[20]; - qsnprintf(buf,20,"%d:",m_impl->tArgList->count()); + qsnprintf(buf,20,"%d:",(int)m_impl->tArgList.size()); buf[19]='\0'; memAnchor.prepend(buf); } @@ -4356,7 +4290,6 @@ void MemberDefImpl::setAnchor() uchar md5_sig[16]; QCString sigStr(33); MD5Buffer((const unsigned char *)memAnchor.data(),memAnchor.length(),md5_sig); - //printf("memAnchor=%s\n",memAnchor.data()); MD5SigToString(md5_sig,sigStr.rawData(),33); m_impl->anc = "a"+sigStr; } @@ -4405,23 +4338,21 @@ void MemberDefImpl::setNamespace(NamespaceDef *nd) } MemberDef *MemberDefImpl::createTemplateInstanceMember( - ArgumentList *formalArgs,ArgumentList *actualArgs) const + const ArgumentList &formalArgs,const ArgumentList &actualArgs) const { //printf(" Member %s %s %s\n",typeString(),name().data(),argsString()); - ArgumentList *actualArgList = 0; - if (m_impl->defArgList) + ArgumentList actualArgList; + if (!m_impl->defArgList.empty()) { - actualArgList = m_impl->defArgList->deepCopy(); + actualArgList = m_impl->defArgList; // replace formal arguments with actuals - ArgumentListIterator ali(*actualArgList); - Argument *arg; - for (;(arg=ali.current());++ali) + for (Argument &arg : actualArgList) { - arg->type = substituteTemplateArgumentsInString(arg->type,formalArgs,actualArgs); + arg.type = substituteTemplateArgumentsInString(arg.type,formalArgs,actualArgs); } - actualArgList->trailingReturnType = - substituteTemplateArgumentsInString(actualArgList->trailingReturnType,formalArgs,actualArgs); + actualArgList.trailingReturnType = + substituteTemplateArgumentsInString(actualArgList.trailingReturnType,formalArgs,actualArgs); } QCString methodName=name(); @@ -4436,7 +4367,8 @@ MemberDef *MemberDefImpl::createTemplateInstanceMember( methodName, substituteTemplateArgumentsInString(m_impl->args,formalArgs,actualArgs), m_impl->exception, m_impl->prot, - m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype, 0, 0, "" + m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype, + ArgumentList(), ArgumentList(), "" ); imd->setArgumentList(actualArgList); imd->setDefinition(substituteTemplateArgumentsInString(m_impl->def,formalArgs,actualArgs)); @@ -4879,30 +4811,19 @@ void MemberDefImpl::writeEnumDeclaration(OutputList &typeDecl, } } -void MemberDefImpl::setArgumentList(ArgumentList *al) +void MemberDefImpl::setArgumentList(const ArgumentList &al) { - if (m_impl->defArgList) delete m_impl->defArgList; m_impl->defArgList = al; } -void MemberDefImpl::setDeclArgumentList(ArgumentList *al) +void MemberDefImpl::setDeclArgumentList(const ArgumentList &al) { - if (m_impl->declArgList) delete m_impl->declArgList; m_impl->declArgList = al; } -void MemberDefImpl::setTypeConstraints(ArgumentList *al) +void MemberDefImpl::setTypeConstraints(const ArgumentList &al) { - if (al==0) return; - if (m_impl->typeConstraints) delete m_impl->typeConstraints; - m_impl->typeConstraints = new ArgumentList; - m_impl->typeConstraints->setAutoDelete(TRUE); - ArgumentListIterator ali(*al); - Argument *a; - for (;(a=ali.current());++ali) - { - m_impl->typeConstraints->append(new Argument(*a)); - } + m_impl->typeConstraints = al; } void MemberDefImpl::setType(const char *t) @@ -5557,27 +5478,27 @@ bool MemberDefImpl::isPrototype() const return m_impl->proto; } -const ArgumentList *MemberDefImpl::argumentList() const +const ArgumentList &MemberDefImpl::argumentList() const { return m_impl->defArgList; } -ArgumentList *MemberDefImpl::argumentList() +ArgumentList &MemberDefImpl::argumentList() { return m_impl->defArgList; } -const ArgumentList *MemberDefImpl::declArgumentList() const +const ArgumentList &MemberDefImpl::declArgumentList() const { return m_impl->declArgList; } -const ArgumentList *MemberDefImpl::templateArguments() const +const ArgumentList &MemberDefImpl::templateArguments() const { return m_impl->tArgList; } -const QList *MemberDefImpl::definitionTemplateParameterLists() const +const std::vector &MemberDefImpl::definitionTemplateParameterLists() const { return m_impl->defTmpArgLists; } @@ -5931,47 +5852,44 @@ void MemberDefImpl::cacheTypedefVal(const ClassDef*val, const QCString & templSp void MemberDefImpl::copyArgumentNames(MemberDef *bmd) { { - const ArgumentList *arguments = bmd->argumentList(); - if (m_impl->defArgList && arguments) + const ArgumentList &srcAl = bmd->argumentList(); + ArgumentList &dstAl = m_impl->defArgList; + auto srcIt = srcAl.begin(); + auto dstIt = dstAl.begin(); + while ( srcIt!=srcAl.end() && dstIt!=dstAl.end()) { - ArgumentListIterator aliDst(*m_impl->defArgList); - ArgumentListIterator aliSrc(*arguments); - Argument *argDst; - const Argument *argSrc; - for (;(argDst=aliDst.current()) && (argSrc=aliSrc.current());++aliDst,++aliSrc) - { - argDst->name = argSrc->name; - argDst->docs = argSrc->docs; - } + Argument &argDst = *dstIt; + const Argument &argSrc = *srcIt; + argDst.name = argSrc.name; + argDst.docs = argSrc.docs; + ++srcIt; + ++dstIt; } } + { - const ArgumentList *arguments = bmd->declArgumentList(); - if (m_impl->declArgList && arguments) + const ArgumentList &srcAl = bmd->declArgumentList(); + ArgumentList &dstAl = m_impl->declArgList; + auto srcIt = srcAl.begin(); + auto dstIt = dstAl.begin(); + + while ( srcIt!=srcAl.end() && dstIt!=dstAl.end()) { - ArgumentListIterator aliDst(*m_impl->declArgList); - ArgumentListIterator aliSrc(*arguments); - Argument *argDst; - const Argument *argSrc; - for (;(argDst=aliDst.current()) && (argSrc=aliSrc.current());++aliDst,++aliSrc) - { - argDst->name = argSrc->name; - argDst->docs = argSrc->docs; - } + Argument &argDst = *dstIt; + const Argument &argSrc = *srcIt; + argDst.name = argSrc.name; + argDst.docs = argSrc.docs; + ++srcIt; + ++dstIt; } } } -static void invalidateCachedTypesInArgumentList(ArgumentList *al) +static void invalidateCachedTypesInArgumentList(ArgumentList &al) { - if (al) + for (Argument &a : al) { - ArgumentListIterator ali(*al); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) - { - a->canType.resize(0); - } + a.canType.resize(0); } } @@ -6025,29 +5943,21 @@ void MemberDefImpl::addToSearchIndex() const //---------------- -static void transferArgumentDocumentation(ArgumentList *decAl,ArgumentList *defAl) +static void transferArgumentDocumentation(ArgumentList &decAl,ArgumentList &defAl) { - if (decAl && defAl) + for (auto decIt = decAl.begin(), defIt = defAl.begin(); + decIt!= decAl.end() && defIt!= defAl.end(); + ++decIt, ++defIt) { - ArgumentListIterator decAli(*decAl); - ArgumentListIterator defAli(*defAl); - Argument *decA,*defA; - for (decAli.toFirst(),defAli.toFirst(); - (decA=decAli.current()) && (defA=defAli.current()); - ++decAli,++defAli) + Argument decA = *decIt; + Argument defA = *defIt; + if (decA.docs.isEmpty() && !defA.docs.isEmpty()) { - //printf("Argument decA->name=%s (doc=%s) defA->name=%s (doc=%s)\n", - // decA->name.data(),decA->docs.data(), - // defA->name.data(),defA->docs.data() - // ); - if (decA->docs.isEmpty() && !defA->docs.isEmpty()) - { - decA->docs = defA->docs.copy(); - } - else if (defA->docs.isEmpty() && !decA->docs.isEmpty()) - { - defA->docs = decA->docs.copy(); - } + decA.docs = defA.docs; + } + else if (defA.docs.isEmpty() && !decA.docs.isEmpty()) + { + defA.docs = decA.docs; } } } @@ -6066,8 +5976,8 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef) const MemberDef *cmdec = const_cast(mdec); const MemberDef *cmdef = const_cast(mdef); - ArgumentList *mdefAl = mdef->argumentList(); - ArgumentList *mdecAl = mdec->argumentList(); + ArgumentList &mdefAl = mdef->argumentList(); + ArgumentList &mdecAl = mdec->argumentList(); if (matchArguments2(cmdef->getOuterScope(),cmdef->getFileDef(),mdefAl, cmdec->getOuterScope(),cmdec->getFileDef(),mdecAl, TRUE @@ -6097,9 +6007,9 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef) //printf("transferring docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString()); mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine()); mdec->setDocsForDefinition(mdef->isDocsForDefinition()); - if (mdefAl!=0) + if (mdefAl.hasParameters()) { - ArgumentList *mdefAlComb = new ArgumentList; + ArgumentList mdefAlComb; stringToArgumentList(mdef->argsString(),mdefAlComb); transferArgumentDocumentation(mdefAl,mdefAlComb); mdec->setArgumentList(mdefAlComb); @@ -6110,9 +6020,9 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef) //printf("transferring docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString()); mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine()); mdef->setDocsForDefinition(mdec->isDocsForDefinition()); - if (mdecAl!=0) + if (mdecAl.hasParameters()) { - ArgumentList *mdecAlComb = new ArgumentList; + ArgumentList mdecAlComb; stringToArgumentList(mdec->argsString(),mdecAlComb); transferArgumentDocumentation(mdecAl,mdecAlComb); mdef->setDeclArgumentList(mdecAlComb); @@ -6210,7 +6120,7 @@ QCString MemberDefImpl::documentation() const } } -const ArgumentList *MemberDefImpl::typeConstraints() const +const ArgumentList &MemberDefImpl::typeConstraints() const { return m_impl->typeConstraints; } diff --git a/src/memberdef.h b/src/memberdef.h index 97bf819..986ceca 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -18,6 +18,8 @@ #ifndef MEMBERDEF_H #define MEMBERDEF_H +#include + #include #include @@ -221,11 +223,11 @@ class MemberDef : virtual public Definition virtual bool isPrototype() const = 0; // argument related members - virtual const ArgumentList *argumentList() const = 0; - virtual ArgumentList *argumentList() = 0; - virtual const ArgumentList *declArgumentList() const = 0; - virtual const ArgumentList *templateArguments() const = 0; - virtual const QList *definitionTemplateParameterLists() const = 0; + virtual const ArgumentList &argumentList() const = 0; + virtual ArgumentList &argumentList() = 0; + virtual const ArgumentList &declArgumentList() const = 0; + virtual const ArgumentList &templateArguments() const = 0; + virtual const std::vector &definitionTemplateParameterLists() const = 0; // member group related members virtual int getMemberGroupId() const = 0; @@ -265,7 +267,7 @@ class MemberDef : virtual public Definition virtual QCString getDeclType() const = 0; virtual void getLabels(QStrList &sl,const Definition *container) const = 0; - virtual const ArgumentList *typeConstraints() const = 0; + virtual const ArgumentList &typeConstraints() const = 0; // overrules virtual QCString documentation() const = 0; @@ -331,10 +333,10 @@ class MemberDef : virtual public Definition virtual void setDeclFile(const QCString &df,int line,int column) = 0; // argument related members - virtual void setArgumentList(ArgumentList *al) = 0; - virtual void setDeclArgumentList(ArgumentList *al) = 0; - virtual void setDefinitionTemplateParameterLists(QList *lists) = 0; - virtual void setTypeConstraints(ArgumentList *al) = 0; + virtual void setArgumentList(const ArgumentList &al) = 0; + virtual void setDeclArgumentList(const ArgumentList &al) = 0; + virtual void setDefinitionTemplateParameterLists(const std::vector &lists) = 0; + virtual void setTypeConstraints(const ArgumentList &al) = 0; virtual void setType(const char *t) = 0; virtual void setAccessorType(ClassDef *cd,const char *t) = 0; @@ -384,8 +386,8 @@ class MemberDef : virtual public Definition // --- actions ---- //----------------------------------------------------------------------------------- - virtual MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs, - ArgumentList *actualArgs) const = 0; + virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs, + const ArgumentList &actualArgs) const = 0; virtual void findSectionsInDocumentation() = 0; virtual void addToSearchIndex() const = 0; @@ -421,8 +423,8 @@ class MemberDef : virtual public Definition MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn, const char *type,const char *name,const char *args, const char *excp,Protection prot,Specifier virt,bool stat, - Relationship related,MemberType t,const ArgumentList *tal, - const ArgumentList *al,const char *metaData); + Relationship related,MemberType t,const ArgumentList &tal, + const ArgumentList &al,const char *metaData); MemberDef *createMemberDefAlias(const Definition *newScope,const MemberDef *aliasMd); diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index a288e0e..c8f9273 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -1422,23 +1422,20 @@ void PerlModDocVisitor::visitPost(DocParBlock *) } -static void addTemplateArgumentList(ArgumentList *al,PerlModOutput &output,const char *) +static void addTemplateArgumentList(const ArgumentList &al,PerlModOutput &output,const char *) { - if (!al) - return; + if (!al.hasParameters()) return; output.openList("template_parameters"); - ArgumentListIterator ali(*al); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : al) { output.openHash(); - if (!a->type.isEmpty()) - output.addFieldQuotedString("type", a->type); - if (!a->name.isEmpty()) - output.addFieldQuotedString("declaration_name", a->name) - .addFieldQuotedString("definition_name", a->name); - if (!a->defval.isEmpty()) - output.addFieldQuotedString("default", a->defval); + if (!a.type.isEmpty()) + output.addFieldQuotedString("type", a.type); + if (!a.name.isEmpty()) + output.addFieldQuotedString("declaration_name", a.name) + .addFieldQuotedString("definition_name", a.name); + if (!a.defval.isEmpty()) + output.addFieldQuotedString("default", a.defval); output.closeHash(); } output.closeList(); @@ -1609,45 +1606,46 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini md->memberType()!=MemberType_Enumeration) m_output.addFieldQuotedString("type", md->typeString()); - const ArgumentList *al = md->argumentList(); + const ArgumentList &al = md->argumentList(); if (isFunc) //function { - m_output.addFieldBoolean("const", al!=0 && al->constSpecifier) - .addFieldBoolean("volatile", al!=0 && al->volatileSpecifier); + m_output.addFieldBoolean("const", al.constSpecifier) + .addFieldBoolean("volatile", al.volatileSpecifier); m_output.openList("parameters"); - const ArgumentList *declAl = md->declArgumentList(); - const ArgumentList *defAl = md->argumentList(); - if (declAl && defAl && declAl->count()>0) + const ArgumentList &declAl = md->declArgumentList(); + if (!declAl.empty()) { - ArgumentListIterator declAli(*declAl); - ArgumentListIterator defAli(*defAl); - const Argument *a; - for (declAli.toFirst();(a=declAli.current());++declAli) + auto defIt = al.begin(); + for (const Argument &a : declAl) { - const Argument *defArg = defAli.current(); + const Argument *defArg = 0; + if (defIt!=al.end()) + { + defArg = &(*defIt); + ++defIt; + } m_output.openHash(); - if (!a->name.isEmpty()) - m_output.addFieldQuotedString("declaration_name", a->name); + if (!a.name.isEmpty()) + m_output.addFieldQuotedString("declaration_name", a.name); - if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name) + if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name) m_output.addFieldQuotedString("definition_name", defArg->name); - if (!a->type.isEmpty()) - m_output.addFieldQuotedString("type", a->type); + if (!a.type.isEmpty()) + m_output.addFieldQuotedString("type", a.type); - if (!a->array.isEmpty()) - m_output.addFieldQuotedString("array", a->array); + if (!a.array.isEmpty()) + m_output.addFieldQuotedString("array", a.array); - if (!a->defval.isEmpty()) - m_output.addFieldQuotedString("default_value", a->defval); + if (!a.defval.isEmpty()) + m_output.addFieldQuotedString("default_value", a.defval); - if (!a->attrib.isEmpty()) - m_output.addFieldQuotedString("attributes", a->attrib); + if (!a.attrib.isEmpty()) + m_output.addFieldQuotedString("attributes", a.attrib); m_output.closeHash(); - if (defArg) ++defAli; } } m_output.closeList(); @@ -1656,12 +1654,10 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini md->argsString()!=0) // define { m_output.openList("parameters"); - ArgumentListIterator ali(*al); - const Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : al) { m_output.openHash() - .addFieldQuotedString("name", a->type) + .addFieldQuotedString("name", a.type) .closeHash(); } m_output.closeList(); diff --git a/src/pre.l b/src/pre.l index cebc98f..5e46110 100644 --- a/src/pre.l +++ b/src/pre.l @@ -1444,10 +1444,10 @@ void addDefine() MemberDef *md=createMemberDef( g_yyFileName,g_yyLineNr-g_yyMLines,g_yyColNr, "#define",g_defName,g_defArgsStr,0, - Public,Normal,FALSE,Member,MemberType_Define,0,0,""); + Public,Normal,FALSE,Member,MemberType_Define,ArgumentList(),ArgumentList(),""); if (!g_defArgsStr.isEmpty()) { - ArgumentList *argList = new ArgumentList; + ArgumentList argList; //printf("addDefine() g_defName='%s' g_defArgsStr='%s'\n",g_defName.data(),g_defArgsStr.data()); stringToArgumentList(g_defArgsStr,argList); md->setArgumentList(argList); diff --git a/src/pyscanner.l b/src/pyscanner.l index ee72c7c..1a3f052 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -378,7 +378,7 @@ static void searchFoundDef() current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); g_packageCommentAllowed = FALSE; gstat=FALSE; //printf("searchFoundDef at=%d\n",yyLineNr); @@ -387,7 +387,7 @@ static void searchFoundDef() static void searchFoundClass() { current->section = Entry::CLASS_SEC; - current->argList->clear(); + current->argList.clear(); current->type += "class" ; current->fileName = yyFileName; current->startLine = yyLineNr; @@ -928,6 +928,10 @@ STARTDOCSYMS "##" BEGIN(FunctionParams); } ")" { // end of parameter list + if (current->argList.empty()) + { + current->argList.noParameters=TRUE; + } current->args = argListToString(current->argList); g_funcParamsEnd = TRUE; } @@ -942,10 +946,10 @@ STARTDOCSYMS "##" } {IDENTIFIER} { // Name of parameter lineCount(); - Argument *a = new Argument; - current->argList->append(a); - current->argList->getLast()->name = QCString(yytext).stripWhiteSpace(); - current->argList->getLast()->type = g_argType; + Argument a; + a.name = QCString(yytext).stripWhiteSpace(); + a.type = g_argType; + current->argList.push_back(a); g_argType = ""; } "=" { // default value @@ -1032,8 +1036,8 @@ STARTDOCSYMS "##" "," { if (g_braceCount == 0) { - if (current->argList->getLast()) - current->argList->getLast()->type += g_defVal.data(); + if (!current->argList.empty()) + current->argList.back().type += g_defVal; if (*yytext != ',') unput(*yytext); BEGIN(FunctionParams); @@ -1082,8 +1086,8 @@ STARTDOCSYMS "##" "," { if (g_braceCount == 0) { - if (current->argList->getLast()) - current->argList->getLast()->defval=QCString(g_defVal.data()).stripWhiteSpace(); + if (!current->argList.empty()) + current->argList.back().defval=QCString(g_defVal).stripWhiteSpace(); if (*yytext == ')') unput(*yytext); BEGIN(FunctionParams); diff --git a/src/scanner.l b/src/scanner.l index 50ebe5e..61b51cb 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -352,7 +352,7 @@ static void addType() } current->type += current->args ; current->args.resize(0) ; - current->argList->clear(); + current->argList.clear(); } @@ -372,7 +372,7 @@ static QCString stripQuotes(const char *s) static void startCommentBlock(bool); static void handleCommentBlock(const QCString &doc,bool brief); -static void handleParametersCommentBlocks(ArgumentList *al); +static void handleParametersCommentBlocks(ArgumentList &al); //----------------------------------------------------------------- @@ -418,28 +418,10 @@ static void prependScope() { //printf("--- prependScope %s to %s\n",current_root->name.data(),current->name.data()); current->name.prepend(current_root->name+"::"); - if (current_root->tArgLists) + //printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count()); + for (const ArgumentList &srcAl : current_root->tArgLists) { - if (current->tArgLists==0) - { - current->tArgLists = new QList; - current->tArgLists->setAutoDelete(TRUE); - } - //printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count()); - QListIterator talsi(*current_root->tArgLists); - ArgumentList *srcAl=0; - for (talsi.toLast();(srcAl=talsi.current());--talsi) - { - ArgumentList *dstAl = new ArgumentList; - QListIterator tali(*srcAl); - Argument *a; - for (;(a=tali.current());++tali) - { - dstAl->append(new Argument(*a)); - //printf("appending argument %s %s\n",a->type.data(),a->name.data()); - } - current->tArgLists->insert(0,dstAl); - } + current->tArgLists.insert(current->tArgLists.begin(),srcAl); } } } @@ -450,14 +432,12 @@ static void prependScope() static bool checkForKnRstyleC() { if (((QCString)yyFileName).right(2).lower()!=".c") return FALSE; // must be a C file - if (!current->argList) return FALSE; // must have arguments - ArgumentListIterator ali(*current->argList); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + if (current->argList.empty()) return FALSE; // must have arguments + for (const Argument &a : current->argList) { // in K&R style argument do not have a type, but doxygen expects a type // so it will think the argument has no name - if (a->type.isEmpty() || !a->name.isEmpty()) return FALSE; + if (a.type.isEmpty() || !a.name.isEmpty()) return FALSE; } return TRUE; } @@ -545,30 +525,27 @@ static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName) static void addKnRArgInfo(const QCString &type,const QCString &name, const QCString &brief,const QCString &docs) { - if (current->argList==0) return; - ArgumentListIterator ali(*current->argList); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (Argument &a : current->argList) { - if (a->type==name) + if (a.type==name) { - a->type=type.stripWhiteSpace(); - if (a->type.left(9)=="register ") // strip keyword + a.type=type.stripWhiteSpace(); + if (a.type.left(9)=="register ") // strip keyword { - a->type=a->type.mid(9); + a.type=a.type.mid(9); } - a->name=name.stripWhiteSpace(); + a.name=name.stripWhiteSpace(); if (!brief.isEmpty() && !docs.isEmpty()) { - a->docs=brief+"\n\n"+docs; + a.docs=brief+"\n\n"+docs; } else if (!brief.isEmpty()) { - a->docs=brief; + a.docs=brief; } else { - a->docs=docs; + a.docs=docs; } } } @@ -577,17 +554,14 @@ static void addKnRArgInfo(const QCString &type,const QCString &name, //----------------------------------------------------------------------------- -void fixArgumentListForJavaScript(ArgumentList *al) +void fixArgumentListForJavaScript(ArgumentList &al) { - if (al==0) return; - ArgumentListIterator ali(*al); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (Argument &a : al) { - if (!a->type.isEmpty() && a->name.isEmpty()) + if (!a.type.isEmpty() && a.name.isEmpty()) { // a->type is actually the (typeless) parameter name, so move it - a->name=a->type; - a->type.resize(0); + a.name=a.type; + a.type.resize(0); } } } @@ -904,7 +878,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } @@ -913,7 +887,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } @@ -923,7 +897,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } @@ -933,7 +907,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount(); } @@ -943,7 +917,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount(); } @@ -953,7 +927,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount(); } {B}*("public"|"methods"|"__published"){BN}*":"{BN}* { @@ -962,7 +936,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } {B}*"internal"{BN}*":"{BN}* { // for now treat C++/CLI's internal as package... @@ -973,7 +947,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } else @@ -987,7 +961,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } {B}*"private"{BN}*":"{BN}* { @@ -996,7 +970,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } {B}*"event"{BN}+ { @@ -1087,7 +1061,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } {B}*"@protected"{BN}+ { @@ -1096,7 +1070,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } {B}*"@public"{BN}+ { @@ -1105,7 +1079,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); lineCount() ; } [\-+]{BN}* { @@ -1130,7 +1104,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0); current->name.resize(0); current->args.resize(0); - current->argList->clear(); + current->argList.clear(); BEGIN( ObjCMethod ); } } @@ -1150,8 +1124,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } ":"{B}* { // start of parameter list current->name += ':'; - Argument *a = new Argument; - current->argList->append(a); + Argument a; + current->argList.push_back(a); BEGIN( ObjCParams ); } [^)]* { // TODO: check if nested braches are possible. @@ -1171,26 +1145,26 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) { current->name += keyw+":"; } - if (current->argList->getLast()->type.isEmpty()) + if (current->argList.back().type.isEmpty()) { - current->argList->getLast()->type="id"; + current->argList.back().type="id"; } - Argument *a = new Argument; - a->attrib=(QCString)"["+keyw+"]"; - current->argList->append(a); + Argument a; + a.attrib=(QCString)"["+keyw+"]"; + current->argList.push_back(a); } {ID}{BN}* { // name of parameter lineCount(); - current->argList->getLast()->name=QCString(yytext).stripWhiteSpace(); + current->argList.back().name=QCString(yytext).stripWhiteSpace(); } ","{BN}*"..." { // name of parameter lineCount(); // do we want the comma as part of the name? //current->name += ","; - Argument *a = new Argument; - a->attrib="[,]"; - a->type="..."; - current->argList->append(a); + Argument a; + a.attrib="[,]"; + a.type="..."; + current->argList.push_back(a); } /* ":" { @@ -1199,12 +1173,12 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) */ "(" { roundCount=0; - current->argList->getLast()->type.resize(0); + current->argList.back().type.resize(0); BEGIN( ObjCParamType ); } "(" { roundCount++; - current->argList->getLast()->type+=yytext; + current->argList.back().type+=yytext; } ")"/{B}* { if (roundCount<=0) @@ -1213,18 +1187,22 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else { - current->argList->getLast()->type+=yytext; + current->argList.back().type+=yytext; roundCount--; } } [^()]* { - current->argList->getLast()->type+=QCString(yytext).stripWhiteSpace(); + current->argList.back().type+=QCString(yytext).stripWhiteSpace(); } ";" { // end of method declaration - if (current->argList->getLast() && current->argList->getLast()->type.isEmpty()) + if (!current->argList.empty() && current->argList.back().type.isEmpty()) { - current->argList->getLast()->type="id"; + current->argList.back().type="id"; } + if (current->argList.empty()) // method without parameters + { + current->argList.noParameters = TRUE; + } current->args = argListToString(current->argList); //printf("argList=%s\n",current->args.data()); unput(';'); @@ -1235,10 +1213,14 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) //printf("Type=%s Name=%s args=%s\n", // current->type.data(),current->name.data(),argListToString(current->argList).data() // ); - if (current->argList->getLast() && current->argList->getLast()->type.isEmpty()) + if (!current->argList.empty() && current->argList.back().type.isEmpty()) { - current->argList->getLast()->type="id"; + current->argList.back().type="id"; } + if (current->argList.empty()) // method without parameters + { + current->argList.noParameters = TRUE; + } current->args = argListToString(current->argList); unput('{'); BEGIN( Function ); @@ -1960,15 +1942,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } ("template"|"generic")({BN}*)"<"/[>]? { // generic is a C++/CLI extension lineCount(); - if (current->tArgLists==0) - { - current->tArgLists = new QList; - current->tArgLists->setAutoDelete(TRUE); - } - ArgumentList *al = new ArgumentList; + ArgumentList al; //current->spec |= (yytext[0]=='g') ? Entry::Generic : Entry::Template; - current->tArgLists->append(al); - currentArgumentList = al; + current->tArgLists.push_back(al); + currentArgumentList = ¤t->tArgLists.back(); templateStr="<"; fullArgString = templateStr; copyArgString = &templateStr; @@ -4491,7 +4468,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) fullArgString=current->args.copy(); copyArgString=¤t->args; BEGIN( ReadFuncArgType ) ; - //printf(">>> Read function arguments current->argList->count()=%d\n",current->argList->count()); + //printf(">>> Read function arguments current->argList.size()=%d\n",current->argList.size()); } } /* @@ -4704,8 +4681,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) ">" { *copyArgString+=*yytext; fullArgString+=*yytext; - //printf("end template list %s\n",copyArgString->data()); - stringToArgumentList(fullArgString,currentArgumentList); + //printf("end template list '%s'\n",copyArgString->data()); + stringToArgumentList(fullArgString,*currentArgumentList); BEGIN( currentArgumentContext ); } "(" { @@ -4857,12 +4834,12 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) {BN}*"const"{BN}* { // const member function lineCount() ; current->args += " const "; - current->argList->constSpecifier=TRUE; + current->argList.constSpecifier=TRUE; } {BN}*"volatile"{BN}* { // volatile member function lineCount() ; current->args += " volatile "; - current->argList->volatileSpecifier=TRUE; + current->argList.volatileSpecifier=TRUE; } {BN}*"noexcept"{BN}* { // noexcept qualifier lineCount() ; @@ -4880,25 +4857,25 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } {BN}*"&" { current->args += " &"; - current->argList->refQualifier=RefQualifierLValue; + current->argList.refQualifier=RefQualifierLValue; } {BN}*"&&" { current->args += " &&"; - current->argList->refQualifier=RefQualifierRValue; + current->argList.refQualifier=RefQualifierRValue; } {BN}*"="{BN}*"0"{BN}* { // pure virtual member function lineCount() ; current->args += " = 0"; current->virt = Pure; - current->argList->pureSpecifier=TRUE; + current->argList.pureSpecifier=TRUE; BEGIN(FuncQual); } {BN}*"="{BN}*"delete"{BN}* { // C++11 explicitly delete member lineCount(); current->args += " = delete"; current->spec |= Entry::Delete; - current->argList->isDeleted=TRUE; + current->argList.isDeleted=TRUE; BEGIN(FuncQual); } {BN}*"="{BN}*"default"{BN}* { // C++11 explicitly defaulted constructor/assignment operator @@ -4909,7 +4886,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } {BN}*"->"{BN}* { lineCount(); - current->argList->trailingReturnType = " -> "; + current->argList.trailingReturnType = " -> "; current->args += " -> "; BEGIN(TrailingReturn); } @@ -4918,12 +4895,12 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(FuncQual); } . { - current->argList->trailingReturnType+=yytext; + current->argList.trailingReturnType+=yytext; current->args+=yytext; } \n { lineCount(); - current->argList->trailingReturnType+=yytext; + current->argList.trailingReturnType+=yytext; current->args+=' '; } {BN}*","{BN}* { @@ -5009,9 +4986,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) if (insideCS && qstrcmp(yytext,"where")==0) { // type constraint for a method - delete current->typeConstr; - current->typeConstr = new ArgumentList; - current->typeConstr->append(new Argument); + current->typeConstr.clear(); + current->typeConstr.push_back(Argument()); lastCSConstraint = YY_START; BEGIN( CSConstraintName ); } @@ -5048,6 +5024,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } {ID} { current->args += yytext; } "{" { + if (current->argList.empty()) + { + current->argList.noParameters=TRUE; + } current->args = argListToString(current->argList); unput('{'); BEGIN(FuncQual); @@ -5479,7 +5459,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0) ; current->name.resize(0) ; current->args.resize(0) ; - current->argList->clear(); + current->argList.clear(); BEGIN( FindMembers ) ; } ";" { @@ -5509,7 +5489,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->type.resize(0) ; current->name.resize(0) ; current->args.resize(0) ; - current->argList->clear(); + current->argList.clear(); } BEGIN( FindMembers ) ; } @@ -5538,16 +5518,11 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } } "<" { - if (current->tArgLists==0) - { - current->tArgLists = new QList; - current->tArgLists->setAutoDelete(TRUE); - } - ArgumentList *al = new ArgumentList; + ArgumentList al; // check bug 612858 before enabling the next line //current->spec |= Entry::Template; - current->tArgLists->append(al); - currentArgumentList = al; + current->tArgLists.push_back(al); + currentArgumentList = ¤t->tArgLists.back(); templateStr="<"; current->name += "<"; fullArgString = templateStr; @@ -5585,7 +5560,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) current->name += yytext; } {SCOPENAME}{BN}*";" { // forward declaration - if (current->tArgLists && current->tArgLists->count()>0) + if (!current->tArgLists.empty()) { // found a forward template declaration, this has // a purpose of its own @@ -5759,9 +5734,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else if (insideCS && qstrcmp(yytext,"where")==0) // C# type constraint { - delete current->typeConstr; - current->typeConstr = new ArgumentList; - current->typeConstr->append(new Argument); + current->typeConstr.clear(); + current->typeConstr.push_back(Argument()); lastCSConstraint = YY_START; BEGIN( CSConstraintName ); } @@ -5821,7 +5795,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( CopyArgComment ); } "#" { // artificially inserted token to signal end of comment block - current->typeConstr->getLast()->docs = fullArgString; + current->typeConstr.back().docs = fullArgString; } "{" { // end of type constraint reached // parse documentation of the constraints @@ -5839,24 +5813,24 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } {ID} { // parameter name - current->typeConstr->getLast()->name=yytext; + current->typeConstr.back().name=yytext; } "where" { // another constraint for a different param - current->typeConstr->append(new Argument); + current->typeConstr.push_back(Argument()); BEGIN( CSConstraintName ); } ({ID}".")*{ID}("<"{ID}">")?("()")? { - if (current->typeConstr->getLast()->type.isEmpty()) + if (current->typeConstr.back().type.isEmpty()) // first type constraint for this parameter { - current->typeConstr->getLast()->type=yytext; + current->typeConstr.back().type=yytext; } else // new type constraint for same parameter { - QCString name = current->typeConstr->getLast()->name; - current->typeConstr->append(new Argument); - current->typeConstr->getLast()->name=name; - current->typeConstr->getLast()->type=yytext; + QCString name = current->typeConstr.back().name; + current->typeConstr.push_back(Argument()); + current->typeConstr.back().name=name; + current->typeConstr.back().type=yytext; } } \n { @@ -6038,9 +6012,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) if (insideCS && baseScope.stripWhiteSpace()=="where") { // type constraint for a class - delete current->typeConstr; - current->typeConstr = new ArgumentList; - current->typeConstr->append(new Argument); + current->typeConstr.clear(); + current->typeConstr.push_back(Argument()); lastCSConstraint = YY_START; BEGIN( CSConstraintName ); } @@ -6461,7 +6434,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) //current->type.resize(0); //current->name.resize(0); //current->args.resize(0); - //current->argList->clear(); + //current->argList.clear(); //curlyCount=0; //BEGIN( SkipCurlyBlock ); @@ -6864,16 +6837,16 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } {B}*"const"{B}* { current->args += " const "; - current->argList->constSpecifier=TRUE; + current->argList.constSpecifier=TRUE; } {B}*"volatile"{B}* { current->args += " volatile "; - current->argList->volatileSpecifier=TRUE; + current->argList.volatileSpecifier=TRUE; } {B}*"="{B}*"0"{B}* { current->args += " = 0"; current->virt = Pure; - current->argList->pureSpecifier=TRUE; + current->argList.pureSpecifier=TRUE; } "throw"{B}*"(" { current->exception = "throw("; @@ -7068,17 +7041,15 @@ static void handleCommentBlock(const QCString &doc,bool brief) } } -static void handleParametersCommentBlocks(ArgumentList *al) +static void handleParametersCommentBlocks(ArgumentList &al) { //printf(">>>>>>> handleParametersCommentBlocks()\n"); - ArgumentListIterator ali(*al); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (Argument &a : al) { //printf(" Param %s docs=%s\n",a->name.data(),a->docs.data()); - if (!a->docs.isEmpty()) + if (!a.docs.isEmpty()) { - if (!a->name && a->type == "...") a->name= "..."; + if (!a.name && a.type == "...") a.name= "..."; int position=0; bool needsEntry; @@ -7095,7 +7066,7 @@ static void handleParametersCommentBlocks(ArgumentList *al) while (parseCommentBlock( g_thisParser, current.get(), - a->docs, // text + a.docs, // text yyFileName, // file current->docLine, // line of block start FALSE, @@ -7114,7 +7085,7 @@ static void handleParametersCommentBlocks(ArgumentList *al) { newEntry(); } - a->docs = current->doc; + a.docs = current->doc; // restore context current->doc = orgDoc; diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp index 49818b2..dc0cc85 100644 --- a/src/sqlite3gen.cpp +++ b/src/sqlite3gen.cpp @@ -1015,26 +1015,34 @@ static void insertMemberReference(const MemberDef *src, const MemberDef *dst, co static void insertMemberFunctionParams(int memberdef_id, const MemberDef *md, const Definition *def) { - const ArgumentList *declAl = md->declArgumentList(); - const ArgumentList *defAl = md->argumentList(); - if (declAl!=0 && defAl!=0 && declAl->count()>0) - { - ArgumentListIterator declAli(*declAl); - ArgumentListIterator defAli(*defAl); - const Argument *a; - for (declAli.toFirst();(a=declAli.current());++declAli) + const ArgumentList &declAl = md->declArgumentList(); + const ArgumentList &defAl = md->argumentList(); + if (declAl.size()>0) + { +// ArgumentListIterator declAli(*declAl); +// ArgumentListIterator defAli(*defAl); +// const Argument *a; +// for (declAli.toFirst();(a=declAli.current());++declAli) + auto defIt = defAl.begin(); + for (const Argument &a : declAl) { - const Argument *defArg = defAli.current(); + //const Argument *defArg = defAli.current(); + const Argument *defArg = 0; + if (defIt!=defAl.end()) + { + defArg = &(*defIt); + ++defIt; + } - if (!a->attrib.isEmpty()) + if (!a.attrib.isEmpty()) { - bindTextParameter(param_select,":attributes",a->attrib); - bindTextParameter(param_insert,":attributes",a->attrib); + bindTextParameter(param_select,":attributes",a.attrib); + bindTextParameter(param_insert,":attributes",a.attrib); } - if (!a->type.isEmpty()) + if (!a.type.isEmpty()) { StringList l; - linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->type); + linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a.type); StringListIterator li(l); QCString *s; @@ -1046,32 +1054,31 @@ static void insertMemberFunctionParams(int memberdef_id, const MemberDef *md, co insertMemberReference(src_refid,dst_refid, "argument"); ++li; } - bindTextParameter(param_select,":type",a->type); - bindTextParameter(param_insert,":type",a->type); + bindTextParameter(param_select,":type",a.type); + bindTextParameter(param_insert,":type",a.type); } - if (!a->name.isEmpty()) + if (!a.name.isEmpty()) { - bindTextParameter(param_select,":declname",a->name); - bindTextParameter(param_insert,":declname",a->name); + bindTextParameter(param_select,":declname",a.name); + bindTextParameter(param_insert,":declname",a.name); } - if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name) + if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name) { bindTextParameter(param_select,":defname",defArg->name); bindTextParameter(param_insert,":defname",defArg->name); } - if (!a->array.isEmpty()) + if (!a.array.isEmpty()) { - bindTextParameter(param_select,":array",a->array); - bindTextParameter(param_insert,":array",a->array); + bindTextParameter(param_select,":array",a.array); + bindTextParameter(param_insert,":array",a.array); } - if (!a->defval.isEmpty()) + if (!a.defval.isEmpty()) { StringList l; - linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval); - bindTextParameter(param_select,":defval",a->defval); - bindTextParameter(param_insert,":defval",a->defval); + linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a.defval); + bindTextParameter(param_select,":defval",a.defval); + bindTextParameter(param_insert,":defval",a.defval); } - if (defArg) ++defAli; int param_id=step(param_select,TRUE,TRUE); if (param_id==0) { @@ -1091,18 +1098,16 @@ static void insertMemberFunctionParams(int memberdef_id, const MemberDef *md, co static void insertMemberDefineParams(int memberdef_id,const MemberDef *md, const Definition *def) { - if (md->argumentList()->count()==0) // special case for "foo()" to - // disguish it from "foo". + if (md->argumentList().empty()) // special case for "foo()" to + // disguish it from "foo". { DBG_CTX(("no params\n")); } else { - ArgumentListIterator ali(*md->argumentList()); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : md->argumentList()) { - bindTextParameter(param_insert,":defname",a->type); + bindTextParameter(param_insert,":defname",a.type); int param_id=step(param_insert,TRUE); if (param_id==-1) { continue; @@ -1373,48 +1378,39 @@ static void writeInnerNamespaces(const NamespaceSDict *nl, struct Refid outer_re } -static void writeTemplateArgumentList(const ArgumentList * al, +static void writeTemplateArgumentList(const ArgumentList &al, const Definition * scope, const FileDef * fileScope) { - if (al) + for (const Argument &a : al) { - ArgumentListIterator ali(*al); - Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + if (!a.type.isEmpty()) { - if (!a->type.isEmpty()) - { - #warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type); - bindTextParameter(param_select,":type",a->type); - bindTextParameter(param_insert,":type",a->type); - } - if (!a->name.isEmpty()) - { - bindTextParameter(param_select,":declname",a->name); - bindTextParameter(param_insert,":declname",a->name); - bindTextParameter(param_select,":defname",a->name); - bindTextParameter(param_insert,":defname",a->name); - } - if (!a->defval.isEmpty()) - { - #warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval); - bindTextParameter(param_select,":defval",a->defval); - bindTextParameter(param_insert,":defval",a->defval); - } - if (!step(param_select,TRUE,TRUE)) - step(param_insert); +//#warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a.type); + bindTextParameter(param_select,":type",a.type); + bindTextParameter(param_insert,":type",a.type); } + if (!a.name.isEmpty()) + { + bindTextParameter(param_select,":declname",a.name); + bindTextParameter(param_insert,":declname",a.name); + bindTextParameter(param_select,":defname",a.name); + bindTextParameter(param_insert,":defname",a.name); + } + if (!a.defval.isEmpty()) + { +//#warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a.defval); + bindTextParameter(param_select,":defval",a.defval); + bindTextParameter(param_insert,":defval",a.defval); + } + if (!step(param_select,TRUE,TRUE)) + step(param_insert); } } static void writeMemberTemplateLists(const MemberDef *md) { - const ArgumentList *templMd = md->templateArguments(); - if (templMd) // function template prefix - { - writeTemplateArgumentList(templMd,md->getClassDef(),md->getFileDef()); - } + writeTemplateArgumentList(md->templateArguments(),md->getClassDef(),md->getFileDef()); } static void writeTemplateList(const ClassDef *cd) { @@ -1675,12 +1671,9 @@ static void generateSqlite3ForMember(const MemberDef *md, struct Refid scope_ref if (isFunc) { - const ArgumentList *al = md->argumentList(); - if (al!=0) - { - bindIntParameter(memberdef_insert,":const",al->constSpecifier); - bindIntParameter(memberdef_insert,":volatile",al->volatileSpecifier); - } + const ArgumentList &al = md->argumentList(); + bindIntParameter(memberdef_insert,":const",al.constSpecifier); + bindIntParameter(memberdef_insert,":volatile",al.volatileSpecifier); bindIntParameter(memberdef_insert,":explicit",md->isExplicit()); bindIntParameter(memberdef_insert,":inline",md->isInline()); bindIntParameter(memberdef_insert,":final",md->isFinal()); diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 18f6161..f498c5f 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -1183,8 +1183,6 @@ void TagFileParser::buildMemberList(const std::unique_ptr &ce,QListargs = tmi->arglist; if (!me->args.isEmpty()) { - delete me->argList; - me->argList = new ArgumentList; stringToArgumentList(me->args,me->argList); } if (tmi->enumValues.count()>0) @@ -1356,23 +1354,17 @@ void TagFileParser::buildLists(const std::unique_ptr &root) } if (tci->templateArguments) { - if (ce->tArgLists==0) - { - ce->tArgLists = new QList; - ce->tArgLists->setAutoDelete(TRUE); - } - ArgumentList *al = new ArgumentList; - ce->tArgLists->append(al); - + ArgumentList al; QListIterator sli(*tci->templateArguments); QCString *argName; for (;(argName=sli.current());++sli) { - Argument *a = new Argument; - a->type = "class"; - a->name = *argName; - al->append(a); + Argument a; + a.type = "class"; + a.name = *argName; + al.push_back(a); } + ce->tArgLists.push_back(al); } buildMemberList(ce,tci->members); diff --git a/src/tclscanner.l b/src/tclscanner.l index 3b939ce..d0fb564 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -1622,37 +1622,32 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment); static void tcl_command_ARGLIST(QCString &arglist) { D - Argument *myArg; QCStringList myArgs; QCString myArglist=""; - if (!tcl.entry_current->argList) - { - tcl.entry_current->argList=new ArgumentList; - } tcl_split_list(arglist,myArgs); for (uint i=0;iname= (*myArgs1.at(0)); - myArg->defval= (*myArgs1.at(1)); - if (myArg->defval.isEmpty()) + myArg.name= (*myArgs1.at(0)); + myArg.defval= (*myArgs1.at(1)); + if (myArg.defval.isEmpty()) { - myArg->defval = " "; + myArg.defval = " "; } - myArglist += "?" + QCString(myArg->name) + "? "; + myArglist += "?" + QCString(myArg.name) + "? "; } else { - myArg->name= (*myArgs.at(i)); - myArglist += myArg->name + " "; + myArg.name= (*myArgs.at(i)); + myArglist += myArg.name + " "; } - tcl.entry_current->argList->append(myArg); + tcl.entry_current->argList.push_back(myArg); } arglist = myArglist; tcl.entry_current->args = arglist; diff --git a/src/util.cpp b/src/util.cpp index e1e9fb5..1aba32b 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -540,7 +540,7 @@ const ClassDef *newResolveTypedef(const FileDef *fileScope, const MemberDef **pMemType, QCString *pTemplSpec, QCString *pResolvedType, - ArgumentList *actTemplParams) + const ArgumentList *actTemplParams) { //printf("newResolveTypedef(md=%p,cachedVal=%p)\n",md,md->getCachedTypedefVal()); bool isCached = md->isTypedefValCached(); // value already cached @@ -563,11 +563,11 @@ const ClassDef *newResolveTypedef(const FileDef *fileScope, const ClassDef *typeClass = md->getClassDef(); QCString type = md->typeString(); // get the "value" of the typedef - if (typeClass && typeClass->isTemplate() && - actTemplParams && actTemplParams->count()>0) + if (typeClass && typeClass->isTemplate() && + actTemplParams && !actTemplParams->empty()) { type = substituteTemplateArgumentsInString(type, - typeClass->templateArguments(),actTemplParams); + typeClass->templateArguments(),*actTemplParams); } QCString typedefValue = type; int tl=type.length(); @@ -1397,7 +1397,7 @@ static const ClassDef *getResolvedClassRec(const Definition *scope, ArgumentList actTemplParams; if (!strippedTemplateParams.isEmpty()) // template part that was stripped { - stringToArgumentList(strippedTemplateParams,&actTemplParams); + stringToArgumentList(strippedTemplateParams,actTemplParams); } int qualifierIndex = computeQualifiedIndex(name); @@ -2260,17 +2260,15 @@ void writeExample(OutputList &ol,ExampleSDict *ed) } -QCString argListToString(const ArgumentList *al,bool useCanonicalType,bool showDefVals) +QCString argListToString(const ArgumentList &al,bool useCanonicalType,bool showDefVals) { QCString result; - if (al==0) return result; - ArgumentListIterator ali(*al); - const Argument *a=ali.current(); + if (!al.hasParameters()) return result; result+="("; - while (a) + for (auto it = al.begin() ; it!=al.end() ;) { - QCString type1 = useCanonicalType && !a->canType.isEmpty() ? - a->canType : a->type; + Argument a = *it; + QCString type1 = useCanonicalType && !a.canType.isEmpty() ? a.canType : a.type; QCString type2; int i=type1.find(")("); // hack to deal with function pointers if (i!=-1) @@ -2278,86 +2276,84 @@ QCString argListToString(const ArgumentList *al,bool useCanonicalType,bool showD type2=type1.mid(i); type1=type1.left(i); } - if (!a->attrib.isEmpty()) + if (!a.attrib.isEmpty()) { - result+=a->attrib+" "; + result+=a.attrib+" "; } - if (!a->name.isEmpty() || !a->array.isEmpty()) + if (!a.name.isEmpty() || !a.array.isEmpty()) { - result+= type1+" "+a->name+type2+a->array; + result+= type1+" "+a.name+type2+a.array; } else { result+= type1+type2; } - if (!a->defval.isEmpty() && showDefVals) + if (!a.defval.isEmpty() && showDefVals) { - result+="="+a->defval; + result+="="+a.defval; } - ++ali; - a = ali.current(); - if (a) result+=", "; + ++it; + if (it!=al.end()) result+=", "; } result+=")"; - if (al->constSpecifier) result+=" const"; - if (al->volatileSpecifier) result+=" volatile"; - if (al->refQualifier==RefQualifierLValue) result+=" &"; - else if (al->refQualifier==RefQualifierRValue) result+=" &&"; - if (!al->trailingReturnType.isEmpty()) result+=" -> "+al->trailingReturnType; - if (al->pureSpecifier) result+=" =0"; + if (al.constSpecifier) result+=" const"; + if (al.volatileSpecifier) result+=" volatile"; + if (al.refQualifier==RefQualifierLValue) result+=" &"; + else if (al.refQualifier==RefQualifierRValue) result+=" &&"; + if (!al.trailingReturnType.isEmpty()) result+=" -> "+al.trailingReturnType; + if (al.pureSpecifier) result+=" =0"; return removeRedundantWhiteSpace(result); } -QCString tempArgListToString(const ArgumentList *al,SrcLangExt lang) +QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang) { QCString result; - if (al==0) return result; + if (al.empty()) return result; result="<"; - ArgumentListIterator ali(*al); - const Argument *a=ali.current(); - while (a) + auto it = al.begin(); + while (it!=al.end()) { - if (!a->name.isEmpty()) // add template argument name + Argument a = *it; + if (!a.name.isEmpty()) // add template argument name { - if (a->type.left(4)=="out") // C# covariance + if (a.type.left(4)=="out") // C# covariance { result+="out "; } - else if (a->type.left(3)=="in") // C# contravariance + else if (a.type.left(3)=="in") // C# contravariance { result+="in "; } if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp) { - result+=a->type+" "; + result+=a.type+" "; } - result+=a->name; + result+=a.name; } else // extract name from type { - int i=a->type.length()-1; - while (i>=0 && isId(a->type.at(i))) i--; + int i=a.type.length()-1; + while (i>=0 && isId(a.type.at(i))) i--; if (i>0) { - result+=a->type.right(a->type.length()-i-1); - if (a->type.find("...")!=-1) + result+=a.type.right(a.type.length()-i-1); + if (a.type.find("...")!=-1) { result+="..."; } } else // nothing found -> take whole name { - result+=a->type; + result+=a.type; } } - if (!a->typeConstraint.isEmpty() && lang==SrcLangExt_Java) + if (!a.typeConstraint.isEmpty() && lang==SrcLangExt_Java) { result+=" extends "; // TODO: now Java specific, C# has where... - result+=a->typeConstraint; + result+=a.typeConstraint; } - ++ali; - a=ali.current(); - if (a) result+=", "; + ++it; + if (it!=al.end()) result+=", "; } result+=">"; return removeRedundantWhiteSpace(result); @@ -2705,19 +2701,6 @@ exit: return prot; } -//static void printArgList(ArgumentList *al) -//{ -// if (al==0) return; -// ArgumentListIterator ali(*al); -// Argument *a; -// printf("("); -// for (;(a=ali.current());++ali) -// { -// printf("t='%s' n='%s' v='%s' ",a->type.data(),!a->name.isEmpty()>0?a->name.data():"",!a->defval.isEmpty()>0?a->defval.data():""); -// } -// printf(")"); -//} - #ifndef NEWMATCH // strip any template specifiers that follow className in string s static QCString trimTemplateSpecifiers( @@ -3311,138 +3294,6 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, return TRUE; } - -/*! - * Matches the arguments list srcAl with the argument list dstAl - * Returns TRUE if the argument lists are equal. Two argument list are - * considered equal if the number of arguments is equal and the types of all - * arguments are equal. Furthermore the const and volatile specifiers - * stored in the list should be equal. - */ -bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, - const char *cl,const char *ns,bool checkCV, - NamespaceSDict *usingNamespaces, - SDict *usingClasses) -{ - QCString className=cl; - QCString namespaceName=ns; - - // strip template specialization from class name if present - //int til=className.find('<'),tir=className.find('>'); - //if (til!=-1 && tir!=-1 && tir>til) - //{ - // className=className.left(til)+className.right(className.length()-tir-1); - //} - - //printf("matchArguments(%s,%s) className=%s namespaceName=%s checkCV=%d usingNamespaces=%d usingClasses=%d\n", - // srcAl ? argListToString(srcAl).data() : "", - // dstAl ? argListToString(dstAl).data() : "", - // cl,ns,checkCV, - // usingNamespaces?usingNamespaces->count():0, - // usingClasses?usingClasses->count():0 - // ); - - if (srcAl==0 || dstAl==0) - { - bool match = srcAl==dstAl; // at least one of the members is not a function - if (match) - { - MATCH - return TRUE; - } - else - { - NOMATCH - return FALSE; - } - } - - // handle special case with void argument - if ( srcAl->count()==0 && dstAl->count()==1 && - dstAl->getFirst()->type=="void" ) - { // special case for finding match between func() and func(void) - Argument *a=new Argument; - a->type = "void"; - srcAl->append(a); - MATCH - return TRUE; - } - if ( dstAl->count()==0 && srcAl->count()==1 && - srcAl->getFirst()->type=="void" ) - { // special case for finding match between func(void) and func() - Argument *a=new Argument; - a->type = "void"; - dstAl->append(a); - MATCH - return TRUE; - } - - if (srcAl->count() != dstAl->count()) - { - NOMATCH - return FALSE; // different number of arguments -> no match - } - - if (checkCV) - { - if (srcAl->constSpecifier != dstAl->constSpecifier) - { - NOMATCH - return FALSE; // one member is const, the other not -> no match - } - if (srcAl->volatileSpecifier != dstAl->volatileSpecifier) - { - NOMATCH - return FALSE; // one member is volatile, the other not -> no match - } - } - - if (srcAl->refQualifier != dstAl->refQualifier) - { - NOMATCH - return FALSE; // one member is has a different ref-qualifier than the other - } - - // so far the argument list could match, so we need to compare the types of - // all arguments. - ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl); - Argument *srcA,*dstA; - for (;(srcA=srcAli.current()) && (dstA=dstAli.current());++srcAli,++dstAli) - { - if (!matchArgument(srcA,dstA,className,namespaceName, - usingNamespaces,usingClasses)) - { - NOMATCH - return FALSE; - } - } - MATCH - return TRUE; // all arguments match -} - -#endif - -#if 0 -static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templSpec) -{ - ASSERT(symbol!=0); - if (symbol->definitionType()==Definition::TypeMember && - ((MemberDef*)symbol)->isTypedef()) // if symbol is a typedef then try - // to resolve it - { - MemberDef *md = 0; - ClassDef *cd = newResolveTypedef(fs,(MemberDef*)symbol,&md,&templSpec); - if (cd) - { - return cd->qualifiedName()+templSpec; - } - else if (md) - { - return md->qualifiedName(); - } - } - return symbol->qualifiedName(); -} #endif static QCString stripDeclKeywords(const QCString &s) @@ -3688,10 +3539,10 @@ static QCString extractCanonicalType(const Definition *d,const FileDef *fs,QCStr return removeRedundantWhiteSpace(canType); } -static QCString extractCanonicalArgType(const Definition *d,const FileDef *fs,const Argument *arg) +static QCString extractCanonicalArgType(const Definition *d,const FileDef *fs,const Argument &arg) { - QCString type = arg->type.stripWhiteSpace(); - QCString name = arg->name; + QCString type = arg.type.stripWhiteSpace(); + QCString name = arg.name; //printf("----- extractCanonicalArgType(type=%s,name=%s)\n",type.data(),name.data()); if ((type=="const" || type=="volatile") && !name.isEmpty()) { // name is part of type => correct @@ -3703,17 +3554,17 @@ static QCString extractCanonicalArgType(const Definition *d,const FileDef *fs,co if (!type.isEmpty()) type+=" "; type+=name; } - if (!arg->array.isEmpty()) + if (!arg.array.isEmpty()) { - type+=arg->array; + type+=arg.array; } return extractCanonicalType(d,fs,type); } static bool matchArgument2( - const Definition *srcScope,const FileDef *srcFileScope,Argument *srcA, - const Definition *dstScope,const FileDef *dstFileScope,Argument *dstA + const Definition *srcScope,const FileDef *srcFileScope,Argument &srcA, + const Definition *dstScope,const FileDef *dstFileScope,Argument &dstA ) { //printf(">> match argument: %s::'%s|%s' (%s) <-> %s::'%s|%s' (%s)\n", @@ -3727,37 +3578,37 @@ static bool matchArgument2( // NOMATCH // return FALSE; //} - QCString sSrcName = " "+srcA->name; - QCString sDstName = " "+dstA->name; - QCString srcType = srcA->type; - QCString dstType = dstA->type; + QCString sSrcName = " "+srcA.name; + QCString sDstName = " "+dstA.name; + QCString srcType = srcA.type; + QCString dstType = dstA.type; stripIrrelevantConstVolatile(srcType); stripIrrelevantConstVolatile(dstType); //printf("'%s'<->'%s'\n",sSrcName.data(),dstType.right(sSrcName.length()).data()); //printf("'%s'<->'%s'\n",sDstName.data(),srcType.right(sDstName.length()).data()); if (sSrcName==dstType.right(sSrcName.length())) { // case "unsigned int" <-> "unsigned int i" - srcA->type+=sSrcName; - srcA->name=""; - srcA->canType=""; // invalidate cached type value + srcA.type+=sSrcName; + srcA.name=""; + srcA.canType=""; // invalidate cached type value } else if (sDstName==srcType.right(sDstName.length())) { // case "unsigned int i" <-> "unsigned int" - dstA->type+=sDstName; - dstA->name=""; - dstA->canType=""; // invalidate cached type value + dstA.type+=sDstName; + dstA.name=""; + dstA.canType=""; // invalidate cached type value } - if (srcA->canType.isEmpty()) + if (srcA.canType.isEmpty()) { - srcA->canType = extractCanonicalArgType(srcScope,srcFileScope,srcA); + srcA.canType = extractCanonicalArgType(srcScope,srcFileScope,srcA); } - if (dstA->canType.isEmpty()) + if (dstA.canType.isEmpty()) { - dstA->canType = extractCanonicalArgType(dstScope,dstFileScope,dstA); + dstA.canType = extractCanonicalArgType(dstScope,dstFileScope,dstA); } - if (srcA->canType==dstA->canType) + if (srcA.canType==dstA.canType) { MATCH return TRUE; @@ -3773,49 +3624,34 @@ static bool matchArgument2( // new algorithm for argument matching -bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList *srcAl, - const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList *dstAl, +bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList &inSrcAl, + const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList &inDstAl, bool checkCV) { - //printf("*** matchArguments2\n"); ASSERT(srcScope!=0 && dstScope!=0); - if (srcAl==0 || dstAl==0) - { - bool match = srcAl==dstAl; // at least one of the members is not a function - if (match) - { - MATCH - return TRUE; - } - else - { - NOMATCH - return FALSE; - } - } + ArgumentList srcAl = inSrcAl; + ArgumentList dstAl = inDstAl; // handle special case with void argument - if ( srcAl->count()==0 && dstAl->count()==1 && - dstAl->getFirst()->type=="void" ) + if ( srcAl.empty() && dstAl.size()==1 && dstAl.front().type=="void" ) { // special case for finding match between func() and func(void) - Argument *a=new Argument; - a->type = "void"; - const_cast(srcAl)->append(a); + Argument a; + a.type = "void"; + srcAl.push_back(a); MATCH return TRUE; } - if ( dstAl->count()==0 && srcAl->count()==1 && - srcAl->getFirst()->type=="void" ) + if ( dstAl.empty() && srcAl.size()==1 && srcAl.front().type=="void" ) { // special case for finding match between func(void) and func() - Argument *a=new Argument; - a->type = "void"; - const_cast(dstAl)->append(a); + Argument a; + a.type = "void"; + dstAl.push_back(a); MATCH return TRUE; } - if (srcAl->count() != dstAl->count()) + if (srcAl.size() != dstAl.size()) { NOMATCH return FALSE; // different number of arguments -> no match @@ -3823,19 +3659,19 @@ bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,cons if (checkCV) { - if (srcAl->constSpecifier != dstAl->constSpecifier) + if (srcAl.constSpecifier != dstAl.constSpecifier) { NOMATCH return FALSE; // one member is const, the other not -> no match } - if (srcAl->volatileSpecifier != dstAl->volatileSpecifier) + if (srcAl.volatileSpecifier != dstAl.volatileSpecifier) { NOMATCH return FALSE; // one member is volatile, the other not -> no match } } - if (srcAl->refQualifier != dstAl->refQualifier) + if (srcAl.refQualifier != dstAl.refQualifier) { NOMATCH return FALSE; // one member is has a different ref-qualifier than the other @@ -3843,10 +3679,12 @@ bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,cons // so far the argument list could match, so we need to compare the types of // all arguments. - ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl); - Argument *srcA,*dstA; - for (;(srcA=srcAli.current()) && (dstA=dstAli.current());++srcAli,++dstAli) - { + auto srcIt = srcAl.begin(); + auto dstIt = dstAl.begin(); + for (;srcIt!=srcAl.end() && dstIt!=dstAl.end();++srcIt,++dstIt) + { + Argument &srcA = *srcIt; + Argument &dstA = *dstIt; if (!matchArgument2(srcScope,srcFileScope,srcA, dstScope,dstFileScope,dstA) ) @@ -3863,134 +3701,139 @@ bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,cons // merges the initializer of two argument lists // pre: the types of the arguments in the list should match. -void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwrite) +void mergeArguments(ArgumentList &srcAl,ArgumentList &dstAl,bool forceNameOverwrite) { //printf("mergeArguments '%s', '%s'\n", // argListToString(srcAl).data(),argListToString(dstAl).data()); - if (srcAl==0 || dstAl==0 || srcAl->count()!=dstAl->count()) + if (srcAl.size()!=dstAl.size()) { return; // invalid argument lists -> do not merge } - ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl); - Argument *srcA,*dstA; - for (;(srcA=srcAli.current()) && (dstA=dstAli.current());++srcAli,++dstAli) + auto srcIt=srcAl.begin(); + auto dstIt=dstAl.begin(); + while (srcIt!=srcAl.end() && dstIt!=dstAl.end()) { - if (srcA->defval.isEmpty() && !dstA->defval.isEmpty()) + Argument &srcA = *srcIt; + Argument &dstA = *dstIt; + + if (srcA.defval.isEmpty() && !dstA.defval.isEmpty()) { - //printf("Defval changing '%s'->'%s'\n",srcA->defval.data(),dstA->defval.data()); - srcA->defval=dstA->defval.copy(); + //printf("Defval changing '%s'->'%s'\n",srcA.defval.data(),dstA.defval.data()); + srcA.defval=dstA.defval; } - else if (!srcA->defval.isEmpty() && dstA->defval.isEmpty()) + else if (!srcA.defval.isEmpty() && dstA.defval.isEmpty()) { - //printf("Defval changing '%s'->'%s'\n",dstA->defval.data(),srcA->defval.data()); - dstA->defval=srcA->defval.copy(); + //printf("Defval changing '%s'->'%s'\n",dstA.defval.data(),srcA.defval.data()); + dstA.defval=srcA.defval; } // fix wrongly detected const or volatile specifiers before merging. // example: "const A *const" is detected as type="const A *" name="const" - if (srcA->name=="const" || srcA->name=="volatile") + if (srcA.name=="const" || srcA.name=="volatile") { - srcA->type+=" "+srcA->name; - srcA->name.resize(0); + srcA.type+=" "+srcA.name; + srcA.name.resize(0); } - if (dstA->name=="const" || dstA->name=="volatile") + if (dstA.name=="const" || dstA.name=="volatile") { - dstA->type+=" "+dstA->name; - dstA->name.resize(0); + dstA.type+=" "+dstA.name; + dstA.name.resize(0); } - if (srcA->type==dstA->type) + if (srcA.type==dstA.type) { - //printf("1. merging %s:%s <-> %s:%s\n",srcA->type.data(),srcA->name.data(),dstA->type.data(),dstA->name.data()); - if (srcA->name.isEmpty() && !dstA->name.isEmpty()) + //printf("1. merging %s:%s <-> %s:%s\n",srcA.type.data(),srcA.name.data(),dstA.type.data(),dstA.name.data()); + if (srcA.name.isEmpty() && !dstA.name.isEmpty()) { - //printf("type: '%s':='%s'\n",srcA->type.data(),dstA->type.data()); - //printf("name: '%s':='%s'\n",srcA->name.data(),dstA->name.data()); - srcA->type = dstA->type.copy(); - srcA->name = dstA->name.copy(); + //printf("type: '%s':='%s'\n",srcA.type.data(),dstA.type.data()); + //printf("name: '%s':='%s'\n",srcA.name.data(),dstA.name.data()); + srcA.type = dstA.type; + srcA.name = dstA.name; } - else if (!srcA->name.isEmpty() && dstA->name.isEmpty()) + else if (!srcA.name.isEmpty() && dstA.name.isEmpty()) { - //printf("type: '%s':='%s'\n",dstA->type.data(),srcA->type.data()); - //printf("name: '%s':='%s'\n",dstA->name.data(),srcA->name.data()); - dstA->type = srcA->type.copy(); - dstA->name = dstA->name.copy(); + //printf("type: '%s':='%s'\n",dstA.type.data(),srcA.type.data()); + //printf("name: '%s':='%s'\n",dstA.name.data(),srcA.name.data()); + dstA.type = srcA.type; + dstA.name = dstA.name; } - else if (!srcA->name.isEmpty() && !dstA->name.isEmpty()) + else if (!srcA.name.isEmpty() && !dstA.name.isEmpty()) { - //printf("srcA->name=%s dstA->name=%s\n",srcA->name.data(),dstA->name.data()); + //printf("srcA.name=%s dstA.name=%s\n",srcA.name.data(),dstA.name.data()); if (forceNameOverwrite) { - srcA->name = dstA->name; + srcA.name = dstA.name; } else { - if (srcA->docs.isEmpty() && !dstA->docs.isEmpty()) + if (srcA.docs.isEmpty() && !dstA.docs.isEmpty()) { - srcA->name = dstA->name; + srcA.name = dstA.name; } - else if (!srcA->docs.isEmpty() && dstA->docs.isEmpty()) + else if (!srcA.docs.isEmpty() && dstA.docs.isEmpty()) { - dstA->name = srcA->name; + dstA.name = srcA.name; } } } } else { - //printf("2. merging '%s':'%s' <-> '%s':'%s'\n",srcA->type.data(),srcA->name.data(),dstA->type.data(),dstA->name.data()); - srcA->type=srcA->type.stripWhiteSpace(); - dstA->type=dstA->type.stripWhiteSpace(); - if (srcA->type+" "+srcA->name==dstA->type) // "unsigned long:int" <-> "unsigned long int:bla" + //printf("2. merging '%s':'%s' <-> '%s':'%s'\n",srcA.type.data(),srcA.name.data(),dstA.type.data(),dstA.name.data()); + srcA.type=srcA.type.stripWhiteSpace(); + dstA.type=dstA.type.stripWhiteSpace(); + if (srcA.type+" "+srcA.name==dstA.type) // "unsigned long:int" <-> "unsigned long int:bla" { - srcA->type+=" "+srcA->name; - srcA->name=dstA->name; + srcA.type+=" "+srcA.name; + srcA.name=dstA.name; } - else if (dstA->type+" "+dstA->name==srcA->type) // "unsigned long int bla" <-> "unsigned long int" + else if (dstA.type+" "+dstA.name==srcA.type) // "unsigned long int bla" <-> "unsigned long int" { - dstA->type+=" "+dstA->name; - dstA->name=srcA->name; + dstA.type+=" "+dstA.name; + dstA.name=srcA.name; } - else if (srcA->name.isEmpty() && !dstA->name.isEmpty()) + else if (srcA.name.isEmpty() && !dstA.name.isEmpty()) { - srcA->name = dstA->name; + srcA.name = dstA.name; } - else if (dstA->name.isEmpty() && !srcA->name.isEmpty()) + else if (dstA.name.isEmpty() && !srcA.name.isEmpty()) { - dstA->name = srcA->name; + dstA.name = srcA.name; } } - int i1=srcA->type.find("::"), - i2=dstA->type.find("::"), - j1=srcA->type.length()-i1-2, - j2=dstA->type.length()-i2-2; - if (i1!=-1 && i2==-1 && srcA->type.right(j1)==dstA->type) + int i1=srcA.type.find("::"), + i2=dstA.type.find("::"), + j1=srcA.type.length()-i1-2, + j2=dstA.type.length()-i2-2; + if (i1!=-1 && i2==-1 && srcA.type.right(j1)==dstA.type) { - //printf("type: '%s':='%s'\n",dstA->type.data(),srcA->type.data()); - //printf("name: '%s':='%s'\n",dstA->name.data(),srcA->name.data()); - dstA->type = srcA->type.left(i1+2)+dstA->type; - dstA->name = dstA->name.copy(); + //printf("type: '%s':='%s'\n",dstA.type.data(),srcA.type.data()); + //printf("name: '%s':='%s'\n",dstA.name.data(),srcA.name.data()); + dstA.type = srcA.type.left(i1+2)+dstA.type; + dstA.name = dstA.name; } - else if (i1==-1 && i2!=-1 && dstA->type.right(j2)==srcA->type) + else if (i1==-1 && i2!=-1 && dstA.type.right(j2)==srcA.type) { - //printf("type: '%s':='%s'\n",srcA->type.data(),dstA->type.data()); - //printf("name: '%s':='%s'\n",dstA->name.data(),srcA->name.data()); - srcA->type = dstA->type.left(i2+2)+srcA->type; - srcA->name = dstA->name.copy(); + //printf("type: '%s':='%s'\n",srcA.type.data(),dstA.type.data()); + //printf("name: '%s':='%s'\n",dstA.name.data(),srcA.name.data()); + srcA.type = dstA.type.left(i2+2)+srcA.type; + srcA.name = dstA.name; } - if (srcA->docs.isEmpty() && !dstA->docs.isEmpty()) + if (srcA.docs.isEmpty() && !dstA.docs.isEmpty()) { - srcA->docs = dstA->docs.copy(); + srcA.docs = dstA.docs; } - else if (dstA->docs.isEmpty() && !srcA->docs.isEmpty()) + else if (dstA.docs.isEmpty() && !srcA.docs.isEmpty()) { - dstA->docs = srcA->docs.copy(); + dstA.docs = srcA.docs; } //printf("Merge argument '%s|%s' '%s|%s'\n", - // srcA->type.data(),srcA->name.data(), - // dstA->type.data(),dstA->name.data()); + // srcA.type.data(),srcA.name.data(), + // dstA.type.data(),dstA.name.data()); + ++srcIt; + ++dstIt; } } @@ -4023,14 +3866,13 @@ static void findMembersWithSpecificName(MemberName *mn, ArgumentList *argList=0; if (args && !md->isDefine() && qstrcmp(args,"()")!=0) { - argList=new ArgumentList; - const ArgumentList *mdAl = md->argumentList(); + const ArgumentList &mdAl = md->argumentList(); + ArgumentList argList; stringToArgumentList(args,argList); match=matchArguments2( md->getOuterScope(),fd,mdAl, Doxygen::globalScope,fd,argList, - checkCV); - delete argList; argList=0; + checkCV); } if (match && (forceTagFile==0 || md->getReference()==forceTagFile)) { @@ -4154,22 +3996,20 @@ bool getDefs(const QCString &scName, MemberNameIterator mmli(*mn); MemberDef *mmd; int mdist=maxInheritanceDepth; - ArgumentList *argList=0; + ArgumentList argList; if (args) { - argList=new ArgumentList; stringToArgumentList(args,argList); } for (mmli.toFirst();(mmd=mmli.current());++mmli) { if (!mmd->isStrongEnumValue()) { - ArgumentList *mmdAl = mmd->argumentList(); - bool match=args==0 || + const ArgumentList &mmdAl = mmd->argumentList(); + bool match=args==0 || matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl, - fcd,fcd->getFileDef(),argList, - checkCV - ); + fcd, fcd->getFileDef(),argList, + checkCV); //printf("match=%d\n",match); if (match) { @@ -4187,10 +4027,6 @@ bool getDefs(const QCString &scName, } } } - if (argList) - { - delete argList; argList=0; - } if (mdist==maxInheritanceDepth && args && qstrcmp(args,"()")==0) // no exact match found, but if args="()" an arbitrary member will do { @@ -4277,33 +4113,43 @@ bool getDefs(const QCString &scName, //printf("Global symbol\n"); MemberNameIterator mmli(*mn); MemberDef *mmd, *fuzzy_mmd = 0; - ArgumentList *argList = 0; + ArgumentList argList; bool hasEmptyArgs = args && qstrcmp(args, "()") == 0; if (args) - stringToArgumentList(args, argList = new ArgumentList); + { + stringToArgumentList(args, argList); + } for (mmli.toFirst(); (mmd = mmli.current()); ++mmli) { if (!mmd->isLinkable() || (!mmd->isRelated() && !mmd->isForeign()) || !mmd->getClassDef()) + { continue; + } - if (!args) break; + if (!args) + { + break; + } - ArgumentList *mmdAl = mmd->argumentList(); + ArgumentList &mmdAl = mmd->argumentList(); if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl, Doxygen::globalScope,mmd->getFileDef(),argList, checkCV ) - ) break; + ) + { + break; + } if (!fuzzy_mmd && hasEmptyArgs) + { fuzzy_mmd = mmd; + } } - if (argList) delete argList, argList = 0; - mmd = mmd ? mmd : fuzzy_mmd; if (mmd && !mmd->isStrongEnumValue()) @@ -4371,16 +4217,15 @@ bool getDefs(const QCString &scName, else if (mmd->getOuterScope()==fnd /* && mmd->isLinkable() */ ) { // namespace is found bool match=TRUE; - ArgumentList *argList=0; + ArgumentList argList; if (args && qstrcmp(args,"()")!=0) { - argList=new ArgumentList; - const ArgumentList *mmdAl = mmd->argumentList(); + const ArgumentList &mmdAl = mmd->argumentList(); stringToArgumentList(args,argList); match=matchArguments2( mmd->getOuterScope(),mmd->getFileDef(),mmdAl, fnd,mmd->getFileDef(),argList, - checkCV); + checkCV); } if (match) { @@ -4388,10 +4233,6 @@ bool getDefs(const QCString &scName, md=mmd; found=TRUE; } - if (args) - { - delete argList; argList=0; - } } } if (!found && args && !qstrcmp(args,"()")) @@ -5820,10 +5661,10 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te int si,pi=0; ClassDef *cd=0; while ( - (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) && - ((cd=getClass(scope.left(si)))==0 || cd->templateArguments()==0) - ) - { + (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) && + ((cd=getClass(scope.left(si)))==0 || cd->templateArguments().empty()) + ) + { //printf("Tried '%s'\n",(scope.left(si)+templ).data()); pi=si+2; } @@ -6429,7 +6270,7 @@ int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCStri QCString normalizeNonTemplateArgumentsInString( const QCString &name, const Definition *context, - const ArgumentList * formalArgs) + const ArgumentList &formalArgs) { // skip until < int p=name.find('<'); @@ -6445,16 +6286,12 @@ QCString normalizeNonTemplateArgumentsInString( result += name.mid(p,i-p); QCString n = name.mid(i,l); bool found=FALSE; - if (formalArgs) // check that n is not a formal template argument + for (const Argument formArg : formalArgs) { - ArgumentListIterator formAli(*formalArgs); - const Argument *formArg; - for (formAli.toFirst(); - (formArg=formAli.current()) && !found; - ++formAli - ) + if (formArg.name == n) { - found = formArg->name==n; + found=TRUE; + break; } } if (!found) @@ -6490,12 +6327,12 @@ QCString normalizeNonTemplateArgumentsInString( */ QCString substituteTemplateArgumentsInString( const QCString &name, - ArgumentList *formalArgs, - ArgumentList *actualArgs) + const ArgumentList &formalArgs, + const ArgumentList &actualArgs) { //printf("substituteTemplateArgumentsInString(name=%s formal=%s actualArg=%s)\n", // name.data(),argListToString(formalArgs).data(),argListToString(actualArgs).data()); - if (formalArgs==0) return name; + if (formalArgs.empty()) return name; QCString result; static QRegExp re("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9\\x80-\\xFF]*"); int p=0,l,i; @@ -6504,82 +6341,89 @@ QCString substituteTemplateArgumentsInString( { result += name.mid(p,i-p); QCString n = name.mid(i,l); - ArgumentListIterator formAli(*formalArgs); - ArgumentListIterator actAli(*actualArgs); - Argument *formArg; - Argument *actArg; + auto formIt = formalArgs.begin(); + auto actIt = actualArgs.begin(); // if n is a template argument, then we substitute it // for its template instance argument. bool found=FALSE; - for (formAli.toFirst(); - (formArg=formAli.current()) && !found; - ++formAli,++actAli + for (auto formIt = formalArgs.begin(); + formIt!=formalArgs.end() && !found; + ++formIt ) { - actArg = actAli.current(); - if (formArg->type.left(6)=="class " && formArg->name.isEmpty()) + Argument formArg = *formIt; + Argument actArg; + if (actIt!=actualArgs.end()) { - formArg->name = formArg->type.mid(6); - formArg->type = "class"; + actArg = *actIt; } - if (formArg->type.left(9)=="typename " && formArg->name.isEmpty()) + if (formArg.type.left(6)=="class " && formArg.name.isEmpty()) { - formArg->name = formArg->type.mid(9); - formArg->type = "typename"; + formArg.name = formArg.type.mid(6); + formArg.type = "class"; } - if (formArg->type=="class" || formArg->type=="typename" || formArg->type.left(8)=="template") + if (formArg.type.left(9)=="typename " && formArg.name.isEmpty()) + { + formArg.name = formArg.type.mid(9); + formArg.type = "typename"; + } + if (formArg.type=="class" || formArg.type=="typename" || formArg.type.left(8)=="template") { //printf("n=%s formArg->type='%s' formArg->name='%s' formArg->defval='%s'\n", // n.data(),formArg->type.data(),formArg->name.data(),formArg->defval.data()); //printf(">> formArg->name='%s' actArg->type='%s' actArg->name='%s'\n", // formArg->name.data(),actArg ? actArg->type.data() : "",actArg ? actArg->name.data() : "" // ); - if (formArg->name==n && actArg && !actArg->type.isEmpty()) // base class is a template argument + if (formArg.name==n && actIt!=actualArgs.end() && !actArg.type.isEmpty()) // base class is a template argument { // replace formal argument with the actual argument of the instance - if (!leftScopeMatch(actArg->type,n)) + if (!leftScopeMatch(actArg.type,n)) // the scope guard is to prevent recursive lockup for // template class C : public, // where A::T would become A::T::T here, // since n==A and actArg->type==A::T // see bug595833 for an example { - if (actArg->name.isEmpty()) + if (actArg.name.isEmpty()) { - result += actArg->type+" "; + result += actArg.type+" "; found=TRUE; } else // for case where the actual arg is something like "unsigned int" // the "int" part is in actArg->name. { - result += actArg->type+" "+actArg->name+" "; + result += actArg.type+" "+actArg.name+" "; found=TRUE; } } } - else if (formArg->name==n && - actArg==0 && - !formArg->defval.isEmpty() && - formArg->defval!=name /* to prevent recursion */ + else if (formArg.name==n && + actIt==actualArgs.end() && + !formArg.defval.isEmpty() && + formArg.defval!=name /* to prevent recursion */ ) { - result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" "; + result += substituteTemplateArgumentsInString(formArg.defval,formalArgs,actualArgs)+" "; found=TRUE; } } - else if (formArg->name==n && - actArg==0 && - !formArg->defval.isEmpty() && - formArg->defval!=name /* to prevent recursion */ + else if (formArg.name==n && + actIt==actualArgs.end() && + !formArg.defval.isEmpty() && + formArg.defval!=name /* to prevent recursion */ ) { - result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" "; + result += substituteTemplateArgumentsInString(formArg.defval,formalArgs,actualArgs)+" "; found=TRUE; } + if (actIt!=actualArgs.end()) + { + actIt++; + } } - if (!found) + if (!found) { result += n; } @@ -6591,6 +6435,7 @@ QCString substituteTemplateArgumentsInString( return result.stripWhiteSpace(); } +#if 0 /*! Makes a deep copy of the list of argument lists \a srcLists. * Will allocate memory, that is owned by the caller. */ @@ -6607,6 +6452,7 @@ QList *copyArgumentLists(const QList *srcLists) } return dstLists; } +#endif /*! Strips template specifiers from scope \a fullName, except those * that make up specialized classes. The switch \a parentOnly @@ -8045,22 +7891,20 @@ QCString expandAlias(const QCString &aliasName,const QCString &aliasValue) return result; } -void writeTypeConstraints(OutputList &ol,const Definition *d,const ArgumentList *al) +void writeTypeConstraints(OutputList &ol,const Definition *d,const ArgumentList &al) { - if (al==0) return; + if (al.empty()) return; ol.startConstraintList(theTranslator->trTypeConstraints()); - ArgumentListIterator ali(*al); - const Argument *a; - for (;(a=ali.current());++ali) + for (const Argument &a : al) { ol.startConstraintParam(); - ol.parseText(a->name); + ol.parseText(a.name); ol.endConstraintParam(); ol.startConstraintType(); - linkifyText(TextGeneratorOLImpl(ol),d,0,0,a->type); + linkifyText(TextGeneratorOLImpl(ol),d,0,0,a.type); ol.endConstraintType(); ol.startConstraintDocs(); - ol.generateDoc(d->docFile(),d->docLine(),d,0,a->docs,TRUE,FALSE); + ol.generateDoc(d->docFile(),d->docLine(),d,0,a.docs,TRUE,FALSE); ol.endConstraintDocs(); } ol.endConstraintList(); diff --git a/src/util.h b/src/util.h index cb2b957..dea6b22 100644 --- a/src/util.h +++ b/src/util.h @@ -186,12 +186,12 @@ void writePageRef(OutputDocInterface &od,const char *cn,const char *mn); QCString getCanonicalTemplateSpec(const Definition *d,const FileDef *fs,const QCString& spec); -bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList *srcAl, - const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList *dstAl, +bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList &srcAl, + const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList &dstAl, bool checkCV ); -void mergeArguments(ArgumentList *,ArgumentList *,bool forceNameOverwrite=FALSE); +void mergeArguments(ArgumentList &,ArgumentList &,bool forceNameOverwrite=FALSE); QCString substituteClassNames(const QCString &s); @@ -232,9 +232,9 @@ inline bool isId(int c) QCString removeRedundantWhiteSpace(const QCString &s); -QCString argListToString(const ArgumentList *al,bool useCanonicalType=FALSE,bool showDefVals=TRUE); +QCString argListToString(const ArgumentList &al,bool useCanonicalType=FALSE,bool showDefVals=TRUE); -QCString tempArgListToString(const ArgumentList *al,SrcLangExt lang); +QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang); QCString generateMarker(int id); @@ -305,14 +305,14 @@ int extractClassNameFromType(const QCString &type,int &pos, QCString normalizeNonTemplateArgumentsInString( const QCString &name, const Definition *context, - const ArgumentList *formalArgs); + const ArgumentList &formalArgs); QCString substituteTemplateArgumentsInString( const QCString &name, - ArgumentList *formalArgs, - ArgumentList *actualArgs); + const ArgumentList &formalArgs, + const ArgumentList &actualArgs); -QList *copyArgumentLists(const QList *srcLists); +//QList *copyArgumentLists(const QList *srcLists); QCString stripTemplateSpecifiersFromScope(const QCString &fullName, bool parentOnly=TRUE, @@ -407,7 +407,7 @@ const ClassDef *newResolveTypedef(const FileDef *fileScope, const MemberDef **pMemType=0, QCString *pTemplSpec=0, QCString *pResolvedType=0, - ArgumentList *actTemplParams=0); + const ArgumentList *actTemplParams=0); QCString parseCommentAsText(const Definition *scope,const MemberDef *member,const QCString &doc,const QCString &fileName,int lineNr); @@ -424,7 +424,7 @@ int countAliasArguments(const QCString argList); QCString resolveAliasCmd(const QCString aliasCmd); QCString expandAlias(const QCString &aliasName,const QCString &aliasValue); -void writeTypeConstraints(OutputList &ol,const Definition *d,const ArgumentList *al); +void writeTypeConstraints(OutputList &ol,const Definition *d,const ArgumentList &al); QCString convertCharEntitiesToUTF8(const QCString &s); diff --git a/src/vhdlcode.l b/src/vhdlcode.l index 03bf883..9f128ea 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -434,14 +434,10 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol, static void setParameterList(const MemberDef *md) { g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : ""; - const ArgumentList *al = md->argumentList(); - if (al==0) return; - ArgumentListIterator ali(*al); - const Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a: md->argumentList()) { - g_parmName = a->name.copy(); - g_parmType = a->type.copy(); + g_parmName = a.name.copy(); + g_parmType = a.type.copy(); int i = g_parmType.find('*'); if (i!=-1) g_parmType = g_parmType.left(i); i = g_parmType.find('&'); @@ -683,9 +679,8 @@ static void codifyMapLines(const char *text) static void writeFuncProto() { - QList ql; QCString name,ret; - VhdlDocGen::parseFuncProto(g_FuncProto,ql,name,ret,FALSE); + VhdlDocGen::parseFuncProto(g_FuncProto,name,ret,FALSE); if (name.isEmpty()) { @@ -702,7 +697,7 @@ static void writeFuncProto() { temp.stripPrefix("_");// _{package body name} } - MemberDef *mdef=VhdlDocGen::findFunction(ql,name,temp,FALSE); + MemberDef *mdef=VhdlDocGen::findFunction(name,temp); if (mdef) { diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index fca010e..7db56c3 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -899,12 +899,9 @@ void VhdlDocGen::findAllPackages( ClassDef *cdef) * is called in vhdlcode.l */ -MemberDef* VhdlDocGen::findFunction(const QList &ql, - const QCString& funcname, - const QCString& package, bool /*type*/) +MemberDef* VhdlDocGen::findFunction(const QCString& funcname, const QCString& package) { MemberDef* mdef=0; - //int funcType; ClassDef *cdef=getClass(package.data()); if (cdef==0) return 0; @@ -918,40 +915,11 @@ MemberDef* VhdlDocGen::findFunction(const QList &ql, QCString mname=mdef->name(); if ((VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isVhdlFunction(mdef)) && (compareString(funcname,mname)==0)) { - ArgumentList *alp = mdef->argumentList(); - - // ArgumentList* arg2=mdef->getArgumentList(); - if (alp==0) break; - ArgumentListIterator ali(*alp); - ArgumentListIterator ali1(ql); - - if (ali.count() != ali1.count()) break; - - Argument *arg,*arg1; - int equ=0; - - for (;(arg=ali.current()) && (arg1=ali1.current());++ali,++ali1) - { - equ+=abs(compareString(arg->type,arg1->type)); - - QCString s1=arg->type; - QCString s2=arg1->type; - VhdlDocGen::deleteAllChars(s1,' '); - VhdlDocGen::deleteAllChars(s2,' '); - equ+=abs(compareString(s1,s2)); - s1=arg->attrib; - s2=arg1->attrib; - VhdlDocGen::deleteAllChars(s1,' '); - VhdlDocGen::deleteAllChars(s2,' '); - equ+=abs(compareString(s1,s2)); - // printf("\n 1. type [%s] name [%s] attrib [%s]",arg->type,arg->name,arg->attrib); - // printf("\n 2. type [%s] name [%s] attrib [%s]",arg1->type,arg1->name,arg1->attrib); - } // for - if (equ==0) return mdef; + return mdef; }//if }//for }//if - return mdef; + return 0; } //findFunction @@ -1158,10 +1126,8 @@ void VhdlDocGen::prepareComment(QCString& qcs) * @param ret Stores the return type * @param doc ??? */ -void VhdlDocGen::parseFuncProto(const char* text,QList& qlist, - QCString& name,QCString& ret,bool doc) +void VhdlDocGen::parseFuncProto(const char* text,QCString& name,QCString& ret,bool doc) { - (void)qlist; //unused int index,end; QCString s1(text); QCString temp; @@ -1450,44 +1416,43 @@ void VhdlDocGen::formatString(const QCString &s, OutputList& ol,const MemberDef* * writes a procedure prototype to the output */ -void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef) +void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList &al,const MemberDef* mdef) { - ArgumentListIterator ali(*al); - Argument *arg; bool sem=FALSE; - int len=al->count(); + int len=al.size(); ol.docify("( "); if (len > 2) { ol.lineBreak(); } - for (;(arg=ali.current());++ali) + for (const Argument &arg : al) { ol.startBold(); if (sem && len <3) ol.writeChar(','); - QCString nn=arg->name; + QCString nn=arg.name; nn+=": "; - QCString *str=VhdlDocGen::findKeyWord(arg->defval); - arg->defval+=" "; + QCString defval = arg.defval; + QCString *str=VhdlDocGen::findKeyWord(defval); + defval+=" "; if (str) { - startFonts(arg->defval,str->data(),ol); + startFonts(defval,str->data(),ol); } else { - startFonts(arg->defval,"vhdlchar",ol); // write type (variable,constant etc.) + startFonts(defval,"vhdlchar",ol); // write type (variable,constant etc.) } startFonts(nn,"vhdlchar",ol); // write name - if (qstricmp(arg->attrib,arg->type) != 0) + if (qstricmp(arg.attrib,arg.type) != 0) { - startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out + startFonts(arg.attrib.lower(),"stringliteral",ol); // write in|out } ol.docify(" "); - VhdlDocGen::formatString(arg->type,ol,mdef); + VhdlDocGen::formatString(arg.type,ol,mdef); sem=TRUE; ol.endBold(); if (len > 2) @@ -1506,13 +1471,11 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const * writes a function prototype to the output */ -void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef) +void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList &al,const MemberDef* mdef) { - if (al==0) return; - ArgumentListIterator ali(*al); - Argument *arg; + if (!al.hasParameters()) return; bool sem=FALSE; - int len=al->count(); + int len=al.size(); ol.startBold(); ol.docify(" ( "); ol.endBold(); @@ -1520,10 +1483,10 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const { ol.lineBreak(); } - for (;(arg=ali.current());++ali) + for (const Argument &arg : al) { ol.startBold(); - QCString att=arg->defval; + QCString att=arg.defval; bool bGen=att.stripPrefix("gen!"); if (sem && len < 3) @@ -1545,9 +1508,9 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const startFonts(att,"vhdlchar",ol); } - QCString nn=arg->name; + QCString nn=arg.name; nn+=": "; - QCString ss=arg->type.stripWhiteSpace(); //.lower(); + QCString ss=arg.type.stripWhiteSpace(); //.lower(); QCString w=ss.stripWhiteSpace();//.upper(); startFonts(nn,"vhdlchar",ol); startFonts("in ","stringliteral",ol); @@ -1557,9 +1520,8 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const else startFonts(w,"vhdlchar",ol); - if (arg->attrib) - startFonts(arg->attrib,"vhdlchar",ol); - + if (arg.attrib) + startFonts(arg.attrib,"vhdlchar",ol); sem=TRUE; ol.endBold(); @@ -1587,21 +1549,19 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const * writes a process prototype to the output */ -void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef) +void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList &al,const MemberDef* mdef) { - if (al==0) return; - ArgumentListIterator ali(*al); - Argument *arg; + if (!al.hasParameters()) return; bool sem=FALSE; ol.startBold(); ol.docify(" ( "); - for (;(arg=ali.current());++ali) + for (const Argument &arg : al) { if (sem) { ol.docify(" , "); } - QCString nn=arg->name; + QCString nn=arg.name; // startFonts(nn,"vhdlchar",ol); VhdlDocGen::writeFormatString(nn,ol,mdef); sem=TRUE; @@ -1618,15 +1578,13 @@ void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList* al,const M bool VhdlDocGen::writeFuncProcDocu( const MemberDef *md, OutputList& ol, - const ArgumentList* al, + const ArgumentList &al, bool /*type*/) { - if (al==0) return FALSE; //bool sem=FALSE; ol.enableAll(); - ArgumentListIterator ali(*al); - int index=ali.count(); + int index=al.size(); if (index==0) { ol.docify(" ( ) "); @@ -1635,13 +1593,12 @@ bool VhdlDocGen::writeFuncProcDocu( ol.endMemberDocName(); ol.startParameterList(TRUE); //ol.startParameterName(FALSE); - Argument *arg; bool first=TRUE; - for (;(arg=ali.current());++ali) + for (const Argument &arg : al) { ol.startParameterType(first,""); // if (first) ol.writeChar('('); - QCString attl=arg->defval; + QCString attl=arg.defval; bool bGen=attl.stripPrefix("gen!"); if (bGen) VhdlDocGen::writeFormatString(QCString("generic "),ol,md); @@ -1649,17 +1606,17 @@ bool VhdlDocGen::writeFuncProcDocu( if (VhdlDocGen::isProcedure(md)) { - startFonts(arg->defval,"keywordtype",ol); + startFonts(arg.defval,"keywordtype",ol); ol.docify(" "); } ol.endParameterType(); ol.startParameterName(TRUE); - VhdlDocGen::writeFormatString(arg->name,ol,md); + VhdlDocGen::writeFormatString(arg.name,ol,md); if (VhdlDocGen::isProcedure(md)) { - startFonts(arg->attrib,"stringliteral",ol); + startFonts(arg.attrib,"stringliteral",ol); } else if (VhdlDocGen::isVhdlFunction(md)) { @@ -1672,8 +1629,8 @@ bool VhdlDocGen::writeFuncProcDocu( ol.enable(OutputGenerator::Man); if (!VhdlDocGen::isProcess(md)) { - // startFonts(arg->type,"vhdlkeyword",ol); - VhdlDocGen::writeFormatString(arg->type,ol,md); + // startFonts(arg.type,"vhdlkeyword",ol); + VhdlDocGen::writeFormatString(arg.type,ol,md); } ol.disable(OutputGenerator::Man); ol.endEmphasis(); @@ -1702,28 +1659,26 @@ bool VhdlDocGen::writeFuncProcDocu( -QCString VhdlDocGen::convertArgumentListToString(const ArgumentList* al,bool func) +QCString VhdlDocGen::convertArgumentListToString(const ArgumentList &al,bool func) { QCString argString; bool sem=FALSE; - ArgumentListIterator ali(*al); - Argument *arg; - for (;(arg=ali.current());++ali) + for (const Argument &arg : al) { if (sem) argString.append(", "); if (func) { - argString+=arg->name; + argString+=arg.name; argString+=":"; - argString+=arg->type; + argString+=arg.type; } else { - argString+=arg->defval+" "; - argString+=arg->name+" :"; - argString+=arg->attrib+" "; - argString+=arg->type; + argString+=arg.defval+" "; + argString+=arg.name+" :"; + argString+=arg.attrib+" "; + argString+=arg.type; } sem=TRUE; } @@ -2003,7 +1958,7 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol, QCString ltype(mdef->typeString()); QCString largs(mdef->argsString()); ClassDef *kl=0; - const ArgumentList *alp = mdef->argumentList(); + const ArgumentList &al = mdef->argumentList(); QCString nn; //VhdlDocGen::adjustRecordMember(mdef); if (gd) gd=0; @@ -2021,11 +1976,11 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol, ol.docify(" "); writeLink(mdef,ol); - if (alp!=0 && mm==VhdlDocGen::FUNCTION) - VhdlDocGen::writeFunctionProto(ol,alp,mdef); + if (al.hasParameters() && mm==VhdlDocGen::FUNCTION) + VhdlDocGen::writeFunctionProto(ol,al,mdef); - if (alp!=0 && mm==VhdlDocGen::PROCEDURE) - VhdlDocGen::writeProcedureProto(ol,alp,mdef); + if (al.hasParameters() && mm==VhdlDocGen::PROCEDURE) + VhdlDocGen::writeProcedureProto(ol,al,mdef); break; case VhdlDocGen::USE: @@ -2090,7 +2045,7 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol, case VhdlDocGen::PROCESS: writeLink(mdef,ol); ol.insertMemberAlign(); - VhdlDocGen::writeProcessProto(ol,alp,mdef); + VhdlDocGen::writeProcessProto(ol,al,mdef); break; case VhdlDocGen::PACKAGE: case VhdlDocGen::ENTITY: @@ -2984,8 +2939,8 @@ ferr: n1,uu,uu, 0, Public, Normal, cur->stat,Member, MemberType_Variable, - 0, - 0, + ArgumentList(), + ArgumentList(), ""); if (ar->getOutputFileBase()) @@ -4055,34 +4010,30 @@ void FlowChart::writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom, t << "\n"; } -void FlowChart::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc) +void FlowChart::alignFuncProc( QCString & q,const ArgumentList &al,bool isFunc) { - if (al==0) return; - - ArgumentListIterator ali(*al); - int index=ali.count(); + int index=al.size(); if (index==0) return; int len=q.length()+VhdlDocGen::getFlowMember()->name().length(); QCString prev,temp; prev.fill(' ',len+1); - Argument *arg; q+="\n"; - for (;(arg=ali.current());++ali) + for (const Argument &arg : al) { - QCString attl=arg->defval+" "; - attl+=arg->name+" "; + QCString attl=arg.defval+" "; + attl+=arg.name+" "; if (!isFunc) { - attl+=arg->attrib+" "; + attl+=arg.attrib+" "; } else { attl+=" in "; } - attl+=arg->type; + attl+=arg.type; if (--index) attl+=",\n"; else attl+="\n"; attl.prepend(prev.data()); diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index e2c843c..18985ff 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -95,7 +95,6 @@ class VhdlDocGen static bool deleteCharRev(QCString &s,char c); static void deleteAllChars(QCString &s,char c); static void parseFuncProto(const char* text, - QList& , QCString& name, QCString& ret, bool doc=false); @@ -113,9 +112,8 @@ class VhdlDocGen const QCString& key, MemberListType type); static ClassDef *getClass(const char *name); - static MemberDef* findFunction(const QList &ql, - const QCString& name, - const QCString& package, bool type); + static MemberDef* findFunction(const QCString& name, + const QCString& package); static QCString getClassTitle(const ClassDef*); static void writeInlineClassLink(const ClassDef*, OutputList &ol); @@ -155,11 +153,11 @@ class VhdlDocGen static void formatString(const QCString&,OutputList& ol,const MemberDef*); static void writeFormatString(const QCString&,OutputList& ol,const MemberDef*); - static void writeFunctionProto(OutputList& ol,const ArgumentList *al,const MemberDef*); - static void writeProcessProto(OutputList& ol,const ArgumentList *al,const MemberDef*); - static void writeProcedureProto(OutputList& ol, const ArgumentList *al,const MemberDef*); - static bool writeFuncProcDocu(const MemberDef *mdef, OutputList& ol,const ArgumentList* al,bool type=false); - static void writeRecordProto(const MemberDef *mdef, OutputList& ol,const ArgumentList *al); + static void writeFunctionProto(OutputList& ol,const ArgumentList &al,const MemberDef*); + static void writeProcessProto(OutputList& ol,const ArgumentList &al,const MemberDef*); + static void writeProcedureProto(OutputList& ol, const ArgumentList &al,const MemberDef*); + static bool writeFuncProcDocu(const MemberDef *mdef, OutputList& ol,const ArgumentList &al,bool type=false); + static void writeRecordProto(const MemberDef *mdef, OutputList& ol,const ArgumentList &al); static bool writeVHDLTypeDocumentation(const MemberDef* mdef, const Definition* d, OutputList &ol); @@ -179,7 +177,7 @@ class VhdlDocGen static bool writeClassType(const ClassDef *,OutputList &ol ,QCString & cname); - static QCString convertArgumentListToString(const ArgumentList* al,bool f); + static QCString convertArgumentListToString(const ArgumentList &al,bool f); static QCString getProcessNumber(); static QCString getRecordNumber(); @@ -225,7 +223,7 @@ class VhdlDocGen private: static void findAllArchitectures(QList& ql,const ClassDef *cd); - static bool compareArgList(ArgumentList*,ArgumentList*); + static bool compareArgList(const ArgumentList &,const ArgumentList &); static void writeVhdlLink(const ClassDef* cdd ,OutputList& ol,QCString& type,QCString& name,QCString& beh); static void writeStringLink(const MemberDef *mdef,QCString mem,OutputList& ol); static void writeRecUnitDocu( const MemberDef *md, OutputList& ol,QCString largs); @@ -294,7 +292,7 @@ class FlowChart static void moveToPrevLevel(); static int getTimeStamp(); static void writeFlowChart(); - static void alignFuncProc(QCString & q,const ArgumentList* al,bool isFunc); + static void alignFuncProc(QCString & q,const ArgumentList &al,bool isFunc); static QCString convertNameToFileName(); static void printNode(const FlowChart* n); static void printFlowTree(); diff --git a/src/vhdljjparser.cpp b/src/vhdljjparser.cpp index ae10f4d..39981a0 100644 --- a/src/vhdljjparser.cpp +++ b/src/vhdljjparser.cpp @@ -441,9 +441,9 @@ void VhdlParser::createFunction(const char *imp,uint64 spec,const char *fn) QCStringList q1=QCStringList::split(",",fname); for (uint ii=0;iiname=q1[ii]; - current->argList->append(arg); + Argument arg; + arg.name=q1[ii]; + current->argList.push_back(arg); } } return; @@ -532,7 +532,7 @@ void VhdlParser::addConfigureNode(const char* a,const char*b, bool,bool isLeaf,b void VhdlParser::addProto(const char *s1,const char *s2,const char *s3, - const char *s4,const char *s5,const char *s6) + const char *s4,const char *s5,const char *s6) { (void)s5; // avoid unused warning QCString name=s2; @@ -540,21 +540,21 @@ void VhdlParser::addProto(const char *s1,const char *s2,const char *s3, for (uint u=0;uname=ql[u]; + Argument arg; + arg.name=ql[u]; if (s3) { - arg->type=s3; + arg.type=s3; } - arg->type+=" "; - arg->type+=s4; + arg.type+=" "; + arg.type+=s4; if (s6) { - arg->type+=s6; + arg.type+=s6; } if (parse_sec==GEN_SEC && param_sec==0) { - arg->defval="gen!"; + arg.defval="gen!"; } if (parse_sec==PARAM_SEC) @@ -562,10 +562,10 @@ void VhdlParser::addProto(const char *s1,const char *s2,const char *s3, // assert(false); } - arg->defval+=s1; - arg->attrib="";//s6; + arg.defval+=s1; + arg.attrib="";//s6; - current->argList->append(arg); + current->argList.push_back(arg); current->args+=s2; current->args+=","; } diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index d05adf0..dfbf630 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -338,43 +338,41 @@ void XMLCodeGenerator::finish() if (m_insideCodeLine) endCodeLine(); } -static void writeTemplateArgumentList(const ArgumentList *al, - FTextStream &t, +static void writeTemplateArgumentList(FTextStream &t, + const ArgumentList &al, const Definition *scope, const FileDef *fileScope, int indent) { QCString indentStr; indentStr.fill(' ',indent); - if (al) + if (al.hasParameters()) { t << indentStr << "" << endl; - ArgumentListIterator ali(*al); - const Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : al) { t << indentStr << " " << endl; - if (!a->type.isEmpty()) + if (!a.type.isEmpty()) { t << indentStr << " "; - linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type); + linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a.type); t << "" << endl; } - if (!a->name.isEmpty()) + if (!a.name.isEmpty()) { - t << indentStr << " " << convertToXML(a->name) << "" << endl; - t << indentStr << " " << convertToXML(a->name) << "" << endl; + t << indentStr << " " << convertToXML(a.name) << "" << endl; + t << indentStr << " " << convertToXML(a.name) << "" << endl; } - if (!a->defval.isEmpty()) + if (!a.defval.isEmpty()) { t << indentStr << " "; - linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval); + linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a.defval); t << "" << endl; } - if (!a->typeConstraint.isEmpty()) + if (!a.typeConstraint.isEmpty()) { t << indentStr << " "; - linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->typeConstraint); + linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a.typeConstraint); t << "" << endl; } t << indentStr << " " << endl; @@ -385,16 +383,12 @@ static void writeTemplateArgumentList(const ArgumentList *al, static void writeMemberTemplateLists(const MemberDef *md,FTextStream &t) { - const ArgumentList *templMd = md->templateArguments(); - if (templMd) // function template prefix - { - writeTemplateArgumentList(templMd,t,md->getClassDef(),md->getFileDef(),8); - } + writeTemplateArgumentList(t,md->templateArguments(),md->getClassDef(),md->getFileDef(),8); } static void writeTemplateList(const ClassDef *cd,FTextStream &t) { - writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4); + writeTemplateArgumentList(t,cd->templateArguments(),cd,0,4); } static void writeXMLDocBlock(FTextStream &t, @@ -591,9 +585,9 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream if (isFunc) { - const ArgumentList *al = md->argumentList(); + const ArgumentList &al = md->argumentList(); t << " const=\""; - if (al!=0 && al->constSpecifier) t << "yes"; else t << "no"; + if (al.constSpecifier) t << "yes"; else t << "no"; t << "\""; t << " explicit=\""; @@ -604,10 +598,10 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream if (md->isInline()) t << "yes"; else t << "no"; t << "\""; - if (al!=0 && al->refQualifier!=RefQualifierNone) + if (al.refQualifier!=RefQualifierNone) { t << " refqual=\""; - if (al->refQualifier==RefQualifierLValue) t << "lvalue"; else t << "rvalue"; + if (al.refQualifier==RefQualifierLValue) t << "lvalue"; else t << "rvalue"; t << "\""; } @@ -641,7 +635,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream t << " noexcept=\"yes\""; } - if (al && al->volatileSpecifier) + if (al.volatileSpecifier) { t << " volatile=\"yes\""; } @@ -840,51 +834,55 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream if (isFunc) //function { - const ArgumentList *declAl = md->declArgumentList(); - const ArgumentList *defAl = md->argumentList(); - if (declAl && defAl && declAl->count()>0) + const ArgumentList &declAl = md->declArgumentList(); + const ArgumentList &defAl = md->argumentList(); + if (declAl.hasParameters()) { - ArgumentListIterator declAli(*declAl); - ArgumentListIterator defAli(*defAl); - const Argument *a; - for (declAli.toFirst();(a=declAli.current());++declAli) + auto defIt = defAl.begin(); + for (const Argument &a : declAl) { - Argument *defArg = defAli.current(); + //const Argument *defArg = defAli.current(); + const Argument *defArg = 0; + if (defIt!=defAl.end()) + { + defArg = &(*defIt); + ++defIt; + } t << " " << endl; - if (!a->attrib.isEmpty()) + if (!a.attrib.isEmpty()) { t << " "; - writeXMLString(t,a->attrib); + writeXMLString(t,a.attrib); t << "" << endl; } - if (!a->type.isEmpty()) + if (!a.type.isEmpty()) { t << " "; - linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a->type); + linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a.type); t << "" << endl; } - if (!a->name.isEmpty()) + if (!a.name.isEmpty()) { t << " "; - writeXMLString(t,a->name); + writeXMLString(t,a.name); t << "" << endl; } - if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name) + if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name) { t << " "; writeXMLString(t,defArg->name); t << "" << endl; } - if (!a->array.isEmpty()) + if (!a.array.isEmpty()) { t << " "; - writeXMLString(t,a->array); + writeXMLString(t,a.array); t << "" << endl; } - if (!a->defval.isEmpty()) + if (!a.defval.isEmpty()) { t << " "; - linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a->defval); + linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a.defval); t << "" << endl; } if (defArg && defArg->hasDocumentation()) @@ -895,25 +893,22 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream t << "" << endl; } t << " " << endl; - if (defArg) ++defAli; } } } else if (md->memberType()==MemberType_Define && md->argsString()) // define { - if (md->argumentList()->count()==0) // special case for "foo()" to + if (md->argumentList().empty()) // special case for "foo()" to // disguish it from "foo". { t << " " << endl; } else { - ArgumentListIterator ali(*md->argumentList()); - const Argument *a; - for (ali.toFirst();(a=ali.current());++ali) + for (const Argument &a : md->argumentList()) { - t << " " << a->type << "" << endl; + t << " " << a.type << "" << endl; } } } -- cgit v0.12