summaryrefslogtreecommitdiffstats
path: root/src/definition.cpp
diff options
context:
space:
mode:
authorDimitri van Heesch <dimitri@stack.nl>2006-08-09 08:29:54 (GMT)
committerDimitri van Heesch <dimitri@stack.nl>2006-08-09 08:29:54 (GMT)
commitcdd729544999bf6ff5ce3efb5a64957058f040f3 (patch)
treea09074ed1c9a5c1efb292f69db4f9bbb3a97cb19 /src/definition.cpp
parent243272688a4a3bc7921b7d05dda927f4adf3036c (diff)
downloadDoxygen-cdd729544999bf6ff5ce3efb5a64957058f040f3.zip
Doxygen-cdd729544999bf6ff5ce3efb5a64957058f040f3.tar.gz
Doxygen-cdd729544999bf6ff5ce3efb5a64957058f040f3.tar.bz2
Release-1.4.7-20060809
Diffstat (limited to 'src/definition.cpp')
-rw-r--r--src/definition.cpp63
1 files changed, 52 insertions, 11 deletions
diff --git a/src/definition.cpp b/src/definition.cpp
index 61c2590..fb2c993 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -46,14 +46,41 @@ static void addToMap(const char *name,Definition *d)
if (index!=-1) symbolName=symbolName.mid(index+2);
if (!symbolName.isEmpty())
{
- DefinitionList *dl=Doxygen::symbolMap->find(symbolName);
- if (dl==0)
+ //printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
+ DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
+ //printf(" addToMap(%p): looking for symbol %s: %p\n",d,symbolName.data(),di);
+ if (di==0) // new Symbol
{
- dl = new DefinitionList;
- Doxygen::symbolMap->append(symbolName,dl);
+ //printf(" new symbol!\n");
+ Doxygen::symbolMap->insert(symbolName,d);
}
- //printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
- dl->append(d);
+ else // existing symbol
+ {
+ //printf(" existing symbol: ");
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList) // already multiple symbols
+ {
+ //printf("adding to exiting list\n");
+ DefinitionList *dl = (DefinitionList*)di;
+ dl->append(d);
+ }
+ else // going from one to two symbols
+ {
+ Doxygen::symbolMap->take(symbolName);
+ DefinitionList *dl = new DefinitionList;
+ //printf("replacing symbol by list %p with elements %p and %p\n",dl,di,d);
+ dl->append((Definition*)di);
+ dl->append(d);
+ Doxygen::symbolMap->insert(symbolName,dl);
+ }
+ }
+
+ // auto resize if needed
+ static int sizeIndex=9;
+ if (Doxygen::symbolMap->size()>SDict_primes[sizeIndex])
+ {
+ Doxygen::symbolMap->resize(SDict_primes[++sizeIndex]);
+ }
+
d->setSymbolName(symbolName);
}
}
@@ -66,12 +93,26 @@ static void removeFromMap(Definition *d)
if (!symbolName.isEmpty())
{
//printf("******* removing symbol `%s' (%p)\n",symbolName.data(),d);
- DefinitionList *dl=Doxygen::symbolMap->find(symbolName);
- if (dl)
+ DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
+ if (di)
{
- ASSERT(dl!=0);
- bool b = dl->removeRef(d);
- ASSERT(b==TRUE);
+ ASSERT(di!=0);
+ if (di!=d) // symbolName not unique
+ {
+ //printf(" removing from list: %p!\n",di);
+ DefinitionList *dl = (DefinitionList*)di;
+ bool b = dl->removeRef(d);
+ ASSERT(b==TRUE);
+ if (dl->isEmpty())
+ {
+ Doxygen::symbolMap->take(symbolName);
+ }
+ }
+ else // symbolName unique
+ {
+ //printf(" removing symbol %p\n",di);
+ Doxygen::symbolMap->take(symbolName);
+ }
}
}
}