summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDimitri van Heesch <doxygen@gmail.com>2020-04-24 06:27:22 (GMT)
committerDimitri van Heesch <doxygen@gmail.com>2020-04-24 07:03:09 (GMT)
commit9e2b6a2dac870b5daabde118c5327281e3f79ba2 (patch)
tree39e49bae6eeb116f19be64a19eb9d3ff26a6c36c
parentcd581388f3d013c501e3cefbaf3e81cf93d46fcb (diff)
downloadDoxygen-9e2b6a2dac870b5daabde118c5327281e3f79ba2.zip
Doxygen-9e2b6a2dac870b5daabde118c5327281e3f79ba2.tar.gz
Doxygen-9e2b6a2dac870b5daabde118c5327281e3f79ba2.tar.bz2
Performance improvements after profiling
In some cases performance dropped when upgrading from version 1.8.16 to 1.8.17 or 1.8.18. With these changes the performance should be back to normal again.
-rw-r--r--.gitignore2
-rw-r--r--src/classdef.cpp9
-rw-r--r--src/classlist.cpp10
-rw-r--r--src/defargs.h12
-rw-r--r--src/defargs.l32
-rw-r--r--src/defgen.cpp3
-rw-r--r--src/doxygen.cpp89
-rw-r--r--src/entry.cpp9
-rw-r--r--src/groupdef.cpp164
-rw-r--r--src/htmlgen.cpp2
-rw-r--r--src/memberdef.cpp70
-rw-r--r--src/memberdef.h21
-rw-r--r--src/pre.l4
-rw-r--r--src/scanner.l8
-rw-r--r--src/tagreader.cpp2
-rw-r--r--src/util.cpp146
-rw-r--r--src/util.h10
17 files changed, 302 insertions, 291 deletions
diff --git a/.gitignore b/.gitignore
index fa8ffb5..82dab79 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,5 @@
/doxygen_docs
/doxygen.tag
/build*
+
+.idea
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 52d2f49..5670109 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -3665,8 +3665,8 @@ void ClassDefImpl::mergeMembers()
ArgumentList &srcAl = srcMd->argumentList();
ArgumentList &dstAl = dstMd->argumentList();
found=matchArguments2(
- srcMd->getOuterScope(),srcMd->getFileDef(),srcAl,
- dstMd->getOuterScope(),dstMd->getFileDef(),dstAl,
+ srcMd->getOuterScope(),srcMd->getFileDef(),&srcAl,
+ dstMd->getOuterScope(),dstMd->getFileDef(),&dstAl,
TRUE
);
//printf(" Yes, matching (%s<->%s): %d\n",
@@ -4254,11 +4254,10 @@ void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const char *t
MemberInfo *mi;
for (mnii.toFirst();(mi=mnii.current());++mnii)
{
- ArgumentList actualArguments;
- stringToArgumentList(getLanguage(),templSpec,actualArguments);
+ auto actualArguments_p = stringToArgumentList(getLanguage(),templSpec);
MemberDef *md = mi->memberDef;
std::unique_ptr<MemberDef> imd { md->createTemplateInstanceMember(
- cd->templateArguments(),actualArguments) };
+ cd->templateArguments(),actualArguments_p) };
//printf("%s->setMemberClass(%p)\n",imd->name().data(),this);
imd->setMemberClass(this);
imd->setTemplateMaster(md);
diff --git a/src/classlist.cpp b/src/classlist.cpp
index 5e14051..ee4ffa4 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -166,9 +166,8 @@ void GenericsSDict::insert(const QCString &key,ClassDef *cd)
{
int i=key.find('<');
if (i==-1) return;
- ArgumentList argList;
- stringToArgumentList(SrcLangExt_CSharp, key.mid(i),argList);
- int c = (int)argList.size();
+ auto argList = stringToArgumentList(SrcLangExt_CSharp, key.mid(i));
+ int c = (int)argList->size();
if (c==0) return;
GenericsCollection *collection = m_dict.find(key.left(i));
if (collection==0) // new name
@@ -199,9 +198,8 @@ ClassDef *GenericsSDict::find(const QCString &key)
GenericsCollection *collection = m_dict.find(key.left(i));
if (collection)
{
- ArgumentList argList;
- stringToArgumentList(SrcLangExt_CSharp,key.mid(i),argList);
- int c = (int)argList.size();
+ auto argList = stringToArgumentList(SrcLangExt_CSharp,key.mid(i));
+ int c = (int)argList->size();
return collection->find(c);
}
}
diff --git a/src/defargs.h b/src/defargs.h
index 4a38723..589eb90 100644
--- a/src/defargs.h
+++ b/src/defargs.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,11 +19,13 @@
#define DEFARGS_H
#include "types.h"
+#include <memory>
class ArgumentList;
class QCString;
-extern void stringToArgumentList(SrcLangExt lang, const char *argsString,ArgumentList& argList,
- QCString *extraTypeChars=0);
+std::unique_ptr<ArgumentList> stringToArgumentList(SrcLangExt lang,
+ const char *argsString,
+ QCString *extraTypeChars=0);
#endif
diff --git a/src/defargs.l b/src/defargs.l
index 2541a43..9c58508 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -75,10 +75,10 @@
*/
struct defargsYY_state
{
- defargsYY_state(const char *inStr,ArgumentList &al,SrcLangExt l)
+ defargsYY_state(const char *inStr,std::unique_ptr<ArgumentList> &al,SrcLangExt l)
: inputString(inStr), argList(al), lang(l) {}
const char *inputString;
- ArgumentList &argList;
+ std::unique_ptr<ArgumentList> &argList;
SrcLangExt lang;
int inputPosition = 0;
QCString *copyArgValue = 0;
@@ -437,7 +437,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
//printf("a->type=%s a->name=%s a->defval=\"%s\"\n",a->type.data(),a->name.data(),a->defval.data());
a.docs = yyextra->curArgDocs.stripWhiteSpace();
//printf("Argument '%s' '%s' adding docs='%s'\n",a->type.data(),a->name.data(),a->docs.data());
- yyextra->argList.push_back(a);
+ yyextra->argList->push_back(a);
}
yyextra->curArgAttrib.resize(0);
yyextra->curArgTypeName.resize(0);
@@ -506,23 +506,23 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
yyextra->curTypeConstraint+=' ';
}
<FuncQual>"const" {
- yyextra->argList.constSpecifier=TRUE;
+ yyextra->argList->constSpecifier=TRUE;
}
<FuncQual>"volatile" {
- yyextra->argList.volatileSpecifier=TRUE;
+ yyextra->argList->volatileSpecifier=TRUE;
}
<FuncQual>"&" {
- yyextra->argList.refQualifier=RefQualifierLValue;
+ yyextra->argList->refQualifier=RefQualifierLValue;
}
<FuncQual>"&&" {
- yyextra->argList.refQualifier=RefQualifierRValue;
+ yyextra->argList->refQualifier=RefQualifierRValue;
}
<FuncQual,TrailingReturn>"="{B}*"0" {
- yyextra->argList.pureSpecifier=TRUE;
+ yyextra->argList->pureSpecifier=TRUE;
BEGIN(FuncQual);
}
<FuncQual>"->" { // C++11 trailing return type
- yyextra->argList.trailingReturnType=" -> ";
+ yyextra->argList->trailingReturnType=" -> ";
BEGIN(TrailingReturn);
}
<TrailingReturn>{B}/("final"|"override"){B}* {
@@ -530,10 +530,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
BEGIN(FuncQual);
}
<TrailingReturn>. {
- yyextra->argList.trailingReturnType+=yytext;
+ yyextra->argList->trailingReturnType+=yytext;
}
<TrailingReturn>\n {
- yyextra->argList.trailingReturnType+=yytext;
+ yyextra->argList->trailingReturnType+=yytext;
}
<FuncQual>")"{B}*"["[^]]*"]" { // for functions returning a pointer to an array,
// i.e. ")[]" in "int (*f(int))[4]" with argsString="(int))[4]"
@@ -768,9 +768,10 @@ static bool nameIsActuallyPartOfType(QCString &name)
* for complex types are written to
*/
-void stringToArgumentList(SrcLangExt lang, const char *argsString,ArgumentList& al,QCString *extraTypeChars)
+std::unique_ptr<ArgumentList> stringToArgumentList(SrcLangExt lang, const char *argsString,QCString *extraTypeChars)
{
- if (argsString==0) return;
+ std::unique_ptr<ArgumentList> al = std::make_unique<ArgumentList>();
+ if (argsString==0) return al;
yyscan_t yyscanner;
defargsYY_state extra(argsString,al,lang);
@@ -784,14 +785,15 @@ void stringToArgumentList(SrcLangExt lang, const char *argsString,ArgumentList&
defargsYYrestart( 0, yyscanner );
BEGIN( Start );
defargsYYlex(yyscanner);
- if (yyextra->argList.empty())
+ if (yyextra->argList->empty())
{
- yyextra->argList.noParameters = TRUE;
+ yyextra->argList->noParameters = TRUE;
}
if (extraTypeChars) *extraTypeChars=yyextra->extraTypeChars;
//printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data());
printlex(yy_flex_debug, FALSE, __FILE__, NULL);
defargsYYlex_destroy(yyscanner);
+ return al;
}
#if USE_STATE2STRING
diff --git a/src/defgen.cpp b/src/defgen.cpp
index 96f9da3..02f51c5 100644
--- a/src/defgen.cpp
+++ b/src/defgen.cpp
@@ -145,8 +145,7 @@ void generateDEFForMember(MemberDef *md,
if (isFunc) //function
{
const ArgumentList &defAl = md->argumentList();
- ArgumentList declAl;
- stringToArgumentList(md->getLanguage(),md->argsString(),declAl);
+ ArgumentList declAl = *stringToArgumentList(md->getLanguage(),md->argsString());
QCString fcnPrefix = " " + memPrefix + "param-";
auto defIt = defAl.begin();
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index c59b075..873f5dc 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -867,7 +867,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
return resultScope;
}
-ArgumentList getTemplateArgumentsFromName(
+std::unique_ptr<ArgumentList> getTemplateArgumentsFromName(
const QCString &name,
const std::vector<ArgumentList> &tArgLists)
{
@@ -891,7 +891,9 @@ ArgumentList getTemplateArgumentsFromName(
}
p=i+2;
}
- return alIt!=tArgLists.end() ? *alIt : ArgumentList();
+ return alIt!=tArgLists.end() ?
+ std::make_unique<ArgumentList>(*alIt) :
+ std::unique_ptr<ArgumentList>();
}
static
@@ -1008,8 +1010,11 @@ static void addClassToContext(const Entry *root)
// 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);
- cd->setTemplateArguments(tArgList);
+ std::unique_ptr<ArgumentList> tArgList = getTemplateArgumentsFromName(cd->name(),root->tArgLists);
+ if (tArgList)
+ {
+ cd->setTemplateArguments(*tArgList);
+ }
}
cd->setCompoundType(convertToCompoundType(root->section,root->spec));
@@ -1042,12 +1047,12 @@ static void addClassToContext(const Entry *root)
buildScopeFromQualifiedName(fullName,fullName.contains("::"),root->lang,tagInfo);
}
}
- ArgumentList tArgList;
+ std::unique_ptr<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
- stringToArgumentList(root->lang,fullName.mid(i),tArgList);
+ tArgList = stringToArgumentList(root->lang,fullName.mid(i));
fullName=fullName.left(i);
}
else
@@ -1070,7 +1075,10 @@ static void addClassToContext(const Entry *root)
//printf("class %s template args=%s\n",fullName.data(),
// tArgList ? tempArgListToString(tArgList,root->lang).data() : "<none>");
- cd->setTemplateArguments(tArgList);
+ if (tArgList)
+ {
+ cd->setTemplateArguments(*tArgList);
+ }
cd->setProtection(root->protection);
cd->setIsStatic(root->stat);
@@ -3060,7 +3068,6 @@ static void addMethodToClass(const Entry *root,ClassDef *cd,
md->setId(root->id);
md->setBodyDef(fd);
md->setFileDef(fd);
- //md->setScopeTemplateArguments(root->tArgList);
md->addSectionsToDefinition(root->anchors);
QCString def;
QCString qualScope = cd->qualifiedNameWithTemplateParameters();
@@ -3410,8 +3417,8 @@ static void buildFunctionList(const Entry *root)
root->stat && md->isStatic() && root->fileName!=md->getDefFileName();
if (
- matchArguments2(md->getOuterScope(),mfd,mdAl,
- rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
+ matchArguments2(md->getOuterScope(),mfd,&mdAl,
+ rnd ? rnd : Doxygen::globalScope,rfd,&root->argList,
FALSE) &&
sameNumTemplateArgs &&
matchingReturnTypes &&
@@ -3449,16 +3456,14 @@ static void buildFunctionList(const Entry *root)
// merge documentation
if (md->documentation().isEmpty() && !root->doc.isEmpty())
{
- ArgumentList argList;
- stringToArgumentList(root->lang,root->args,argList);
if (root->proto)
{
//printf("setDeclArgumentList to %p\n",argList);
- md->setDeclArgumentList(argList);
+ md->moveDeclArgumentList(stringToArgumentList(root->lang,root->args));
}
else
{
- md->setArgumentList(argList);
+ md->moveArgumentList(stringToArgumentList(root->lang,root->args));
}
}
@@ -3578,8 +3583,8 @@ static void findFriends()
// mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
if ((cmmd->isFriend() || (cmmd->isRelated() && cmmd->isFunction())) &&
!fmd->isAlias() && !mmd->isAlias() &&
- matchArguments2(cmmd->getOuterScope(), cmmd->getFileDef(), cmmd->argumentList(),
- cfmd->getOuterScope(), cfmd->getFileDef(), cfmd->argumentList(),
+ matchArguments2(cmmd->getOuterScope(), cmmd->getFileDef(), &cmmd->argumentList(),
+ cfmd->getOuterScope(), cfmd->getFileDef(), &cfmd->argumentList(),
TRUE
)
@@ -3702,8 +3707,8 @@ static void transferFunctionReferences()
ArgumentList &mdefAl = mdef->argumentList();
ArgumentList &mdecAl = mdec->argumentList();
if (
- matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl,
- mdec->getOuterScope(),mdec->getFileDef(),mdecAl,
+ matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),&mdefAl,
+ mdec->getOuterScope(),mdec->getFileDef(),&mdecAl,
TRUE
)
) /* match found */
@@ -3789,8 +3794,8 @@ static void transferRelatedFunctionDocumentation()
//printf(" Member found: related='%d'\n",rmd->isRelated());
if ((rmd->isRelated() || rmd->isForeign()) && // related function
!md->isAlias() && !rmd->isAlias() &&
- matchArguments2( md->getOuterScope(), md->getFileDef(), md->argumentList(),
- rmd->getOuterScope(),rmd->getFileDef(),rmd->argumentList(),
+ matchArguments2( md->getOuterScope(), md->getFileDef(), &md->argumentList(),
+ rmd->getOuterScope(),rmd->getFileDef(),&rmd->argumentList(),
TRUE
)
)
@@ -3886,7 +3891,7 @@ static void findUsedClassesForClass(const Entry *root,
ClassDef *masterCd,
ClassDef *instanceCd,
bool isArtificial,
- const ArgumentList &actualArgs=ArgumentList(),
+ const std::unique_ptr<ArgumentList> &actualArgs = std::unique_ptr<ArgumentList>(),
QDict<int> *templateNames=0
)
{
@@ -4048,7 +4053,7 @@ static void findBaseClassesForClass(
ClassDef *instanceCd,
FindBaseClassRelation_Mode mode,
bool isArtificial,
- const ArgumentList &actualArgs=ArgumentList(),
+ const std::unique_ptr<ArgumentList> &actualArgs = std::unique_ptr<ArgumentList>(),
QDict<int> *templateNames=0
)
{
@@ -4145,8 +4150,7 @@ 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;
- stringToArgumentList(root->lang,templSpec,templArgs);
+ std::unique_ptr<ArgumentList> templArgs = stringToArgumentList(root->lang,templSpec);
findBaseClassesForClass(templateRoot,context,templateClass,instanceClass,
TemplateInstances,isArtificial,templArgs,templateNames);
@@ -4759,8 +4763,7 @@ static void computeTemplateClassRelations()
{
Debug::print(Debug::Classes,0," Template instance %s : \n",qPrint(tcd->name()));
QCString templSpec = tdi.currentKey();
- ArgumentList templArgs;
- stringToArgumentList(tcd->getLanguage(),templSpec,templArgs);
+ std::unique_ptr<ArgumentList> templArgs = stringToArgumentList(tcd->getLanguage(),templSpec);
for (const BaseInfo &bi : root->extends)
{
// check if the base class is a template argument
@@ -4780,9 +4783,9 @@ static void computeTemplateClassRelations()
int templIndex = *qdi.current();
Argument actArg;
bool hasActArg=FALSE;
- if (templIndex<(int)templArgs.size())
+ if (templIndex<(int)templArgs->size())
{
- actArg=templArgs.at(templIndex);
+ actArg=templArgs->at(templIndex);
hasActArg=TRUE;
}
if (hasActArg &&
@@ -4974,8 +4977,8 @@ static void addMemberDocs(const Entry *root,
else
{
if (
- matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl,
- rscope,rfd,root->argList,
+ matchArguments2( md->getOuterScope(), md->getFileDef(), &mdAl,
+ rscope,rfd,&root->argList,
TRUE
)
)
@@ -5155,8 +5158,8 @@ static bool findGlobalMember(const Entry *root,
bool matching=
(mdAl.empty() && root->argList.empty()) ||
md->isVariable() || md->isTypedef() || /* in case of function pointers */
- matchArguments2(md->getOuterScope(),const_cast<const MemberDef *>(md.get())->getFileDef(),mdAl,
- rnd ? rnd : Doxygen::globalScope,fd,root->argList,
+ matchArguments2(md->getOuterScope(),const_cast<const MemberDef *>(md.get())->getFileDef(),&mdAl,
+ rnd ? rnd : Doxygen::globalScope,fd,&root->argList,
FALSE);
// for template members we need to check if the number of
@@ -5546,8 +5549,8 @@ static void addMemberFunction(const Entry *root,
bool matching=
md->isVariable() || md->isTypedef() || // needed for function pointers
matchArguments2(
- md->getClassDef(),md->getFileDef(),argList,
- cd,fd,root->argList,
+ md->getClassDef(),md->getFileDef(),&argList,
+ cd,fd,&root->argList,
TRUE);
if (md->getLanguage()==SrcLangExt_ObjC && md->isVariable() && (root->section&Entry::FUNCTION_SEC))
@@ -5602,7 +5605,7 @@ static void addMemberFunction(const Entry *root,
if (matching) // replace member's argument list
{
md->setDefinitionTemplateParameterLists(root->tArgLists);
- md->setArgumentList(argList);
+ md->moveArgumentList(std::make_unique<ArgumentList>(argList));
}
else // no match
{
@@ -5850,14 +5853,14 @@ static void addOverloaded(const Entry *root,MemberName *mn,
else mtype=MemberType_Function;
// new overloaded member function
- ArgumentList tArgList =
+ std::unique_ptr<ArgumentList> tArgList =
getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
//printf("new related member %s args='%s'\n",md->name().data(),funcArgs.data());
std::unique_ptr<MemberDef> md { createMemberDef(
root->fileName,root->startLine,root->startColumn,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,root->stat,Related,
- mtype,tArgList,root->argList,root->metaData) };
+ mtype,tArgList ? *tArgList : ArgumentList(),root->argList,root->metaData) };
md->setTagInfo(root->tagInfo());
md->setLanguage(root->lang);
md->setId(root->id);
@@ -6305,8 +6308,8 @@ static void findMember(const Entry *root,
newMember=
className!=rmd->getOuterScope()->name() ||
- !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
- cd,fd,root->argList,
+ !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),&rmdAl,
+ cd,fd,&root->argList,
TRUE);
if (!newMember)
{
@@ -6400,8 +6403,8 @@ static void findMember(const Entry *root,
const ArgumentList &rmdAl = rmd->argumentList();
// check for matching argument lists
if (
- matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
- cd,fd,root->argList,
+ matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),&rmdAl,
+ cd,fd,&root->argList,
TRUE)
)
{
@@ -7379,8 +7382,8 @@ static void computeMemberRelations()
// argListToString(mdAl.pointer()).data()
// );
if (
- matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl,
- md->getOuterScope(), md->getFileDef(), mdAl,
+ matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),&bmdAl,
+ md->getOuterScope(), md->getFileDef(), &mdAl,
TRUE
)
)
diff --git a/src/entry.cpp b/src/entry.cpp
index 305487e..0c7da99 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -240,9 +240,8 @@ void Entry::reset()
extends.clear();
groups.clear();
anchors.clear();
- argList.clear();
- tArgLists.clear();
argList.reset();
+ tArgLists.clear();
typeConstr.reset();
sli.clear();
m_fileDef = 0;
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 5af1525..90de94b 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -58,7 +58,7 @@ class GroupDefImpl : public DefinitionImpl, public GroupDef
virtual const char *groupTitle() const { return m_title; }
virtual void setGroupTitle( const char *newtitle );
virtual bool hasGroupTitle( ) const { return m_titleSet; }
- virtual void addFile(const FileDef *def);
+ virtual void addFile(const FileDef *def);
virtual bool addClass(const ClassDef *def);
virtual bool addNamespace(const NamespaceDef *def);
virtual void addGroup(const GroupDef *def);
@@ -105,8 +105,8 @@ class GroupDefImpl : public DefinitionImpl, public GroupDef
virtual PageSDict * getExamples() const { return m_exampleDict; }
virtual bool hasDetailedDescription() const;
virtual void sortSubGroups();
-
- private:
+
+ private:
void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
MemberList *createMemberList(MemberListType lt);
void addMemberToList(MemberListType lt,MemberDef *md);
@@ -284,13 +284,13 @@ bool GroupDefImpl::addClass(const ClassDef *cd)
//printf("i=%d\n",i);
if (i>0)
{
- // add nested classes (e.g. A::B, A::C) after their parent (A) in
+ // add nested classes (e.g. A::B, A::C) after their parent (A) in
// order of insertion
QCString scope = qn.left(i);
int j=m_classSDict->findAt(scope);
if (j!=-1)
{
- while (j<(int)m_classSDict->count() &&
+ while (j<(int)m_classSDict->count() &&
m_classSDict->at(j)->qualifiedName().left(i)==scope)
{
//printf("skipping over %s\n",classSDict->at(j)->qualifiedName().data());
@@ -319,7 +319,7 @@ bool GroupDefImpl::addNamespace(const NamespaceDef *def)
if (m_namespaceSDict->find(def->name())==0)
{
if (sortBriefDocs)
- m_namespaceSDict->inSort(def->name(),def);
+ m_namespaceSDict->inSort(def->name(),def);
else
m_namespaceSDict->append(def->name(),def);
return TRUE;
@@ -331,7 +331,7 @@ void GroupDefImpl::addDir(const DirDef *def)
{
if (def->isHidden()) return;
if (Config_getBool(SORT_BRIEF_DOCS))
- m_dirList->inSort(def);
+ m_dirList->inSort(def);
else
m_dirList->append(def);
}
@@ -381,7 +381,7 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly)
MemberNameInfo *mni=0;
if ((mni=(*m_allMemberNameInfoSDict)[md->name()]))
{ // member with this name already found
- MemberNameInfoIterator srcMnii(*mni);
+ MemberNameInfoIterator srcMnii(*mni);
const MemberInfo *srcMi;
for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
{
@@ -391,7 +391,7 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly)
bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
// both inside a file => definition and declaration do not have to be in the same file
(srcMd->getOuterScope()->definitionType()==Definition::TypeFile &&
- md->getOuterScope()->definitionType()==Definition::TypeFile);
+ md->getOuterScope()->definitionType()==Definition::TypeFile);
const ArgumentList &srcMdAl = srcMd->argumentList();
const ArgumentList &mdAl = md->argumentList();
@@ -400,20 +400,20 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly)
if (srcMd->isFunction() && md->isFunction() && // both are a function
(tSrcMdAl.size()==tMdAl.size()) && // same number of template arguments
- matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl,
- md->getOuterScope(),md->getFileDef(),mdAl,
+ matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),&srcMdAl,
+ md->getOuterScope(),md->getFileDef(),&mdAl,
TRUE
) && // matching parameters
sameScope // both are found in the same scope
)
{
- if (srcMd->getGroupAlias()==0)
+ if (srcMd->getGroupAlias()==0)
{
- md->setGroupAlias(srcMd);
+ md->setGroupAlias(srcMd);
}
else if (md!=srcMd->getGroupAlias())
{
- md->setGroupAlias(srcMd->getGroupAlias());
+ md->setGroupAlias(srcMd->getGroupAlias());
}
return FALSE; // member is the same as one that is already added
}
@@ -427,59 +427,59 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly)
m_allMemberNameInfoSDict->append(mni->memberName(),mni);
}
//printf("Added member!\n");
- m_allMemberList->append(md);
+ m_allMemberList->append(md);
switch(md->memberType())
{
- case MemberType_Variable:
+ case MemberType_Variable:
if (!docOnly)
{
addMemberToList(MemberListType_decVarMembers,md);
}
addMemberToList(MemberListType_docVarMembers,md);
break;
- case MemberType_Function:
+ case MemberType_Function:
if (!docOnly)
{
addMemberToList(MemberListType_decFuncMembers,md);
}
addMemberToList(MemberListType_docFuncMembers,md);
break;
- case MemberType_Typedef:
+ case MemberType_Typedef:
if (!docOnly)
{
addMemberToList(MemberListType_decTypedefMembers,md);
}
addMemberToList(MemberListType_docTypedefMembers,md);
break;
- case MemberType_Enumeration:
+ case MemberType_Enumeration:
if (!docOnly)
{
addMemberToList(MemberListType_decEnumMembers,md);
}
addMemberToList(MemberListType_docEnumMembers,md);
break;
- case MemberType_EnumValue:
+ case MemberType_EnumValue:
if (!docOnly)
{
addMemberToList(MemberListType_decEnumValMembers,md);
}
addMemberToList(MemberListType_docEnumValMembers,md);
break;
- case MemberType_Define:
+ case MemberType_Define:
if (!docOnly)
{
addMemberToList(MemberListType_decDefineMembers,md);
}
addMemberToList(MemberListType_docDefineMembers,md);
break;
- case MemberType_Signal:
+ case MemberType_Signal:
if (!docOnly)
{
addMemberToList(MemberListType_decSignalMembers,md);
}
addMemberToList(MemberListType_docSignalMembers,md);
break;
- case MemberType_Slot:
+ case MemberType_Slot:
if (md->protection()==Public)
{
if (!docOnly)
@@ -505,21 +505,21 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly)
addMemberToList(MemberListType_docPriSlotMembers,md);
}
break;
- case MemberType_Event:
+ case MemberType_Event:
if (!docOnly)
{
addMemberToList(MemberListType_decEventMembers,md);
}
addMemberToList(MemberListType_docEventMembers,md);
break;
- case MemberType_Property:
+ case MemberType_Property:
if (!docOnly)
{
addMemberToList(MemberListType_decPropMembers,md);
}
addMemberToList(MemberListType_docPropMembers,md);
break;
- case MemberType_Friend:
+ case MemberType_Friend:
if (!docOnly)
{
addMemberToList(MemberListType_decFriendMembers,md);
@@ -564,31 +564,31 @@ void GroupDefImpl::removeMember(MemberDef *md)
removeMemberFromList(MemberListType_decVarMembers,md);
removeMemberFromList(MemberListType_docVarMembers,md);
break;
- case MemberType_Function:
+ case MemberType_Function:
removeMemberFromList(MemberListType_decFuncMembers,md);
removeMemberFromList(MemberListType_docFuncMembers,md);
break;
- case MemberType_Typedef:
+ case MemberType_Typedef:
removeMemberFromList(MemberListType_decTypedefMembers,md);
removeMemberFromList(MemberListType_docTypedefMembers,md);
break;
- case MemberType_Enumeration:
+ case MemberType_Enumeration:
removeMemberFromList(MemberListType_decEnumMembers,md);
removeMemberFromList(MemberListType_docEnumMembers,md);
break;
- case MemberType_EnumValue:
+ case MemberType_EnumValue:
removeMemberFromList(MemberListType_decEnumValMembers,md);
removeMemberFromList(MemberListType_docEnumValMembers,md);
break;
- case MemberType_Define:
+ case MemberType_Define:
removeMemberFromList(MemberListType_decDefineMembers,md);
removeMemberFromList(MemberListType_docDefineMembers,md);
break;
- case MemberType_Signal:
+ case MemberType_Signal:
removeMemberFromList(MemberListType_decSignalMembers,md);
removeMemberFromList(MemberListType_docSignalMembers,md);
break;
- case MemberType_Slot:
+ case MemberType_Slot:
if (md->protection()==Public)
{
removeMemberFromList(MemberListType_decPubSlotMembers,md);
@@ -605,15 +605,15 @@ void GroupDefImpl::removeMember(MemberDef *md)
removeMemberFromList(MemberListType_docPriSlotMembers,md);
}
break;
- case MemberType_Event:
+ case MemberType_Event:
removeMemberFromList(MemberListType_decEventMembers,md);
removeMemberFromList(MemberListType_docEventMembers,md);
break;
- case MemberType_Property:
+ case MemberType_Property:
removeMemberFromList(MemberListType_decPropMembers,md);
removeMemberFromList(MemberListType_docPropMembers,md);
break;
- case MemberType_Friend:
+ case MemberType_Friend:
removeMemberFromList(MemberListType_decFriendMembers,md);
removeMemberFromList(MemberListType_docFriendMembers,md);
break;
@@ -691,7 +691,7 @@ int GroupDefImpl::numDocMembers() const
m_exampleDict->count();
}
-/*! Compute the HTML anchor names for all members in the group */
+/*! Compute the HTML anchor names for all members in the group */
void GroupDefImpl::computeAnchors()
{
//printf("GroupDefImpl::computeAnchors()\n");
@@ -843,7 +843,7 @@ void GroupDefImpl::writeTagFile(FTextStream &tagFile)
void GroupDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title)
{
- if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
+ if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
|| !documentation().isEmpty() || !inbodyDocumentation().isEmpty()
)
{
@@ -1183,7 +1183,7 @@ void GroupDefImpl::writeSummaryLinks(OutputList &ol) const
SrcLangExt lang = getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classSDict->declVisible()) ||
+ if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classSDict->declVisible()) ||
(lde->kind()==LayoutDocEntry::GroupNamespaces && m_namespaceSDict->declVisible()) ||
(lde->kind()==LayoutDocEntry::GroupFiles && m_fileList->count()>0) ||
(lde->kind()==LayoutDocEntry::GroupNestedGroups && m_groupList->count()>0) ||
@@ -1191,7 +1191,7 @@ void GroupDefImpl::writeSummaryLinks(OutputList &ol) const
)
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
+ QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
lde->kind()==LayoutDocEntry::GroupNamespaces ? "namespaces" :
lde->kind()==LayoutDocEntry::GroupFiles ? "files" :
lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" :
@@ -1266,84 +1266,84 @@ void GroupDefImpl::writeDocumentation(OutputList &ol)
{
switch (lde->kind())
{
- case LayoutDocEntry::BriefDesc:
+ case LayoutDocEntry::BriefDesc:
writeBriefDescription(ol);
- break;
- case LayoutDocEntry::MemberDeclStart:
+ break;
+ case LayoutDocEntry::MemberDeclStart:
startMemberDeclarations(ol);
- break;
- case LayoutDocEntry::GroupClasses:
+ break;
+ case LayoutDocEntry::GroupClasses:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeClasses(ol,ls->title(lang));
}
- break;
- case LayoutDocEntry::GroupInlineClasses:
+ break;
+ case LayoutDocEntry::GroupInlineClasses:
{
writeInlineClasses(ol);
}
break;
- case LayoutDocEntry::GroupNamespaces:
+ case LayoutDocEntry::GroupNamespaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeNamespaces(ol,ls->title(lang));
}
- break;
- case LayoutDocEntry::MemberGroups:
+ break;
+ case LayoutDocEntry::MemberGroups:
writeMemberGroups(ol);
- break;
- case LayoutDocEntry::MemberDecl:
+ break;
+ case LayoutDocEntry::MemberDecl:
{
LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
}
- break;
- case LayoutDocEntry::MemberDeclEnd:
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
endMemberDeclarations(ol);
break;
- case LayoutDocEntry::DetailedDesc:
+ case LayoutDocEntry::DetailedDesc:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeDetailedDescription(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::MemberDefStart:
+ case LayoutDocEntry::MemberDefStart:
startMemberDocumentation(ol);
- break;
- case LayoutDocEntry::MemberDef:
+ break;
+ case LayoutDocEntry::MemberDef:
{
LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
}
break;
- case LayoutDocEntry::MemberDefEnd:
+ case LayoutDocEntry::MemberDefEnd:
endMemberDocumentation(ol);
break;
- case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupNestedGroups:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeNestedGroups(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::GroupPageDocs:
+ case LayoutDocEntry::GroupPageDocs:
writePageDocumentation(ol);
break;
- case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupDirs:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeDirs(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::GroupFiles:
+ case LayoutDocEntry::GroupFiles:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeFiles(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupGraph:
writeGroupGraph(ol);
break;
- case LayoutDocEntry::AuthorSection:
+ case LayoutDocEntry::AuthorSection:
writeAuthorSection(ol);
break;
case LayoutDocEntry::ClassIncludes:
@@ -1368,7 +1368,7 @@ void GroupDefImpl::writeDocumentation(OutputList &ol)
case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
case LayoutDocEntry::FileIncludeGraph:
- case LayoutDocEntry::FileIncludedByGraph:
+ case LayoutDocEntry::FileIncludedByGraph:
case LayoutDocEntry::FileSourceLink:
case LayoutDocEntry::FileInlineClasses:
case LayoutDocEntry::DirSubDirs:
@@ -1382,7 +1382,7 @@ void GroupDefImpl::writeDocumentation(OutputList &ol)
//---------------------------------------- end flexible part -------------------------------
- endFile(ol);
+ endFile(ol);
ol.popGeneratorState();
@@ -1398,7 +1398,7 @@ void GroupDefImpl::writeMemberPages(OutputList &ol)
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
-
+
QListIterator<MemberList> mli(m_memberLists);
MemberList *ml;
for (mli.toFirst();(ml=mli.current());++mli)
@@ -1462,7 +1462,7 @@ void addClassToGroups(const Entry *root,ClassDef *cd)
GroupDef *gd=0;
if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname)))
{
- if (gd->addClass(cd))
+ if (gd->addClass(cd))
{
cd->makePartOfGroup(gd);
}
@@ -1532,7 +1532,7 @@ void addGroupToGroups(const Entry *root,GroupDef *subGroup)
/*! Add a member to the group with the highest priority */
void addMemberToGroups(const Entry *root,MemberDef *md)
{
- //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%d\n",
+ //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%d\n",
// root, root->name.data(), md, md->name().data(), root->groups->count() );
// Search entry's group list for group with highest pri.
@@ -1545,7 +1545,7 @@ void addMemberToGroups(const Entry *root,MemberDef *md)
(gd=Doxygen::groupSDict->find(g.groupname)) &&
g.pri >= pri)
{
- if (fgd && gd!=fgd && g.pri==pri)
+ if (fgd && gd!=fgd && g.pri==pri)
{
warn(root->fileName.data(), root->startLine,
"Member %s found in multiple %s groups! "
@@ -1575,7 +1575,7 @@ void addMemberToGroups(const Entry *root,MemberDef *md)
{
bool moveit = FALSE;
- // move member from one group to another if
+ // move member from one group to another if
// - the new one has a higher priority
// - the new entry has the same priority, but with docs where the old one had no docs
if (md->getGroupPri()<pri)
@@ -1624,7 +1624,7 @@ void addMemberToGroups(const Entry *root,MemberDef *md)
md->setGroupDef(fgd,pri,root->fileName,root->startLine,
!root->doc.isEmpty());
ClassDef *cd = md->getClassDefOfAnonymousType();
- if (cd)
+ if (cd)
{
cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
}
@@ -1741,12 +1741,12 @@ void GroupDefImpl::writeMemberDeclarations(OutputList &ol,MemberListType lt,cons
static bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
MemberList * ml = getMemberList(lt);
- if (optimizeVhdl && ml)
+ if (optimizeVhdl && ml)
{
VhdlDocGen::writeVhdlDeclarations(ml,ol,this,0,0,0);
return;
}
- if (ml)
+ if (ml)
{
ml->writeDeclarations(ol,0,0,0,this,title,0);
}
@@ -1761,12 +1761,12 @@ void GroupDefImpl::writeMemberDocumentation(OutputList &ol,MemberListType lt,con
void GroupDefImpl::removeMemberFromList(MemberListType lt,MemberDef *md)
{
MemberList *ml = getMemberList(lt);
- if (ml) ml->remove(md);
+ if (ml) ml->remove(md);
}
-void GroupDefImpl::sortSubGroups()
-{
- m_groupList->sort();
+void GroupDefImpl::sortSubGroups()
+{
+ m_groupList->sort();
}
bool GroupDefImpl::isLinkableInProject() const
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index b157881..7458b23 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -686,7 +686,7 @@ void HtmlCodeGenerator::codify(const char *str)
void HtmlCodeGenerator::docify(const char *str)
{
- m_t << getHtmlDirEmbeddingChar(getTextDirByConfig(str));
+ //m_t << getHtmlDirEmbeddingChar(getTextDirByConfig(str));
if (str && m_streamSet)
{
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 39b8f70..7672599 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -93,7 +93,7 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual int getGroupStartLine() const;
virtual bool getGroupHasDocs() const;
virtual QCString qualifiedName() const;
- virtual QCString objCMethodName(bool localLink,bool showStatic) const;
+ virtual QCString objCMethodName(bool localLink,bool showStatic) const;
virtual Protection protection() const;
virtual Specifier virtualness(int count=0) const;
virtual MemberType memberType() const;
@@ -275,8 +275,8 @@ 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(const ArgumentList &al);
- virtual void setDeclArgumentList(const ArgumentList &al);
+ virtual void moveArgumentList(std::unique_ptr<ArgumentList> al);
+ virtual void moveDeclArgumentList(std::unique_ptr<ArgumentList> al);
virtual void setDefinitionTemplateParameterLists(const std::vector<ArgumentList> &lists);
virtual void setTypeConstraints(const ArgumentList &al);
virtual void setType(const char *t);
@@ -324,7 +324,7 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual void warnIfUndocumentedParams() const;
virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const;
virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs,
- const ArgumentList &actualArgs) const;
+ const std::unique_ptr<ArgumentList> &actualArgs) const;
virtual void findSectionsInDocumentation();
virtual void writeLink(OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
@@ -378,7 +378,7 @@ MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn,
class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
{
public:
- MemberDefAliasImpl(const Definition *newScope,const MemberDef *md)
+ MemberDefAliasImpl(const Definition *newScope,const MemberDef *md)
: DefinitionAliasImpl(newScope,md), m_memberGroup(0) {}
virtual ~MemberDefAliasImpl() {}
virtual DefType definitionType() const { return TypeMember; }
@@ -787,8 +787,8 @@ 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(const ArgumentList &al) {}
- virtual void setDeclArgumentList(const ArgumentList &al) {}
+ virtual void moveArgumentList(std::unique_ptr<ArgumentList> al) {}
+ virtual void moveDeclArgumentList(std::unique_ptr<ArgumentList> al) {}
virtual void setDefinitionTemplateParameterLists(const std::vector<ArgumentList> &lists) {}
virtual void setTypeConstraints(const ArgumentList &al) {}
virtual void setType(const char *t) {}
@@ -823,7 +823,7 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
virtual void addToSearchIndex() const {}
virtual void findSectionsInDocumentation() {}
virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs,
- const ArgumentList &actualArgs) const
+ const std::unique_ptr<ArgumentList> &actualArgs) const
{ return getMdAlias()->createTemplateInstanceMember(formalArgs,actualArgs); }
virtual void incrementFlowKeyWordCount() {}
@@ -1478,7 +1478,7 @@ void MemberDefImpl::IMPL::init(Definition *d,
// convert function declaration arguments (if any)
if (!args.isEmpty())
{
- stringToArgumentList(d->getLanguage(),args,declArgList,&extraTypeChars);
+ declArgList = *stringToArgumentList(d->getLanguage(),args,&extraTypeChars);
//printf("setDeclArgList %s to %s const=%d\n",args.data(),
// argListToString(declArgList).data(),declArgList->constSpecifier);
}
@@ -2534,7 +2534,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
ol.docify(" [implementation]");
ol.endTypewriter();
}
-
+
bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
if (isProperty() && (isSettable() || isGettable() ||
@@ -2545,7 +2545,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
ol.startTypewriter();
ol.docify(" [");
QStrList sl;
-
+
if (isGettable()) sl.append("get");
if (isProtectedGettable()) sl.append("protected get");
if (isSettable()) sl.append("set");
@@ -4143,7 +4143,7 @@ void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturn
warn_doc_error(getDefFileName(),getDefLine(),"documented empty return type of %s",
qualifiedName().data());
}
- else if ( // see if return needs to documented
+ else if ( // see if return needs to documented
m_impl->hasDocumentedReturnType ||
isVoidReturn || // void return type
isFortranSubroutine || // fortran subroutine
@@ -4328,21 +4328,25 @@ void MemberDefImpl::setNamespace(NamespaceDef *nd)
}
MemberDef *MemberDefImpl::createTemplateInstanceMember(
- const ArgumentList &formalArgs,const ArgumentList &actualArgs) const
+ const ArgumentList &formalArgs,const std::unique_ptr<ArgumentList> &actualArgs) const
{
//printf(" Member %s %s %s\n",typeString(),name().data(),argsString());
- ArgumentList actualArgList;
+ std::unique_ptr<ArgumentList> actualArgList;
if (!m_impl->defArgList.empty())
{
- actualArgList = m_impl->defArgList;
+ actualArgList = std::make_unique<ArgumentList>(m_impl->defArgList);
// replace formal arguments with actuals
- for (Argument &arg : actualArgList)
+ for (Argument &arg : *actualArgList)
{
arg.type = substituteTemplateArgumentsInString(arg.type,formalArgs,actualArgs);
}
- actualArgList.trailingReturnType =
- substituteTemplateArgumentsInString(actualArgList.trailingReturnType,formalArgs,actualArgs);
+ actualArgList->trailingReturnType =
+ substituteTemplateArgumentsInString(actualArgList->trailingReturnType,formalArgs,actualArgs);
+ }
+ else
+ {
+ actualArgList = std::make_unique<ArgumentList>();
}
QCString methodName=name();
@@ -4357,10 +4361,10 @@ 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,
+ m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype,
ArgumentList(), ArgumentList(), ""
);
- imd->setArgumentList(actualArgList);
+ imd->moveArgumentList(std::move(actualArgList));
imd->setDefinition(substituteTemplateArgumentsInString(m_impl->def,formalArgs,actualArgs));
imd->setBodyDef(getBodyDef());
imd->setBodySegment(getDefLine(),getStartBodyLine(),getEndBodyLine());
@@ -4789,14 +4793,14 @@ void MemberDefImpl::writeEnumDeclaration(OutputList &typeDecl,
}
}
-void MemberDefImpl::setArgumentList(const ArgumentList &al)
+void MemberDefImpl::moveArgumentList(std::unique_ptr<ArgumentList> al)
{
- m_impl->defArgList = al;
+ m_impl->defArgList = *al;
}
-void MemberDefImpl::setDeclArgumentList(const ArgumentList &al)
+void MemberDefImpl::moveDeclArgumentList(std::unique_ptr<ArgumentList> al)
{
- m_impl->declArgList = al;
+ m_impl->declArgList = *al;
}
void MemberDefImpl::setTypeConstraints(const ArgumentList &al)
@@ -5956,8 +5960,8 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
const MemberDef *cmdef = const_cast<const MemberDef*>(mdef);
ArgumentList &mdefAl = mdef->argumentList();
ArgumentList &mdecAl = mdec->argumentList();
- if (matchArguments2(cmdef->getOuterScope(),cmdef->getFileDef(),mdefAl,
- cmdec->getOuterScope(),cmdec->getFileDef(),mdecAl,
+ if (matchArguments2(cmdef->getOuterScope(),cmdef->getFileDef(),&mdefAl,
+ cmdec->getOuterScope(),cmdec->getFileDef(),&mdecAl,
TRUE
)
) /* match found */
@@ -5987,10 +5991,9 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
mdec->setDocsForDefinition(mdef->isDocsForDefinition());
if (mdefAl.hasParameters())
{
- ArgumentList mdefAlComb;
- stringToArgumentList(mdef->getLanguage(),mdef->argsString(),mdefAlComb);
- transferArgumentDocumentation(mdefAl,mdefAlComb);
- mdec->setArgumentList(mdefAlComb);
+ auto mdefAlComb = stringToArgumentList(mdef->getLanguage(),mdef->argsString());
+ transferArgumentDocumentation(mdefAl,*mdefAlComb);
+ mdec->moveArgumentList(std::move(mdefAlComb));
}
}
else if (!mdec->documentation().isEmpty())
@@ -6000,10 +6003,9 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
mdef->setDocsForDefinition(mdec->isDocsForDefinition());
if (mdecAl.hasParameters())
{
- ArgumentList mdecAlComb;
- stringToArgumentList(mdec->getLanguage(),mdec->argsString(),mdecAlComb);
- transferArgumentDocumentation(mdecAl,mdecAlComb);
- mdef->setDeclArgumentList(mdecAlComb);
+ auto mdecAlComb = stringToArgumentList(mdec->getLanguage(),mdec->argsString());
+ transferArgumentDocumentation(mdecAl,*mdecAlComb);
+ mdef->moveDeclArgumentList(std::move(mdecAlComb));
}
}
if (!mdef->inbodyDocumentation().isEmpty())
diff --git a/src/memberdef.h b/src/memberdef.h
index a9103e1..4deb04a 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,6 +19,7 @@
#define MEMBERDEF_H
#include <vector>
+#include <memory>
#include <qlist.h>
#include <sys/types.h>
@@ -93,16 +94,16 @@ class MemberDef : virtual public Definition
// grabbing the property read/write accessor names
virtual const char *getReadAccessor() const = 0;
virtual const char *getWriteAccessor() const = 0;
-
+
// querying the grouping definition
virtual Grouping::GroupPri_t getGroupPri() const = 0;
virtual const char *getGroupFileName() const = 0;
virtual int getGroupStartLine() const = 0;
virtual bool getGroupHasDocs() const = 0;
virtual QCString qualifiedName() const = 0;
- virtual QCString objCMethodName(bool localLink,bool showStatic) const = 0;
+ virtual QCString objCMethodName(bool localLink,bool showStatic) const = 0;
- // direct kind info
+ // direct kind info
virtual Protection protection() const = 0;
virtual Specifier virtualness(int count=0) const = 0;
virtual MemberType memberType() const = 0;
@@ -326,15 +327,15 @@ class MemberDef : virtual public Definition
// example related members
virtual bool addExample(const char *anchor,const char *name,const char *file) = 0;
-
+
// prototype related members
virtual void setPrototype(bool p,const QCString &df,int line, int column) = 0;
virtual void setExplicitExternal(bool b,const QCString &df,int line,int column) = 0;
virtual void setDeclFile(const QCString &df,int line,int column) = 0;
// argument related members
- virtual void setArgumentList(const ArgumentList &al) = 0;
- virtual void setDeclArgumentList(const ArgumentList &al) = 0;
+ virtual void moveArgumentList(std::unique_ptr<ArgumentList> al) = 0;
+ virtual void moveDeclArgumentList(std::unique_ptr<ArgumentList> al) = 0;
virtual void setDefinitionTemplateParameterLists(const std::vector<ArgumentList> &lists) = 0;
virtual void setTypeConstraints(const ArgumentList &al) = 0;
virtual void setType(const char *t) = 0;
@@ -387,7 +388,7 @@ class MemberDef : virtual public Definition
//-----------------------------------------------------------------------------------
virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs,
- const ArgumentList &actualArgs) const = 0;
+ const std::unique_ptr<ArgumentList> &actualArgs) const = 0;
virtual void findSectionsInDocumentation() = 0;
virtual void addToSearchIndex() const = 0;
diff --git a/src/pre.l b/src/pre.l
index 351511b..e83a204 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -2805,10 +2805,8 @@ static void addDefine(yyscan_t yyscanner)
Public,Normal,FALSE,Member,MemberType_Define,ArgumentList(),ArgumentList(),"") };
if (!state->defArgsStr.isEmpty())
{
- ArgumentList argList;
//printf("addDefine() state->defName='%s' state->defArgsStr='%s'\n",state->defName.data(),state->defArgsStr.data());
- stringToArgumentList(SrcLangExt_Cpp, state->defArgsStr,argList);
- md->setArgumentList(argList);
+ md->moveArgumentList(stringToArgumentList(SrcLangExt_Cpp, state->defArgsStr));
}
//printf("Setting initializer for '%s' to '%s'\n",state->defName.data(),state->defText.data());
int l=state->defLitText.find('\n');
diff --git a/src/scanner.l b/src/scanner.l
index 25109bc..e25d268 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -4219,7 +4219,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
<ReadFuncArgType>")" {
*yyextra->copyArgString+=*yytext;
yyextra->fullArgString+=*yytext;
- stringToArgumentList(yyextra->language, yyextra->fullArgString,yyextra->current->argList);
+ yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
if (yyextra->insideJS)
{
fixArgumentListForJavaScript(yyextra->current->argList);
@@ -4246,7 +4246,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
{
unput(yytext[i]);
}
- stringToArgumentList(yyextra->language, yyextra->fullArgString,yyextra->current->argList);
+ yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
handleParametersCommentBlocks(yyscanner,yyextra->current->argList);
BEGIN( yyextra->currentArgumentContext );
}
@@ -4299,7 +4299,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
*yyextra->copyArgString+=*yytext;
yyextra->fullArgString+=*yytext;
- stringToArgumentList(yyextra->language, yyextra->fullArgString,yyextra->current->argList);
+ yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
handleParametersCommentBlocks(yyscanner,yyextra->current->argList);
BEGIN( yyextra->currentArgumentContext );
}
@@ -4380,7 +4380,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
*yyextra->copyArgString+=*yytext;
yyextra->fullArgString+=*yytext;
//printf("end template list '%s'\n",yyextra->copyArgString->data());
- stringToArgumentList(yyextra->language, yyextra->fullArgString,*yyextra->currentArgumentList);
+ *yyextra->currentArgumentList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
BEGIN( yyextra->currentArgumentContext );
}
<CopyArgRound>"(" {
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index 3a35a27..12010e8 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -1190,7 +1190,7 @@ void TagFileParser::buildMemberList(const std::shared_ptr<Entry> &ce,QList<TagMe
me->args = tmi->arglist;
if (!me->args.isEmpty())
{
- stringToArgumentList(SrcLangExt_Cpp,me->args,me->argList);
+ me->argList = *stringToArgumentList(SrcLangExt_Cpp,me->args);
}
if (tmi->enumValues.count()>0)
{
diff --git a/src/util.cpp b/src/util.cpp
index 6d6112e..4324ffd 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -20,6 +20,7 @@
#include <math.h>
#include <limits.h>
#include <cinttypes>
+#include <string.h>
#include "md5.h"
@@ -475,18 +476,7 @@ QCString resolveTypeDef(const Definition *context,const QCString &qualifiedName,
ClassDef *getClass(const char *n)
{
if (n==0 || n[0]=='\0') return 0;
- QCString name=n;
- ClassDef *result = Doxygen::classSDict->find(name);
- //if (result==0 && !exact) // also try generic and protocol versions
- //{
- // result = Doxygen::classSDict->find(name+"-g");
- // if (result==0)
- // {
- // result = Doxygen::classSDict->find(name+"-p");
- // }
- //}
- //printf("getClass(%s)=%s\n",n,result?result->name().data():"<none>");
- return result;
+ return Doxygen::classSDict->find(n);
}
NamespaceDef *getResolvedNamespace(const char *name)
@@ -540,7 +530,7 @@ const ClassDef *newResolveTypedef(const FileDef *fileScope,
const MemberDef **pMemType,
QCString *pTemplSpec,
QCString *pResolvedType,
- const ArgumentList *actTemplParams)
+ const std::unique_ptr<ArgumentList> &actTemplParams)
{
//printf("newResolveTypedef(md=%p,cachedVal=%p)\n",md,md->getCachedTypedefVal());
bool isCached = md->isTypedefValCached(); // value already cached
@@ -567,7 +557,7 @@ const ClassDef *newResolveTypedef(const FileDef *fileScope,
actTemplParams && !actTemplParams->empty())
{
type = substituteTemplateArgumentsInString(type,
- typeClass->templateArguments(),*actTemplParams);
+ typeClass->templateArguments(),actTemplParams);
}
QCString typedefValue = type;
int tl=type.length();
@@ -1218,7 +1208,7 @@ static void getResolvedSymbol(const Definition *scope,
const FileDef *fileScope,
Definition *d,
const QCString &explicitScopePart,
- ArgumentList *actTemplParams,
+ const std::unique_ptr<ArgumentList> &actTemplParams,
int &minDistance,
const ClassDef *&bestMatch,
const MemberDef *&bestTypedef,
@@ -1388,16 +1378,17 @@ static const ClassDef *getResolvedClassRec(const Definition *scope,
)
{
//printf("[getResolvedClassRec(%s,%s)\n",scope?scope->name().data():"<global>",n);
+ if (n==0 || *n=='\0') return 0;
QCString name;
QCString explicitScopePart;
QCString strippedTemplateParams;
name=stripTemplateSpecifiersFromScope
(removeRedundantWhiteSpace(n),TRUE,
&strippedTemplateParams);
- ArgumentList actTemplParams;
+ std::unique_ptr<ArgumentList> actTemplParams;
if (!strippedTemplateParams.isEmpty()) // template part that was stripped
{
- stringToArgumentList(scope->getLanguage(),strippedTemplateParams,actTemplParams);
+ actTemplParams = stringToArgumentList(scope->getLanguage(),strippedTemplateParams);
}
int qualifierIndex = computeQualifiedIndex(name);
@@ -1423,16 +1414,12 @@ static const ClassDef *getResolvedClassRec(const Definition *scope,
// stripped from the key used in the symbolMap, so that is not needed here.
if (di==0)
{
- //di = Doxygen::symbolMap->find(name+"-g");
- //if (di==0)
- //{
- di = Doxygen::symbolMap->find(name+"-p");
- if (di==0)
- {
- //printf("no such symbol!\n");
- return 0;
- }
- //}
+ di = Doxygen::symbolMap->find(name+"-p");
+ if (di==0)
+ {
+ //printf("no such symbol!\n");
+ return 0;
+ }
}
//printf("found symbol!\n");
@@ -1515,7 +1502,7 @@ static const ClassDef *getResolvedClassRec(const Definition *scope,
int count=0;
for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition
{
- getResolvedSymbol(scope,fileScope,d,explicitScopePart,&actTemplParams,
+ getResolvedSymbol(scope,fileScope,d,explicitScopePart,actTemplParams,
minDistance,bestMatch,bestTypedef,bestTemplSpec,
bestResolvedType);
}
@@ -1524,7 +1511,7 @@ static const ClassDef *getResolvedClassRec(const Definition *scope,
{
//printf(" name is unique\n");
Definition *d = (Definition *)di;
- getResolvedSymbol(scope,fileScope,d,explicitScopePart,&actTemplParams,
+ getResolvedSymbol(scope,fileScope,d,explicitScopePart,actTemplParams,
minDistance,bestMatch,bestTypedef,bestTemplSpec,
bestResolvedType);
}
@@ -3173,34 +3160,46 @@ static bool matchArgument2(
// new algorithm for argument matching
-bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList &inSrcAl,
- const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList &inDstAl,
+bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList *srcAl,
+ const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList *dstAl,
bool checkCV)
{
ASSERT(srcScope!=0 && dstScope!=0);
- ArgumentList srcAl = inSrcAl;
- ArgumentList dstAl = inDstAl;
+ if (srcAl==0 || dstAl==0)
+ {
+ bool match = srcAl==dstAl;
+ if (match)
+ {
+ MATCH
+ return TRUE;
+ }
+ else
+ {
+ NOMATCH
+ return FALSE;
+ }
+ }
// handle special case with void argument
- if ( srcAl.empty() && dstAl.size()==1 && dstAl.front().type=="void" )
+ if ( srcAl->empty() && dstAl->size()==1 && dstAl->front().type=="void" )
{ // special case for finding match between func() and func(void)
Argument a;
a.type = "void";
- srcAl.push_back(a);
+ const_cast<ArgumentList*>(srcAl)->push_back(a);
MATCH
return TRUE;
}
- if ( dstAl.empty() && srcAl.size()==1 && srcAl.front().type=="void" )
+ if ( dstAl->empty() && srcAl->size()==1 && srcAl->front().type=="void" )
{ // special case for finding match between func(void) and func()
Argument a;
a.type = "void";
- dstAl.push_back(a);
+ const_cast<ArgumentList*>(dstAl)->push_back(a);
MATCH
return TRUE;
}
- if (srcAl.size() != dstAl.size())
+ if (srcAl->size() != dstAl->size())
{
NOMATCH
return FALSE; // different number of arguments -> no match
@@ -3208,19 +3207,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
@@ -3228,12 +3227,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.
- auto srcIt = srcAl.begin();
- auto dstIt = dstAl.begin();
- for (;srcIt!=srcAl.end() && dstIt!=dstAl.end();++srcIt,++dstIt)
+ auto srcIt = srcAl->begin();
+ auto dstIt = dstAl->begin();
+ for (;srcIt!=srcAl->end() && dstIt!=dstAl->end();++srcIt,++dstIt)
{
- Argument &srcA = *srcIt;
- Argument &dstA = *dstIt;
+ Argument &srcA = const_cast<Argument&>(*srcIt);
+ Argument &dstA = const_cast<Argument&>(*dstIt);
if (!matchArgument2(srcScope,srcFileScope,srcA,
dstScope,dstFileScope,dstA)
)
@@ -3413,11 +3412,10 @@ static void findMembersWithSpecificName(MemberName *mn,
if (args && !md->isDefine() && qstrcmp(args,"()")!=0)
{
const ArgumentList &mdAl = md->argumentList();
- ArgumentList argList;
- stringToArgumentList(md->getLanguage(),args,argList);
+ auto argList_p = stringToArgumentList(md->getLanguage(),args);
match=matchArguments2(
- md->getOuterScope(),fd,mdAl,
- Doxygen::globalScope,fd,argList,
+ md->getOuterScope(),fd,&mdAl,
+ Doxygen::globalScope,fd,argList_p.get(),
checkCV);
}
if (match && (forceTagFile==0 || md->getReference()==forceTagFile))
@@ -3540,10 +3538,10 @@ bool getDefs(const QCString &scName,
{
//printf(" Found fcd=%p\n",fcd);
int mdist=maxInheritanceDepth;
- ArgumentList argList;
+ std::unique_ptr<ArgumentList> argList;
if (args)
{
- stringToArgumentList(fcd->getLanguage(),args,argList);
+ argList = stringToArgumentList(fcd->getLanguage(),args);
}
for (const auto &mmd : *mn)
{
@@ -3551,8 +3549,8 @@ bool getDefs(const QCString &scName,
{
const ArgumentList &mmdAl = mmd->argumentList();
bool match=args==0 ||
- matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
- fcd, fcd->getFileDef(),argList,
+ matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),&mmdAl,
+ fcd, fcd->getFileDef(),argList.get(),
checkCV);
//printf("match=%d\n",match);
if (match)
@@ -3656,12 +3654,12 @@ bool getDefs(const QCString &scName,
{
//printf("Global symbol\n");
MemberDef *fuzzy_mmd = 0;
- ArgumentList argList;
+ std::unique_ptr<ArgumentList> argList;
bool hasEmptyArgs = args && qstrcmp(args, "()") == 0;
if (args)
{
- stringToArgumentList(SrcLangExt_Cpp, args, argList);
+ argList = stringToArgumentList(SrcLangExt_Cpp, args);
}
for (const auto &mmd : *mn)
@@ -3679,8 +3677,8 @@ bool getDefs(const QCString &scName,
}
ArgumentList &mmdAl = mmd->argumentList();
- if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
- Doxygen::globalScope,mmd->getFileDef(),argList,
+ if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),&mmdAl,
+ Doxygen::globalScope,mmd->getFileDef(),argList.get(),
checkCV
)
)
@@ -3759,14 +3757,13 @@ bool getDefs(const QCString &scName,
else if (mmd->getOuterScope()==fnd /* && mmd->isLinkable() */ )
{ // namespace is found
bool match=TRUE;
- ArgumentList argList;
if (args && qstrcmp(args,"()")!=0)
{
const ArgumentList &mmdAl = mmd->argumentList();
- stringToArgumentList(mmd->getLanguage(),args,argList);
+ auto argList_p = stringToArgumentList(mmd->getLanguage(),args);
match=matchArguments2(
- mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
- fnd,mmd->getFileDef(),argList,
+ mmd->getOuterScope(),mmd->getFileDef(),&mmdAl,
+ fnd,mmd->getFileDef(),argList_p.get(),
checkCV);
}
if (match)
@@ -5868,7 +5865,7 @@ QCString normalizeNonTemplateArgumentsInString(
QCString substituteTemplateArgumentsInString(
const QCString &name,
const ArgumentList &formalArgs,
- const ArgumentList &actualArgs)
+ const std::unique_ptr<ArgumentList> &actualArgs)
{
//printf("substituteTemplateArgumentsInString(name=%s formal=%s actualArg=%s)\n",
// name.data(),argListToString(formalArgs).data(),argListToString(actualArgs).data());
@@ -5881,7 +5878,11 @@ QCString substituteTemplateArgumentsInString(
{
result += name.mid(p,i-p);
QCString n = name.mid(i,l);
- auto actIt = actualArgs.begin();
+ ArgumentList::iterator actIt;
+ if (actualArgs)
+ {
+ actIt = actualArgs->begin();
+ }
// if n is a template argument, then we substitute it
// for its template instance argument.
@@ -5893,7 +5894,7 @@ QCString substituteTemplateArgumentsInString(
{
Argument formArg = *formIt;
Argument actArg;
- if (actIt!=actualArgs.end())
+ if (actualArgs && actIt!=actualArgs->end())
{
actArg = *actIt;
}
@@ -5914,7 +5915,7 @@ QCString substituteTemplateArgumentsInString(
//printf(">> n='%s' formArg->name='%s' actArg->type='%s' actArg->name='%s'\n",
// n.data(),formArg.name.data(),actIt!=actualArgs.end() ? actIt->type.data() : "",actIt!=actualArgs.end() ? actIt->name.data() : ""
// );
- if (formArg.name==n && actIt!=actualArgs.end() && !actArg.type.isEmpty()) // base class is a template argument
+ if (formArg.name==n && actualArgs && 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))
@@ -5939,7 +5940,7 @@ QCString substituteTemplateArgumentsInString(
}
}
else if (formArg.name==n &&
- actIt==actualArgs.end() &&
+ (actualArgs==nullptr || actIt==actualArgs->end()) &&
!formArg.defval.isEmpty() &&
formArg.defval!=name /* to prevent recursion */
)
@@ -5949,7 +5950,7 @@ QCString substituteTemplateArgumentsInString(
}
}
else if (formArg.name==n &&
- actIt==actualArgs.end() &&
+ (actualArgs==nullptr || actIt==actualArgs->end()) &&
!formArg.defval.isEmpty() &&
formArg.defval!=name /* to prevent recursion */
)
@@ -5957,7 +5958,7 @@ QCString substituteTemplateArgumentsInString(
result += substituteTemplateArgumentsInString(formArg.defval,formalArgs,actualArgs)+" ";
found=TRUE;
}
- if (actIt!=actualArgs.end())
+ if (actualArgs && actIt!=actualArgs->end())
{
actIt++;
}
@@ -5986,10 +5987,11 @@ QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
bool parentOnly,
QCString *pLastScopeStripped)
{
+ int i=fullName.find('<');
+ if (i==-1) return fullName;
QCString result;
int p=0;
int l=fullName.length();
- int i=fullName.find('<');
while (i!=-1)
{
//printf("1:result+=%s\n",fullName.mid(p,i-p).data());
@@ -6588,7 +6590,9 @@ bool checkExtension(const char *fName, const char *ext)
QCString addHtmlExtensionIfMissing(const char *fName)
{
- if (QFileInfo(fName).extension(FALSE).isEmpty())
+ if (fName==0) return fName;
+ const char *p = strchr(fName,'.');
+ if (p)
{
return QCString(fName)+Doxygen::htmlFileExtension;
}
diff --git a/src/util.h b/src/util.h
index 98223b1..7518330 100644
--- a/src/util.h
+++ b/src/util.h
@@ -22,6 +22,8 @@
* \brief A bunch of utility functions.
*/
+#include <memory>
+
#include <qlist.h>
#include <ctype.h>
#include "types.h"
@@ -184,8 +186,8 @@ 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
);
@@ -308,7 +310,7 @@ QCString normalizeNonTemplateArgumentsInString(
QCString substituteTemplateArgumentsInString(
const QCString &name,
const ArgumentList &formalArgs,
- const ArgumentList &actualArgs);
+ const std::unique_ptr<ArgumentList> &actualArgs);
//QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists);
@@ -410,7 +412,7 @@ const ClassDef *newResolveTypedef(const FileDef *fileScope,
const MemberDef **pMemType=0,
QCString *pTemplSpec=0,
QCString *pResolvedType=0,
- const ArgumentList *actTemplParams=0);
+ const std::unique_ptr<ArgumentList> &actTemplParams=std::unique_ptr<ArgumentList>());
QCString parseCommentAsText(const Definition *scope,const MemberDef *member,const QCString &doc,const QCString &fileName,int lineNr);