Skip to content

Commit 784313b

Browse files
committed
Refactoring: replacing dynamic_cast by static_cast to improve performance
1 parent 075229e commit 784313b

40 files changed

+1169
-601
lines changed

src/clangparser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,7 @@ void ClangTUParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
696696
p->currentMemberDef && d->definitionType()==Definition::TypeMember &&
697697
(p->currentMemberDef!=d || p->currentLine<line)) // avoid self-reference
698698
{
699-
addDocCrossReference(MemberDef::make_mutable(p->currentMemberDef),MemberDef::make_mutable(dynamic_cast<MemberDef *>(d)));
699+
addDocCrossReference(toMemberDefMutable(p->currentMemberDef),toMemberDefMutable(d));
700700
}
701701
writeMultiLineCodeLink(ol,fd,line,column,d,text);
702702
}

src/classdef.cpp

Lines changed: 94 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656

5757

5858
/** Implementation of the ClassDef interface */
59-
class ClassDefImpl : public DefinitionImpl, public ClassDefMutable
59+
class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
6060
{
6161
public:
6262
ClassDefImpl(const char *fileName,int startLine,int startColumn,
@@ -283,14 +283,15 @@ ClassDefMutable *createClassDef(
283283
}
284284
//-----------------------------------------------------------------------------
285285

286-
class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
286+
class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
287287
{
288288
public:
289-
ClassDefAliasImpl(const Definition *newScope,const ClassDef *cd) : DefinitionAliasImpl(newScope,cd) {}
289+
ClassDefAliasImpl(const Definition *newScope,const ClassDef *cd)
290+
: DefinitionAliasMixin(newScope,cd) {}
290291
virtual ~ClassDefAliasImpl() {}
291292
virtual DefType definitionType() const { return TypeClass; }
292293

293-
const ClassDef *getCdAlias() const { return dynamic_cast<const ClassDef*>(getAlias()); }
294+
const ClassDef *getCdAlias() const { return toClassDef(getAlias()); }
294295
virtual ClassDef *resolveAlias() { return const_cast<ClassDef*>(getCdAlias()); }
295296

296297
virtual QCString getOutputFileBase() const
@@ -726,7 +727,7 @@ ClassDefImpl::ClassDefImpl(
726727
const char *nm,CompoundType ct,
727728
const char *lref,const char *fName,
728729
bool isSymbol,bool isJavaEnum)
729-
: DefinitionImpl(defFileName,defLine,defColumn,removeRedundantWhiteSpace(nm),0,0,isSymbol)
730+
: DefinitionMixin(defFileName,defLine,defColumn,removeRedundantWhiteSpace(nm),0,0,isSymbol)
730731
{
731732
m_visited=FALSE;
732733
setReference(lref);
@@ -1217,7 +1218,7 @@ void ClassDefImpl::insertUsedFile(FileDef *fd)
12171218
ClassDef *cd;
12181219
for (qdi.toFirst();(cd=qdi.current());++qdi)
12191220
{
1220-
ClassDefMutable *cdm = ClassDef::make_mutable(cd);
1221+
ClassDefMutable *cdm = toClassDefMutable(cd);
12211222
if (cdm)
12221223
{
12231224
cdm->insertUsedFile(fd);
@@ -1298,7 +1299,7 @@ static void searchTemplateSpecs(/*in*/ const Definition *d,
12981299
{
12991300
searchTemplateSpecs(d->getOuterScope(),result,name,lang);
13001301
}
1301-
const ClassDef *cd=dynamic_cast<const ClassDef *>(d);
1302+
const ClassDef *cd=toClassDef(d);
13021303
if (!name.isEmpty()) name+="::";
13031304
QCString clName = d->localName();
13041305
if (/*clName.right(2)=="-g" ||*/ clName.right(2)=="-p")
@@ -2851,7 +2852,7 @@ void ClassDefImpl::writeDocumentationForInnerClasses(OutputList &ol) const
28512852
ClassDef *innerCd;
28522853
for (cli.toFirst();(innerCd=cli.current());++cli)
28532854
{
2854-
ClassDefMutable *innerCdm = ClassDef::make_mutable(innerCd);
2855+
ClassDefMutable *innerCdm = toClassDefMutable(innerCd);
28552856
if (innerCdm)
28562857
{
28572858
if (
@@ -3398,7 +3399,7 @@ bool ClassDefImpl::isVisibleInHierarchy() const
33983399

33993400
bool ClassDefImpl::hasDocumentation() const
34003401
{
3401-
return DefinitionImpl::hasDocumentation();
3402+
return DefinitionMixin::hasDocumentation();
34023403
}
34033404

34043405
//----------------------------------------------------------------------
@@ -3474,7 +3475,7 @@ void ClassDefImpl::mergeMembers()
34743475
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
34753476
for (const auto &bcd : baseClasses())
34763477
{
3477-
ClassDefMutable *bClass=ClassDef::make_mutable(bcd.classDef);
3478+
ClassDefMutable *bClass=toClassDefMutable(bcd.classDef);
34783479
if (bClass)
34793480
{
34803481
// merge the members in the base class of this inheritance branch first
@@ -3689,7 +3690,7 @@ void ClassDefImpl::mergeMembers()
36893690
*/
36903691
void ClassDefImpl::mergeCategory(ClassDef *cat)
36913692
{
3692-
ClassDefMutable *category = ClassDef::make_mutable(cat);
3693+
ClassDefMutable *category = toClassDefMutable(cat);
36933694
if (category)
36943695
{
36953696
static bool extractLocalMethods = Config_getBool(EXTRACT_LOCAL_METHODS);
@@ -3737,8 +3738,8 @@ void ClassDefImpl::mergeCategory(ClassDef *cat)
37373738
auto &srcMi = srcMni->front();
37383739
if (srcMi && dstMi)
37393740
{
3740-
MemberDefMutable *smdm = MemberDef::make_mutable(srcMi->memberDef());
3741-
MemberDefMutable *dmdm = MemberDef::make_mutable(dstMi->memberDef());
3741+
MemberDefMutable *smdm = toMemberDefMutable(srcMi->memberDef());
3742+
MemberDefMutable *dmdm = toMemberDefMutable(dstMi->memberDef());
37423743
if (smdm && dmdm)
37433744
{
37443745
combineDeclarationAndDefinition(smdm,dmdm);
@@ -3760,7 +3761,7 @@ void ClassDefImpl::mergeCategory(ClassDef *cat)
37603761
//printf("Adding '%s'\n",mi->memberDef->name().data());
37613762
Protection prot = mi->prot();
37623763
//if (makePrivate) prot = Private;
3763-
std::unique_ptr<MemberDefMutable> newMd { MemberDef::make_mutable(mi->memberDef()->deepCopy()) };
3764+
std::unique_ptr<MemberDefMutable> newMd { toMemberDefMutable(mi->memberDef()->deepCopy()) };
37643765
if (newMd)
37653766
{
37663767
//printf("Copying member %s\n",mi->memberDef->name().data());
@@ -3782,7 +3783,7 @@ void ClassDefImpl::mergeCategory(ClassDef *cat)
37823783
newMd->setCategory(category);
37833784
newMd->setCategoryRelation(mi->memberDef());
37843785
}
3785-
MemberDefMutable *mdm = MemberDef::make_mutable(mi->memberDef());
3786+
MemberDefMutable *mdm = toMemberDefMutable(mi->memberDef());
37863787
if (mdm)
37873788
{
37883789
mdm->setCategoryRelation(newMd.get());
@@ -3955,7 +3956,7 @@ QCString ClassDefImpl::getSourceFileBase() const
39553956
}
39563957
else
39573958
{
3958-
return DefinitionImpl::getSourceFileBase();
3959+
return DefinitionMixin::getSourceFileBase();
39593960
}
39603961
}
39613962

@@ -3967,12 +3968,12 @@ void ClassDefImpl::setGroupDefForAllMembers(GroupDef *gd,Grouping::GroupPri_t pr
39673968
{
39683969
for (auto &mi : *mni)
39693970
{
3970-
MemberDefMutable *md = MemberDef::make_mutable(mi->memberDef());
3971+
MemberDefMutable *md = toMemberDefMutable(mi->memberDef());
39713972
if (md)
39723973
{
39733974
md->setGroupDef(gd,pri,fileName,startLine,hasDocs);
39743975
gd->insertMember(md,TRUE);
3975-
ClassDefMutable *innerClass = ClassDef::make_mutable(md->getClassDefOfAnonymousType());
3976+
ClassDefMutable *innerClass = toClassDefMutable(md->getClassDefOfAnonymousType());
39763977
if (innerClass) innerClass->setGroupDefForAllMembers(gd,pri,fileName,startLine,hasDocs);
39773978
}
39783979
}
@@ -3989,7 +3990,7 @@ void ClassDefImpl::addInnerCompound(const Definition *d)
39893990
{
39903991
m_impl->innerClasses = new ClassSDict(17);
39913992
}
3992-
m_impl->innerClasses->inSort(d->localName(),dynamic_cast<const ClassDef *>(d));
3993+
m_impl->innerClasses->inSort(d->localName(),toClassDef(d));
39933994
}
39943995
}
39953996

@@ -4012,7 +4013,7 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
40124013
{
40134014
m_impl->templateInstances = new QDict<ClassDef>(17);
40144015
}
4015-
ClassDefMutable *templateClass=ClassDef::make_mutable(m_impl->templateInstances->find(templSpec));
4016+
ClassDefMutable *templateClass=toClassDefMutable(m_impl->templateInstances->find(templSpec));
40164017
if (templateClass==0)
40174018
{
40184019
Debug::print(Debug::Classes,0," New template instance class '%s''%s'\n",qPrint(name()),qPrint(templSpec));
@@ -4035,7 +4036,7 @@ ClassDef *ClassDefImpl::getVariableInstance(const char *templSpec) const
40354036
m_impl->variableInstances = new QDict<ClassDef>(17);
40364037
m_impl->variableInstances->setAutoDelete(TRUE);
40374038
}
4038-
ClassDefMutable *templateClass=ClassDef::make_mutable(m_impl->variableInstances->find(templSpec));
4039+
ClassDefMutable *templateClass=toClassDefMutable(m_impl->variableInstances->find(templSpec));
40394040
if (templateClass==0)
40404041
{
40414042
Debug::print(Debug::Classes,0," New template variable instance class '%s' '%s'\n",qPrint(name()),qPrint(templSpec));
@@ -4112,7 +4113,7 @@ QCString ClassDefImpl::getReference() const
41124113
}
41134114
else
41144115
{
4115-
return DefinitionImpl::getReference();
4116+
return DefinitionMixin::getReference();
41164117
}
41174118
}
41184119

@@ -4124,7 +4125,7 @@ bool ClassDefImpl::isReference() const
41244125
}
41254126
else
41264127
{
4127-
return DefinitionImpl::isReference();
4128+
return DefinitionMixin::isReference();
41284129
}
41294130
}
41304131

@@ -4134,7 +4135,7 @@ ArgumentLists ClassDefImpl::getTemplateParameterLists() const
41344135
Definition *d=getOuterScope();
41354136
while (d && d->definitionType()==Definition::TypeClass)
41364137
{
4137-
result.insert(result.begin(),dynamic_cast<ClassDef*>(d)->templateArguments());
4138+
result.insert(result.begin(),toClassDef(d)->templateArguments());
41384139
d = d->getOuterScope();
41394140
}
41404141
if (!templateArguments().empty())
@@ -4156,7 +4157,7 @@ QCString ClassDefImpl::qualifiedNameWithTemplateParameters(
41564157
{
41574158
if (d->definitionType()==Definition::TypeClass)
41584159
{
4159-
ClassDef *cd=dynamic_cast<ClassDef *>(d);
4160+
ClassDef *cd=toClassDef(d);
41604161
scName = cd->qualifiedNameWithTemplateParameters(actualParams,actualParamIndex);
41614162
}
41624163
else if (!hideScopeNames)
@@ -4329,7 +4330,7 @@ void ClassDefImpl::addMemberToList(MemberListType lt,MemberDef *md,bool isBrief)
43294330
// for members in the declaration lists we set the section, needed for member grouping
43304331
if ((ml->listType()&MemberListType_detailedLists)==0)
43314332
{
4332-
MemberDefMutable *mdm = MemberDef::make_mutable(md);
4333+
MemberDefMutable *mdm = toMemberDefMutable(md);
43334334
if (mdm)
43344335
{
43354336
mdm->setSectionList(this,ml);
@@ -4456,7 +4457,7 @@ int ClassDefImpl::countInheritedDecMembers(MemberListType lt,
44564457
{
44574458
for (const auto &ibcd : m_impl->inherits)
44584459
{
4459-
ClassDefMutable *icd=ClassDef::make_mutable(ibcd.classDef);
4460+
ClassDefMutable *icd=toClassDefMutable(ibcd.classDef);
44604461
int lt1,lt2;
44614462
if (icd && icd->isLinkable())
44624463
{
@@ -4592,7 +4593,7 @@ void ClassDefImpl::writeInheritedMemberDeclarations(OutputList &ol,
45924593
{
45934594
for (const auto &ibcd : m_impl->inherits)
45944595
{
4595-
ClassDefMutable *icd=ClassDef::make_mutable(ibcd.classDef);
4596+
ClassDefMutable *icd=toClassDefMutable(ibcd.classDef);
45964597
if (icd && icd->isLinkable())
45974598
{
45984599
int lt1,lt3;
@@ -5104,7 +5105,7 @@ bool ClassDefImpl::isSliceLocal() const
51045105

51055106
void ClassDefImpl::setName(const char *name)
51065107
{
5107-
DefinitionImpl::setName(name);
5108+
DefinitionMixin::setName(name);
51085109
}
51095110

51105111
void ClassDefImpl::setMetaData(const char *md)
@@ -5122,3 +5123,67 @@ QCString ClassDefImpl::inheritanceGraphFileName() const
51225123
return m_impl->inheritFileName;
51235124
}
51245125

5126+
// --- Cast functions
5127+
//
5128+
ClassDef *toClassDef(Definition *d)
5129+
{
5130+
if (d && (typeid(*d)==typeid(ClassDefImpl) || typeid(*d)==typeid(ClassDefAliasImpl)))
5131+
{
5132+
return static_cast<ClassDef*>(d);
5133+
}
5134+
else
5135+
{
5136+
return 0;
5137+
}
5138+
}
5139+
5140+
ClassDef *toClassDef(DefinitionMutable *md)
5141+
{
5142+
Definition *d = toDefinition(md);
5143+
if (d && typeid(*d)==typeid(ClassDefImpl))
5144+
{
5145+
return static_cast<ClassDef*>(d);
5146+
}
5147+
else
5148+
{
5149+
return 0;
5150+
}
5151+
}
5152+
5153+
const ClassDef *toClassDef(const Definition *d)
5154+
{
5155+
if (d && (typeid(*d)==typeid(ClassDefImpl) || typeid(*d)==typeid(ClassDefAliasImpl)))
5156+
{
5157+
return static_cast<const ClassDef*>(d);
5158+
}
5159+
else
5160+
{
5161+
return 0;
5162+
}
5163+
}
5164+
5165+
ClassDefMutable *toClassDefMutable(Definition *d)
5166+
{
5167+
if (d && typeid(*d)==typeid(ClassDefImpl))
5168+
{
5169+
return static_cast<ClassDefMutable*>(d);
5170+
}
5171+
else
5172+
{
5173+
return 0;
5174+
}
5175+
}
5176+
5177+
ClassDefMutable *toClassDefMutable(const Definition *d)
5178+
{
5179+
if (d && typeid(*d)==typeid(ClassDefImpl))
5180+
{
5181+
return const_cast<ClassDefMutable*>(static_cast<const ClassDefMutable*>(d));
5182+
}
5183+
else
5184+
{
5185+
return 0;
5186+
}
5187+
}
5188+
5189+

src/classdef.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ using BaseClassList = std::vector<BaseClassDef>;
9191
* A compound can be a class, struct, union, interface, service, singleton,
9292
* or exception.
9393
*/
94-
class ClassDef : virtual public Definition
94+
class ClassDef : public Definition
9595
{
9696
public:
9797
/** The various compound types */
@@ -108,8 +108,6 @@ class ClassDef : virtual public Definition
108108

109109
virtual ~ClassDef() {}
110110

111-
static ClassDefMutable *make_mutable(const ClassDef *);
112-
113111
//-----------------------------------------------------------------------------------
114112
// --- getters
115113
//-----------------------------------------------------------------------------------
@@ -386,7 +384,7 @@ class ClassDef : virtual public Definition
386384

387385
};
388386

389-
class ClassDefMutable : virtual public DefinitionMutable, virtual public ClassDef
387+
class ClassDefMutable : public DefinitionMutable, public ClassDef
390388
{
391389
public:
392390
//-----------------------------------------------------------------------------------
@@ -467,9 +465,6 @@ class ClassDefMutable : virtual public DefinitionMutable, virtual public ClassDe
467465

468466
};
469467

470-
inline ClassDefMutable *ClassDef::make_mutable(const ClassDef *cd)
471-
{ return dynamic_cast<ClassDefMutable*>(const_cast<ClassDef*>(cd)); }
472-
473468
/** Factory method to create a new ClassDef object */
474469
ClassDefMutable *createClassDef(
475470
const char *fileName,int startLine,int startColumn,
@@ -479,6 +474,13 @@ ClassDefMutable *createClassDef(
479474

480475
ClassDef *createClassDefAlias(const Definition *newScope,const ClassDef *cd);
481476

477+
// --- Cast functions
478+
479+
ClassDef *toClassDef(Definition *d);
480+
ClassDef *toClassDef(DefinitionMutable *d);
481+
const ClassDef *toClassDef(const Definition *d);
482+
ClassDefMutable *toClassDefMutable(Definition *d);
483+
ClassDefMutable *toClassDefMutable(const Definition *d);
482484

483485
//------------------------------------------------------------------------
484486

src/classlist.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *f
102102
bool found=FALSE;
103103
for (sdi.toFirst();(cd=sdi.current());++sdi)
104104
{
105-
ClassDefMutable *cdm = ClassDef::make_mutable(cd);
105+
ClassDefMutable *cdm = toClassDefMutable(cd);
106106
//printf(" ClassSDict::writeDeclaration for %s\n",cd->name().data());
107107
if (cdm &&
108108
!cd->isAnonymous() &&
@@ -139,7 +139,7 @@ void ClassSDict::writeDocumentation(OutputList &ol,const Definition * container)
139139
// cd->name().data(),cd->getOuterScope(),cd->isLinkableInProject(),cd->isEmbeddedInOuterScope(),
140140
// container,cd->partOfGroups() ? cd->partOfGroups()->count() : 0);
141141

142-
ClassDefMutable *cdm = ClassDef::make_mutable(cd);
142+
ClassDefMutable *cdm = toClassDefMutable(cd);
143143
if (cdm &&
144144
!cd->isAnonymous() &&
145145
cd->isLinkableInProject() &&

0 commit comments

Comments
 (0)