Skip to content

Commit 1c889cc

Browse files
committed
Refactoring: modernize Doxygen::symbolMap
1 parent d2f42d4 commit 1c889cc

File tree

8 files changed

+163
-304
lines changed

8 files changed

+163
-304
lines changed

addon/doxyapp/doxyapp.cpp

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -148,25 +148,9 @@ static void listSymbol(Definition *d)
148148

149149
static void listSymbols()
150150
{
151-
QDictIterator<DefinitionIntf> sli(*Doxygen::symbolMap);
152-
DefinitionIntf *di;
153-
for (sli.toFirst();(di=sli.current());++sli)
151+
for (const auto &kv : Doxygen::symbolMap)
154152
{
155-
if (di->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
156-
// with same name
157-
{
158-
DefinitionListIterator dli(*(DefinitionList*)di);
159-
Definition *d;
160-
// for each symbol
161-
for (dli.toFirst();(d=dli.current());++dli)
162-
{
163-
listSymbol(d);
164-
}
165-
}
166-
else // single symbol
167-
{
168-
listSymbol((Definition*)di);
169-
}
153+
listSymbol(kv.second);
170154
}
171155
}
172156

@@ -223,25 +207,14 @@ static void lookupSymbols(const QCString &sym)
223207
{
224208
if (!sym.isEmpty())
225209
{
226-
DefinitionIntf *di = Doxygen::symbolMap->find(sym);
227-
if (di)
210+
auto range = Doxygen::symbolMap.find(sym);
211+
bool found=false;
212+
for (auto it=range.first; it!=range.second; ++it)
228213
{
229-
if (di->definitionType()==DefinitionIntf::TypeSymbolList)
230-
{
231-
DefinitionListIterator dli(*(DefinitionList*)di);
232-
Definition *d;
233-
// for each symbol with the given name
234-
for (dli.toFirst();(d=dli.current());++dli)
235-
{
236-
lookupSymbol(d);
237-
}
238-
}
239-
else
240-
{
241-
lookupSymbol((Definition*)di);
242-
}
214+
lookupSymbol(it->second);
215+
found=true;
243216
}
244-
else
217+
if (!found)
245218
{
246219
printf("Unknown symbol\n");
247220
}

src/context.cpp

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10309,25 +10309,9 @@ void generateOutputViaTemplate()
1030910309
}
1031010310

1031110311
// clear all cached data in Definition objects.
10312-
QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
10313-
const DefinitionIntf *intf;
10314-
for (;(intf=di.current());++di)
10312+
for (const auto &kv : Doxygen::symbolMap)
1031510313
{
10316-
if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
10317-
{
10318-
DefinitionListIterator dli(*dynamic_cast<const DefinitionList*>(intf));
10319-
const Definition *d;
10320-
// for each symbol
10321-
for (dli.toFirst();(d=dli.current());++dli)
10322-
{
10323-
d->setCookie(0);
10324-
}
10325-
}
10326-
else // single symbol
10327-
{
10328-
const Definition *d = dynamic_cast<const Definition *>(intf);
10329-
d->setCookie(0);
10330-
}
10314+
kv.second->setCookie(0);
1033110315
}
1033210316

1033310317
e.destroyContext(ctx);

src/definition.cpp

Lines changed: 2 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -224,73 +224,15 @@ static void addToMap(const char *name,Definition *d)
224224
if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
225225
if (!symbolName.isEmpty())
226226
{
227-
//printf("******* adding symbol '%s' (%p)\n",symbolName.data(),d);
228-
DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
229-
//printf(" addToMap(%p): looking for symbol %s: %p\n",d,symbolName.data(),di);
230-
if (di==0) // new Symbol
231-
{
232-
//printf(" new symbol!\n");
233-
Doxygen::symbolMap->insert(symbolName,d);
234-
}
235-
else // existing symbol
236-
{
237-
//printf(" existing symbol: ");
238-
if (di->definitionType()==DefinitionIntf::TypeSymbolList) // already multiple symbols
239-
{
240-
//printf("adding to exiting list\n");
241-
DefinitionList *dl = (DefinitionList*)di;
242-
dl->append(d);
243-
}
244-
else // going from one to two symbols
245-
{
246-
Doxygen::symbolMap->take(symbolName);
247-
DefinitionList *dl = new DefinitionList;
248-
//printf("replacing symbol by list %p with elements %p and %p\n",dl,di,d);
249-
dl->append((Definition*)di);
250-
dl->append(d);
251-
Doxygen::symbolMap->insert(symbolName,dl);
252-
}
253-
}
254-
255-
// auto resize if needed
256-
static int sizeIndex=9;
257-
if (Doxygen::symbolMap->size()>SDict_primes[sizeIndex])
258-
{
259-
Doxygen::symbolMap->resize(SDict_primes[++sizeIndex]);
260-
}
227+
Doxygen::symbolMap.add(symbolName,d);
261228

262229
d->_setSymbolName(symbolName);
263230
}
264231
}
265232

266233
static void removeFromMap(Definition *d)
267234
{
268-
QCString symbolName = d->_symbolName();
269-
if (!symbolName.isEmpty())
270-
{
271-
//printf("******* removing symbol '%s' (%p)\n",symbolName.data(),d);
272-
DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
273-
if (di)
274-
{
275-
if (di!=d) // symbolName not unique
276-
{
277-
//printf(" removing from list: %p!\n",di);
278-
DefinitionList *dl = (DefinitionList*)di;
279-
bool b = dl->removeRef(d);
280-
ASSERT(b==TRUE);
281-
if (dl->isEmpty())
282-
{
283-
Doxygen::symbolMap->take(symbolName);
284-
delete dl;
285-
}
286-
}
287-
else // symbolName unique
288-
{
289-
//printf(" removing symbol %p\n",di);
290-
Doxygen::symbolMap->take(symbolName);
291-
}
292-
}
293-
}
235+
Doxygen::symbolMap.remove(d->_symbolName(),d);
294236
}
295237

296238
DefinitionImpl::DefinitionImpl(const char *df,int dl,int dc,

src/doxygen.cpp

Lines changed: 22 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ bool Doxygen::insideMainPage = FALSE; // are we generating docs for
142142
NamespaceDef *Doxygen::globalScope = 0;
143143
bool Doxygen::parseSourcesNeeded = FALSE;
144144
SearchIndexIntf *Doxygen::searchIndex=0;
145-
QDict<DefinitionIntf> *Doxygen::symbolMap = 0;
145+
SymbolMap<Definition> Doxygen::symbolMap;
146146
QDict<Definition> *Doxygen::clangUsrMap = 0;
147147
bool Doxygen::outputToWizard=FALSE;
148148
QDict<int> * Doxygen::htmlDirMap = 0;
@@ -2429,7 +2429,8 @@ static bool isVarWithConstructor(const Entry *root)
24292429
static QRegExp initChars("[0-9\"'&*!^]+");
24302430
static QRegExp idChars("[a-z_A-Z][a-z_A-Z0-9]*");
24312431
bool result=FALSE;
2432-
bool typeIsClass;
2432+
bool typeIsClass = false;
2433+
bool typePtrType = false;
24332434
QCString type;
24342435
Definition *ctx = 0;
24352436
FileDef *fd = 0;
@@ -2462,11 +2463,15 @@ static bool isVarWithConstructor(const Entry *root)
24622463
findAndRemoveWord(type,"const");
24632464
findAndRemoveWord(type,"static");
24642465
findAndRemoveWord(type,"volatile");
2466+
typePtrType = type.find('*')!=-1 || type.find('&')!=-1;
24652467
//if (type.left(6)=="const ") type=type.right(type.length()-6);
2466-
typeIsClass=getResolvedClass(ctx,fd,type)!=0;
2467-
if (!typeIsClass && (ti=type.find('<'))!=-1)
2468+
if (!typePtrType)
24682469
{
2469-
typeIsClass=getResolvedClass(ctx,fd,type.left(ti))!=0;
2470+
typeIsClass = getResolvedClass(ctx,fd,type)!=0;
2471+
if (!typeIsClass && (ti=type.find('<'))!=-1)
2472+
{
2473+
typeIsClass=getResolvedClass(ctx,fd,type.left(ti))!=0;
2474+
}
24702475
}
24712476
if (typeIsClass) // now we still have to check if the arguments are
24722477
// types or values. Since we do not have complete type info
@@ -2492,6 +2497,14 @@ static bool isVarWithConstructor(const Entry *root)
24922497
}
24932498
goto done;
24942499
}
2500+
if (!a.type.isEmpty() &&
2501+
(a.type.at(a.type.length()-1)=='*' ||
2502+
a.type.at(a.type.length()-1)=='&'))
2503+
// type ends with * or & => pointer or reference
2504+
{
2505+
result=FALSE;
2506+
goto done;
2507+
}
24952508
if (a.type.isEmpty() || getResolvedClass(ctx,fd,a.type)!=0)
24962509
{
24972510
result=FALSE; // arg type is a known type
@@ -2503,13 +2516,6 @@ static bool isVarWithConstructor(const Entry *root)
25032516
result=FALSE; // argument is a typedef
25042517
goto done;
25052518
}
2506-
if (a.type.at(a.type.length()-1)=='*' ||
2507-
a.type.at(a.type.length()-1)=='&')
2508-
// type ends with * or & => pointer or reference
2509-
{
2510-
result=FALSE;
2511-
goto done;
2512-
}
25132519
if (a.type.find(initChars)==0)
25142520
{
25152521
result=TRUE; // argument type starts with typical initializer char
@@ -7812,25 +7818,9 @@ static void sortMemberLists()
78127818

78137819
void computeTooltipTexts()
78147820
{
7815-
QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
7816-
DefinitionIntf *intf;
7817-
for (;(intf=di.current());++di)
7821+
for (const auto &kv : Doxygen::symbolMap)
78187822
{
7819-
if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
7820-
{
7821-
DefinitionListIterator dli(*(DefinitionList*)intf);
7822-
Definition *d;
7823-
// for each symbol
7824-
for (dli.toFirst();(d=dli.current());++dli)
7825-
{
7826-
d->computeTooltip();
7827-
}
7828-
}
7829-
else // single symbol
7830-
{
7831-
Definition *d = (Definition *)intf;
7832-
if (d!=Doxygen::globalScope) d->computeTooltip();
7833-
}
7823+
kv.second->computeTooltip();
78347824
}
78357825
}
78367826

@@ -9796,25 +9786,9 @@ static void dumpSymbolMap()
97969786
if (f.open(IO_WriteOnly))
97979787
{
97989788
FTextStream t(&f);
9799-
QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
9800-
DefinitionIntf *intf;
9801-
for (;(intf=di.current());++di)
9789+
for (const auto &kv : Doxygen::symbolMap)
98029790
{
9803-
if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
9804-
{
9805-
DefinitionListIterator dli(*(DefinitionList*)intf);
9806-
Definition *d;
9807-
// for each symbol
9808-
for (dli.toFirst();(d=dli.current());++dli)
9809-
{
9810-
dumpSymbol(t,d);
9811-
}
9812-
}
9813-
else // single symbol
9814-
{
9815-
Definition *d = (Definition *)intf;
9816-
if (d!=Doxygen::globalScope) dumpSymbol(t,d);
9817-
}
9791+
dumpSymbol(t,kv.second);
98189792
}
98199793
}
98209794
}
@@ -9939,7 +9913,6 @@ void initDoxygen()
99399913
initNamespaceMemberIndices();
99409914
initFileMemberIndices();
99419915

9942-
Doxygen::symbolMap = new QDict<DefinitionIntf>(50177);
99439916
#ifdef USE_LIBCLANG
99449917
Doxygen::clangUsrMap = new QDict<Definition>(50177);
99459918
#endif
@@ -10012,26 +9985,6 @@ void cleanUpDoxygen()
100129985
delete g_outputList;
100139986
Mappers::freeMappers();
100149987

10015-
if (Doxygen::symbolMap)
10016-
{
10017-
// iterate through Doxygen::symbolMap and delete all
10018-
// DefinitionList objects, since they have no owner
10019-
QDictIterator<DefinitionIntf> dli(*Doxygen::symbolMap);
10020-
DefinitionIntf *di;
10021-
for (dli.toFirst();(di=dli.current());)
10022-
{
10023-
if (di->definitionType()==DefinitionIntf::TypeSymbolList)
10024-
{
10025-
DefinitionIntf *tmp = Doxygen::symbolMap->take(dli.currentKey());
10026-
delete (DefinitionList *)tmp;
10027-
}
10028-
else
10029-
{
10030-
++dli;
10031-
}
10032-
}
10033-
}
10034-
100359988
delete Doxygen::memberNameLinkedMap;
100369989
delete Doxygen::functionNameLinkedMap;
100379990
delete Doxygen::groupSDict;
@@ -10041,11 +9994,6 @@ void cleanUpDoxygen()
100419994
delete Doxygen::directories;
100429995

100439996
DotManager::deleteInstance();
10044-
10045-
//delete Doxygen::symbolMap; <- we cannot do this unless all static lists
10046-
// (such as Doxygen::namespaceSDict)
10047-
// with objects based on Definition are made
10048-
// dynamic first
100499997
}
100509998

100519999
static int computeIdealCacheParam(uint v)
@@ -11811,7 +11759,6 @@ void generateOutput()
1181111759
thisDir.remove(Doxygen::filterDBFileName);
1181211760
Config::deinit();
1181311761
QTextCodec::deleteAllCodecs();
11814-
delete Doxygen::symbolMap;
1181511762
delete Doxygen::clangUsrMap;
1181611763
g_successfulRun=TRUE;
1181711764
}

src/doxygen.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "memberlist.h"
3030
#include "define.h"
3131
#include "cache.h"
32+
#include "symbolmap.h"
3233

3334
#define THREAD_LOCAL thread_local
3435
#define AtomicInt std::atomic_int
@@ -66,8 +67,6 @@ struct MemberGroupInfo;
6667

6768
typedef QList<QCString> StringList;
6869
typedef QListIterator<QCString> StringListIterator;
69-
//typedef QDict<FileDef> FileDict;
70-
//typedef QDict<GroupDef> GroupDict;
7170

7271
class StringDict : public QDict<QCString>
7372
{
@@ -123,7 +122,7 @@ class Doxygen
123122
static QCString htmlFileExtension;
124123
static bool parseSourcesNeeded;
125124
static SearchIndexIntf *searchIndex;
126-
static QDict<DefinitionIntf> *symbolMap;
125+
static SymbolMap<Definition> symbolMap;
127126
static QDict<Definition> *clangUsrMap;
128127
static bool outputToWizard;
129128
static QDict<int> *htmlDirMap;

src/pycode.l

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1490,22 +1490,10 @@ static void findMemberLink(yyscan_t yyscanner,
14901490
// );
14911491
if (yyextra->currentDefinition)
14921492
{
1493-
DefinitionIntf *di = Doxygen::symbolMap->find(symName);
1494-
if (di)
1493+
auto range = Doxygen::symbolMap.find(symName);
1494+
for (auto it = range.first; it!=range.second; ++it)
14951495
{
1496-
if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multiple symbols
1497-
{
1498-
DefinitionListIterator dli(*(DefinitionList*)di);
1499-
Definition *sym;
1500-
for (dli.toFirst();(sym=dli.current());++dli)
1501-
{
1502-
if (findMemberLink(yyscanner,ol,sym,symName)) return;
1503-
}
1504-
}
1505-
else // single symbol
1506-
{
1507-
if (findMemberLink(yyscanner,ol,(Definition*)di,symName)) return;
1508-
}
1496+
findMemberLink(yyscanner,ol,it->second,symName);
15091497
}
15101498
}
15111499
//printf("sym %s not found\n",&yytext[5]);

0 commit comments

Comments
 (0)