Skip to content

Commit 62e5802

Browse files
committed
Refactoring: modernize ClassDef::getTemplateInstances()
1 parent 0aa9077 commit 62e5802

File tree

4 files changed

+44
-63
lines changed

4 files changed

+44
-63
lines changed

src/classdef.cpp

+19-27
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
196196
virtual bool isBaseClass(const ClassDef *bcd,bool followInstances,int level=0) const;
197197
virtual bool isSubClass(ClassDef *bcd,int level=0) const;
198198
virtual bool isAccessibleMember(const MemberDef *md) const;
199-
virtual QDict<ClassDef> *getTemplateInstances() const;
199+
virtual const TemplateInstanceList &getTemplateInstances() const;
200200
virtual const ClassDef *templateMaster() const;
201201
virtual bool isTemplate() const;
202202
virtual IncludeInfo *includeInfo() const;
@@ -441,7 +441,7 @@ class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
441441
{ return getCdAlias()->isSubClass(bcd,level); }
442442
virtual bool isAccessibleMember(const MemberDef *md) const
443443
{ return getCdAlias()->isAccessibleMember(md); }
444-
virtual QDict<ClassDef> *getTemplateInstances() const
444+
virtual const TemplateInstanceList &getTemplateInstances() const
445445
{ return getCdAlias()->getTemplateInstances(); }
446446
virtual const ClassDef *templateMaster() const
447447
{ return getCdAlias()->templateMaster(); }
@@ -652,7 +652,7 @@ class ClassDefImpl::IMPL
652652
/*! Template instances that exists of this class, the key in the
653653
* dictionary is the template argument list.
654654
*/
655-
mutable QDict<ClassDef> *templateInstances = 0;
655+
TemplateInstanceList templateInstances;
656656

657657
/*! Template instances that exists of this class, as defined by variables.
658658
* We do NOT want to document these individually. The key in the
@@ -740,7 +740,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
740740
usesIntfClassDict=0;
741741
constraintClassDict=0;
742742
subGrouping=Config_getBool(SUBGROUPING);
743-
templateInstances = 0;
744743
variableInstances = 0;
745744
templateMaster =0;
746745
templBaseClassNames = 0;
@@ -782,7 +781,6 @@ ClassDefImpl::IMPL::~IMPL()
782781
delete usesIntfClassDict;
783782
delete constraintClassDict;
784783
delete incInfo;
785-
delete templateInstances;
786784
delete variableInstances;
787785
delete templBaseClassNames;
788786
}
@@ -1209,17 +1207,12 @@ void ClassDefImpl::insertUsedFile(FileDef *fd)
12091207
{
12101208
if (fd==0) return;
12111209
if (m_impl->files.find(fd)==-1) m_impl->files.append(fd);
1212-
if (m_impl->templateInstances)
1210+
for (const auto &ti : m_impl->templateInstances)
12131211
{
1214-
QDictIterator<ClassDef> qdi(*m_impl->templateInstances);
1215-
ClassDef *cd;
1216-
for (qdi.toFirst();(cd=qdi.current());++qdi)
1212+
ClassDefMutable *cdm = toClassDefMutable(ti.classDef);
1213+
if (cdm)
12171214
{
1218-
ClassDefMutable *cdm = toClassDefMutable(cd);
1219-
if (cdm)
1220-
{
1221-
cdm->insertUsedFile(fd);
1222-
}
1215+
cdm->insertUsedFile(fd);
12231216
}
12241217
}
12251218
}
@@ -3215,15 +3208,11 @@ bool ClassDefImpl::hasNonReferenceSuperClass() const
32153208
if (!found)
32163209
{
32173210
// look for template instances that might have non-reference super classes
3218-
QDict<ClassDef> *cil = bcd->getTemplateInstances();
3219-
if (cil)
3211+
for (const auto &cil : bcd->getTemplateInstances())
32203212
{
3221-
QDictIterator<ClassDef> tidi(*cil);
3222-
for ( ; tidi.current() && !found ; ++tidi) // for each template instance
3223-
{
3224-
// recurse into the template instance branch
3225-
found = found || tidi.current()->hasNonReferenceSuperClass();
3226-
}
3213+
// recurse into the template instance branch
3214+
found = cil.classDef->hasNonReferenceSuperClass();
3215+
if (found) break;
32273216
}
32283217
}
32293218
else
@@ -3939,11 +3928,14 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
39393928
int startLine, int startColumn, const QCString &templSpec,bool &freshInstance) const
39403929
{
39413930
freshInstance = FALSE;
3942-
if (m_impl->templateInstances==0)
3931+
auto it = std::find_if(m_impl->templateInstances.begin(),
3932+
m_impl->templateInstances.end(),
3933+
[&templSpec](const auto &ti) { return templSpec==ti.templSpec; });
3934+
ClassDefMutable *templateClass=0;
3935+
if (it!=m_impl->templateInstances.end())
39433936
{
3944-
m_impl->templateInstances = new QDict<ClassDef>(17);
3937+
templateClass = toClassDefMutable((*it).classDef);
39453938
}
3946-
ClassDefMutable *templateClass=toClassDefMutable(m_impl->templateInstances->find(templSpec));
39473939
if (templateClass==0)
39483940
{
39493941
QCString tcname = removeRedundantWhiteSpace(localName()+templSpec);
@@ -3965,7 +3957,7 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
39653957
templateClass->setOuterScope(getOuterScope());
39663958
templateClass->setHidden(isHidden());
39673959
templateClass->setArtificial(isArtificial());
3968-
m_impl->templateInstances->insert(templSpec,templateClass);
3960+
m_impl->templateInstances.push_back(TemplateInstanceDef(templSpec,templateClass));
39693961

39703962
// also add nested classes
39713963
for (const auto &innerCd : m_impl->innerClasses)
@@ -4638,7 +4630,7 @@ FileDef *ClassDefImpl::getFileDef() const
46384630
return m_impl->fileDef;
46394631
}
46404632

4641-
QDict<ClassDef> *ClassDefImpl::getTemplateInstances() const
4633+
const TemplateInstanceList &ClassDefImpl::getTemplateInstances() const
46424634
{
46434635
return m_impl->templateInstances;
46444636
}

src/classdef.h

+12-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ struct BaseClassDef
8686

8787
using BaseClassList = std::vector<BaseClassDef>;
8888

89+
/** Class that contains information about a template instance relation */
90+
struct TemplateInstanceDef
91+
{
92+
TemplateInstanceDef(const QCString &ts,const ClassDef *cd) : templSpec(ts), classDef(cd) {}
93+
QCString templSpec;
94+
const ClassDef *classDef;
95+
};
96+
97+
using TemplateInstanceList = std::vector<TemplateInstanceDef>;
98+
99+
89100
/** A abstract class representing of a compound symbol.
90101
*
91102
* A compound can be a class, struct, union, interface, service, singleton,
@@ -233,7 +244,7 @@ class ClassDef : public Definition
233244
/** Returns a sorted dictionary with all template instances found for
234245
* this template class. Returns 0 if not a template or no instances.
235246
*/
236-
virtual QDict<ClassDef> *getTemplateInstances() const = 0;
247+
virtual const TemplateInstanceList &getTemplateInstances() const = 0;
237248

238249
/** Returns the template master of which this class is an instance.
239250
* Returns 0 if not applicable.

src/dotclassgraph.cpp

+5-17
Original file line numberDiff line numberDiff line change
@@ -300,30 +300,18 @@ void DotClassGraph::buildGraph(const ClassDef *cd,DotNode *n,bool base,int dista
300300
const ClassDef *templMaster=cd->templateMaster();
301301
if (templMaster)
302302
{
303-
QDictIterator<ClassDef> cli(*templMaster->getTemplateInstances());
304-
const ClassDef *templInstance;
305-
for (;(templInstance=cli.current());++cli)
303+
for (const auto &ti : templMaster->getTemplateInstances())
304+
if (ti.classDef==cd)
306305
{
307-
if (templInstance==cd)
308-
{
309-
addClass(templMaster,n,EdgeInfo::Orange,cli.currentKey(),0,
310-
0,TRUE,distance);
311-
}
306+
addClass(templMaster,n,EdgeInfo::Orange,ti.templSpec,0,0,TRUE,distance);
312307
}
313308
}
314309
}
315310
else // template relations for super classes
316311
{
317-
const QDict<ClassDef> *templInstances = cd->getTemplateInstances();
318-
if (templInstances)
312+
for (const auto &ti : cd->getTemplateInstances())
319313
{
320-
QDictIterator<ClassDef> cli(*templInstances);
321-
const ClassDef *templInstance;
322-
for (;(templInstance=cli.current());++cli)
323-
{
324-
addClass(templInstance,n,EdgeInfo::Orange,cli.currentKey(),0,
325-
0,FALSE,distance);
326-
}
314+
addClass(ti.classDef,n,EdgeInfo::Orange,ti.templSpec,0,0,FALSE,distance);
327315
}
328316
}
329317
}

src/doxygen.cpp

+8-18
Original file line numberDiff line numberDiff line change
@@ -4840,19 +4840,16 @@ static void computeTemplateClassRelations()
48404840
bName=stripTemplateSpecifiersFromScope(bName);
48414841
ClassDefMutable *cd=getClassMutable(bName);
48424842
// strip any anonymous scopes first
4843-
QDict<ClassDef> *templInstances = 0;
4844-
if (cd && (templInstances=cd->getTemplateInstances()))
4843+
if (cd && !cd->getTemplateInstances().empty())
48454844
{
48464845
Debug::print(Debug::Classes,0," Template class %s : \n",qPrint(cd->name()));
4847-
QDictIterator<ClassDef> tdi(*templInstances);
4848-
ClassDef *itcd;
4849-
for (tdi.toFirst();(itcd=tdi.current());++tdi) // for each template instance
4846+
for (const auto &ti : cd->getTemplateInstances()) // for each template instance
48504847
{
4851-
ClassDefMutable *tcd=toClassDefMutable(itcd);
4848+
ClassDefMutable *tcd=toClassDefMutable(ti.classDef);
48524849
if (tcd)
48534850
{
48544851
Debug::print(Debug::Classes,0," Template instance %s : \n",qPrint(tcd->name()));
4855-
QCString templSpec = tdi.currentKey();
4852+
QCString templSpec = ti.templSpec;
48564853
std::unique_ptr<ArgumentList> templArgs = stringToArgumentList(tcd->getLanguage(),templSpec);
48574854
for (const BaseInfo &bi : root->extends)
48584855
{
@@ -7631,19 +7628,12 @@ static void createTemplateInstanceMembers()
76317628
for (const auto &cd : *Doxygen::classLinkedMap)
76327629
{
76337630
// that is a template
7634-
QDict<ClassDef> *templInstances = cd->getTemplateInstances();
7635-
if (templInstances)
7631+
for (const auto &ti : cd->getTemplateInstances())
76367632
{
7637-
QDictIterator<ClassDef> qdi(*templInstances);
7638-
ClassDef *tcd=0;
7639-
// for each instance of the template
7640-
for (qdi.toFirst();(tcd=qdi.current());++qdi)
7633+
ClassDefMutable *tcdm = toClassDefMutable(ti.classDef);
7634+
if (tcdm)
76417635
{
7642-
ClassDefMutable *tcdm = toClassDefMutable(tcd);
7643-
if (tcdm)
7644-
{
7645-
tcdm->addMembersToTemplateInstance(cd.get(),cd->templateArguments(),qdi.currentKey());
7646-
}
7636+
tcdm->addMembersToTemplateInstance(cd.get(),cd->templateArguments(),ti.templSpec);
76477637
}
76487638
}
76497639
}

0 commit comments

Comments
 (0)