Commit ca720513 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.4.7-20061004

parent b1dbef98
DOXYGEN Version 1.4.7-20060910 DOXYGEN Version 1.4.7-20061004
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (10 September 2006) Dimitri van Heesch (04 October 2006)
...@@ -84,7 +84,7 @@ pdf: docs ...@@ -84,7 +84,7 @@ pdf: docs
DISTFILES = Doxyfile libpng libmd5 addon tmake doc wintools examples bin lib objects \ DISTFILES = Doxyfile libpng libmd5 addon tmake doc wintools examples bin lib objects \
qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \ qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \
Makefile.win_make.in INSTALL make.bat LANGUAGE.HOWTO LICENSE PLATFORMS \ Makefile.win_make.in INSTALL make.bat LANGUAGE.HOWTO LICENSE PLATFORMS \
VERSION packages VERSION packages winbuild
archive: clean archive: clean
tar zcvf dx`date +%y%m%d`.tgz $(DISTFILES) tar zcvf dx`date +%y%m%d`.tgz $(DISTFILES)
......
DOXYGEN Version 1.4.7_20060910 DOXYGEN Version 1.4.7_20061004
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (10 September 2006) Dimitri van Heesch (dimitri@stack.nl) (04 October 2006)
...@@ -20,7 +20,7 @@ doxygen_version_minor=4 ...@@ -20,7 +20,7 @@ doxygen_version_minor=4
doxygen_version_revision=7 doxygen_version_revision=7
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package. #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20060910 doxygen_version_mmn=20061004
bin_dirs=`echo $PATH | sed -e "s/:/ /g"` bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......
...@@ -37,8 +37,9 @@ ...@@ -37,8 +37,9 @@
\section linkclass Links to classes. \section linkclass Links to classes.
All words in the documentation that correspond to a documented class All words in the documentation that correspond to a documented class and
will automatically be replaced by a link to the page containing the contain at least one upper case character will automatically be replaced by
a link to the page containing the
documentation of the class. If you want to prevent that a word documentation of the class. If you want to prevent that a word
that corresponds to a documented class is replaced by a link you that corresponds to a documented class is replaced by a link you
should put a \% in front of the word. should put a \% in front of the word.
...@@ -59,17 +60,23 @@ ...@@ -59,17 +60,23 @@
<li><tt>\<functionName\>"()"</tt> <li><tt>\<functionName\>"()"</tt>
<li><tt>"::"\<functionName\></tt> <li><tt>"::"\<functionName\></tt>
<li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"("\<argument-list\>")"</tt> <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"("\<argument-list\>")"</tt>
<li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"("\<argument-list\>")"\<modifiers\></tt>
<li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"()"</tt> <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"()"</tt>
<li><tt>(\<className\>"::")<sup>n</sup>\<functionName\></tt> <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\></tt>
</ol> </ol>
where n\>0. where n\>0.
\par Note 1: \par Note 1:
The patterns above should not contain spaces, tabs or newlines. Function arguments should be specified with correct types, i.e.
\par Note 2: 'fun(const std::string&,bool)' or '()' to match any prototype.
\par Note 2:
Member function modifiers (like 'const' and 'volatile')
are required to identify the target, i.e. 'func(int) const' and 'fun(int)'
target different member functions.
\par Note 3:
For JavaDoc compatibility a \# may be used instead of a :: in For JavaDoc compatibility a \# may be used instead of a :: in
the patterns above. the patterns above.
\par Note 3: \par Note 4:
In the documentation of a class containing a member foo, In the documentation of a class containing a member foo,
a reference to a global variable is made using ::foo, whereas \#foo a reference to a global variable is made using ::foo, whereas \#foo
will link to the member. will link to the member.
......
...@@ -102,7 +102,7 @@ when the translator was updated. ...@@ -102,7 +102,7 @@ when the translator was updated.
<td>Danish</td> <td>Danish</td>
<td>Erik S&oslash;e S&oslash;rensen</td> <td>Erik S&oslash;e S&oslash;rensen</td>
<td>eriksoe+doxygen at daimi dot au dot dk</td> <td>eriksoe+doxygen at daimi dot au dot dk</td>
<td>1.3.9</td> <td>up-to-date</td>
</tr> </tr>
<tr bgcolor="#ffffff"> <tr bgcolor="#ffffff">
<td>Dutch</td> <td>Dutch</td>
...@@ -162,7 +162,7 @@ when the translator was updated. ...@@ -162,7 +162,7 @@ when the translator was updated.
<td>Japanese</td> <td>Japanese</td>
<td>Ryunosuke Satoh<br>Kenji Nagamatsu<br>Iwasa Kazmi</td> <td>Ryunosuke Satoh<br>Kenji Nagamatsu<br>Iwasa Kazmi</td>
<td>sun594 at hotmail dot com<br>naga at joyful dot club dot ne dot jp<br>iwasa at cosmo-system dot jp</td> <td>sun594 at hotmail dot com<br>naga at joyful dot club dot ne dot jp<br>iwasa at cosmo-system dot jp</td>
<td>1.4.6</td> <td>up-to-date</td>
</tr> </tr>
<tr bgcolor="#ffffff"> <tr bgcolor="#ffffff">
<td>JapaneseEn</td> <td>JapaneseEn</td>
...@@ -294,7 +294,7 @@ when the translator was updated. ...@@ -294,7 +294,7 @@ when the translator was updated.
\hline \hline
Czech & Petr P\v{r}ikryl & {\tt\tiny prikrylp@skil.cz} & up-to-date \\ Czech & Petr P\v{r}ikryl & {\tt\tiny prikrylp@skil.cz} & up-to-date \\
\hline \hline
Danish & Erik S\o{}e S\o{}rensen & {\tt\tiny eriksoe+doxygen@daimi.au.dk} & 1.3.9 \\ Danish & Erik S\o{}e S\o{}rensen & {\tt\tiny eriksoe+doxygen@daimi.au.dk} & up-to-date \\
\hline \hline
Dutch & Dimitri van Heesch & {\tt\tiny dimitri@stack.nl} & up-to-date \\ Dutch & Dimitri van Heesch & {\tt\tiny dimitri@stack.nl} & up-to-date \\
\hline \hline
...@@ -316,7 +316,7 @@ when the translator was updated. ...@@ -316,7 +316,7 @@ when the translator was updated.
Italian & Alessandro Falappa & {\tt\tiny alessandro@falappa.net} & up-to-date \\ Italian & Alessandro Falappa & {\tt\tiny alessandro@falappa.net} & up-to-date \\
~ & Ahmed Aldo Faisal & {\tt\tiny aaf23@cam.ac.uk} & ~ \\ ~ & Ahmed Aldo Faisal & {\tt\tiny aaf23@cam.ac.uk} & ~ \\
\hline \hline
Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & 1.4.6 \\ Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & up-to-date \\
~ & Kenji Nagamatsu & {\tt\tiny naga@joyful.club.ne.jp} & ~ \\ ~ & Kenji Nagamatsu & {\tt\tiny naga@joyful.club.ne.jp} & ~ \\
~ & Iwasa Kazmi & {\tt\tiny iwasa@cosmo-system.jp} & ~ \\ ~ & Iwasa Kazmi & {\tt\tiny iwasa@cosmo-system.jp} & ~ \\
\hline \hline
......
...@@ -8,7 +8,7 @@ German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean ...@@ -8,7 +8,7 @@ German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean
(+En), Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian, (+En), Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian,
Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
Of them, 10 translators are up-to-date, 23 translators are based on Of them, 12 translators are up-to-date, 21 translators are based on
some adapter class, and 2 are English based. some adapter class, and 2 are English based.
---------------------------------------------------------------------- ----------------------------------------------------------------------
...@@ -22,10 +22,12 @@ still may be some details listed even for them: ...@@ -22,10 +22,12 @@ still may be some details listed even for them:
TranslatorChinese TranslatorChinese
TranslatorCroatian TranslatorCroatian
TranslatorCzech TranslatorCzech
TranslatorDanish -- Change the base class to Translator.
TranslatorDutch -- Remove the obsolete methods (never used). TranslatorDutch -- Remove the obsolete methods (never used).
TranslatorEnglish -- Remove the obsolete methods (never used). TranslatorEnglish -- Remove the obsolete methods (never used).
TranslatorGerman TranslatorGerman
TranslatorItalian -- Change the base class to Translator. TranslatorItalian -- Change the base class to Translator.
TranslatorJapanese -- Remove the obsolete methods (never used).
TranslatorRussian TranslatorRussian
---------------------------------------------------------------------- ----------------------------------------------------------------------
...@@ -42,7 +44,6 @@ must be implemented to become up-to-date: ...@@ -42,7 +44,6 @@ must be implemented to become up-to-date:
TranslatorNorwegian 1.4.6 1 method to implement TranslatorNorwegian 1.4.6 1 method to implement
TranslatorLithuanian 1.4.6 2 methods to implement TranslatorLithuanian 1.4.6 2 methods to implement
TranslatorKorean 1.4.6 2 methods to implement TranslatorKorean 1.4.6 2 methods to implement
TranslatorJapanese 1.4.6 1 method to implement
TranslatorIndonesian 1.4.6 1 method to implement TranslatorIndonesian 1.4.6 1 method to implement
TranslatorHungarian 1.4.6 2 methods to implement TranslatorHungarian 1.4.6 2 methods to implement
TranslatorFrench 1.4.6 1 method to implement TranslatorFrench 1.4.6 1 method to implement
...@@ -52,7 +53,6 @@ must be implemented to become up-to-date: ...@@ -52,7 +53,6 @@ must be implemented to become up-to-date:
TranslatorUkrainian 1.4.1 2 methods to implement TranslatorUkrainian 1.4.1 2 methods to implement
TranslatorSerbian 1.4.1 2 methods to implement TranslatorSerbian 1.4.1 2 methods to implement
TranslatorRomanian 1.4.1 2 methods to implement TranslatorRomanian 1.4.1 2 methods to implement
TranslatorDanish 1.3.9 8 methods to implement
TranslatorPortuguese 1.3.3 13 methods to implement TranslatorPortuguese 1.3.3 13 methods to implement
TranslatorSlovak 1.2.18 22 methods to implement TranslatorSlovak 1.2.18 22 methods to implement
TranslatorGreek 1.2.11 27 methods to implement TranslatorGreek 1.2.11 27 methods to implement
...@@ -145,21 +145,10 @@ TranslatorChinesetraditional (TranslatorAdapter_1_4_6) 1 method to implement ...@@ -145,21 +145,10 @@ TranslatorChinesetraditional (TranslatorAdapter_1_4_6) 1 method to implement
virtual QCString trNoDescriptionAvailable() virtual QCString trNoDescriptionAvailable()
TranslatorDanish (TranslatorAdapter_1_3_9) 8 methods to implement TranslatorDanish (TranslatorAdapter_1_3_9)
---------------- ----------------
Implements 186 of the required methods. Implements 194 of the required methods.
Missing methods (should be implemented):
virtual QCString trOverloadText()
virtual QCString trDirIndex()
virtual QCString trDirDocumentation()
virtual QCString trDirectories()
virtual QCString trDirDescription()
virtual QCString trCallerGraph()
virtual QCString trDirReference(const char * dirName)
virtual QCString trDir(bool first_capital, bool singular)
Obsolete methods (should be removed, never used): Obsolete methods (should be removed, never used):
...@@ -435,14 +424,10 @@ TranslatorItalian (TranslatorAdapter_1_4_6) ...@@ -435,14 +424,10 @@ TranslatorItalian (TranslatorAdapter_1_4_6)
Implements 194 of the required methods. Implements 194 of the required methods.
TranslatorJapanese (TranslatorAdapter_1_4_6) 1 method to implement TranslatorJapanese (Translator)
------------------ ------------------
Implements 193 of the required methods. Implements 194 of the required methods.
Missing methods (should be implemented):
virtual QCString trCallerGraph()
Obsolete methods (should be removed, never used): Obsolete methods (should be removed, never used):
......
...@@ -262,6 +262,19 @@ ...@@ -262,6 +262,19 @@
#error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com" #error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com"
#endif #endif
// detect Microsoft compiler version
#ifdef _CC_MSVC_
#if _MSC_VER >= 1400
#define _CC_V2005
#elif _MSC_VER >= 1310
#define _CC_V2003
#elif _MSC_VER > 1300
#define _CC_V2002
#else
#define _CC_V1998
#endif
#endif
#ifndef Q_PACKED #ifndef Q_PACKED
#define Q_PACKED #define Q_PACKED
#endif #endif
......
...@@ -168,6 +168,8 @@ class ClassDefImpl ...@@ -168,6 +168,8 @@ class ClassDefImpl
* groups? * groups?
*/ */
bool subGrouping; bool subGrouping;
bool usedOnly;
}; };
void ClassDefImpl::init(const char *defFileName, const char *name, void ClassDefImpl::init(const char *defFileName, const char *name,
...@@ -206,6 +208,7 @@ void ClassDefImpl::init(const char *defFileName, const char *name, ...@@ -206,6 +208,7 @@ void ClassDefImpl::init(const char *defFileName, const char *name,
isTemplArg = FALSE; isTemplArg = FALSE;
membersMerged = FALSE; membersMerged = FALSE;
categoryOf = 0; categoryOf = 0;
usedOnly = FALSE;
QCString ns; QCString ns;
extractNamespaceName(name,className,ns); extractNamespaceName(name,className,ns);
//printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data()); //printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data());
...@@ -258,78 +261,11 @@ ClassDef::ClassDef( ...@@ -258,78 +261,11 @@ ClassDef::ClassDef(
m_impl->isObjC = FALSE; m_impl->isObjC = FALSE;
m_impl->init(defFileName,name(),compoundTypeString(),fName); m_impl->init(defFileName,name(),compoundTypeString(),fName);
#if 0
m_compType=ct;
m_isObjC = FALSE;
QCString compoundName=compoundTypeString();
if (fName)
{
m_fileName=stripExtension(fName);
}
else
{
m_fileName=compoundName+name();
}
m_exampleSDict = 0;
m_inherits = 0;
m_inheritedBy = 0;
m_allMemberNameInfoSDict = 0;
m_incInfo=0;
m_tempArgs=0;
m_prot=Public;
m_nspace=0;
m_fileDef=0;
m_usesImplClassDict=0;
m_usedByImplClassDict=0;
m_usesIntfClassDict=0;
memberGroupSDict = 0;
m_innerClasses = 0;
m_subGrouping=Config_getBool("SUBGROUPING");
m_templateInstances = 0;
m_variableInstances = 0;
m_templateMaster =0;
m_templBaseClassNames = 0;
m_artificial = FALSE;
m_isAbstract = FALSE;
m_isStatic = FALSE;
m_isTemplArg = FALSE;
m_membersMerged = FALSE;
m_categoryOf = 0;
QCString ns;
extractNamespaceName(name(),m_className,ns);
//printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data());
if (((QCString)defFileName).right(5)!=".java" &&
guessSection(defFileName)==Entry::SOURCE_SEC)
{
m_isLocal=TRUE;
}
else
{
m_isLocal=FALSE;
}
#endif
} }
// destroy the class definition // destroy the class definition
ClassDef::~ClassDef() ClassDef::~ClassDef()
{ {
#if 0
delete m_inherits;
delete m_inheritedBy;
delete m_allMemberNameInfoSDict;
delete m_exampleSDict;
delete m_usesImplClassDict;
delete m_usedByImplClassDict;
delete m_usesIntfClassDict;
delete m_incInfo;
delete memberGroupSDict;
delete m_innerClasses;
delete m_templateInstances;
delete m_variableInstances;
delete m_templBaseClassNames;
delete m_tempArgs;
#endif
delete m_impl; delete m_impl;
} }
...@@ -3080,6 +3016,11 @@ MemberDef *ClassDef::getMemberByName(const QCString &name) const ...@@ -3080,6 +3016,11 @@ MemberDef *ClassDef::getMemberByName(const QCString &name) const
return xmd; return xmd;
} }
bool ClassDef::isAccessibleMember(MemberDef *md)
{
return md->getClassDef() && isBaseClass(md->getClassDef(),TRUE);
}
MemberList *ClassDef::createMemberList(MemberList::ListType lt) MemberList *ClassDef::createMemberList(MemberList::ListType lt)
{ {
m_impl->memberLists.setAutoDelete(TRUE); m_impl->memberLists.setAutoDelete(TRUE);
...@@ -3321,3 +3262,13 @@ void ClassDef::setCategoryOf(ClassDef *cd) ...@@ -3321,3 +3262,13 @@ void ClassDef::setCategoryOf(ClassDef *cd)
m_impl->categoryOf = cd; m_impl->categoryOf = cd;
} }
void ClassDef::setUsedOnly(bool b)
{
m_impl->usedOnly = b;
}
bool ClassDef::isUsedOnly() const
{
return m_impl->usedOnly;
}
...@@ -188,6 +188,11 @@ class ClassDef : public Definition ...@@ -188,6 +188,11 @@ class ClassDef : public Definition
*/ */
bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0); bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0);
/*! returns TRUE iff \a md is a member of this class or of the
* the public/protected members of a base class
*/
bool isAccessibleMember(MemberDef *md);
/*! Returns a sorted dictionary with all template instances found for /*! Returns a sorted dictionary with all template instances found for
* this template class. Returns 0 if not a template or no instances. * this template class. Returns 0 if not a template or no instances.
*/ */
...@@ -258,6 +263,8 @@ class ClassDef : public Definition ...@@ -258,6 +263,8 @@ class ClassDef : public Definition
ClassDef *getVariableInstance(const char *templSpec); ClassDef *getVariableInstance(const char *templSpec);
bool isUsedOnly() const;
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
// --- setters ---- // --- setters ----
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
...@@ -290,6 +297,7 @@ class ClassDef : public Definition ...@@ -290,6 +297,7 @@ class ClassDef : public Definition
void addMembersToTemplateInstance(ClassDef *cd,const char *templSpec); void addMembersToTemplateInstance(ClassDef *cd,const char *templSpec);
void makeTemplateArgument(bool b=TRUE); void makeTemplateArgument(bool b=TRUE);
void setCategoryOf(ClassDef *cd); void setCategoryOf(ClassDef *cd);
void setUsedOnly(bool b);
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
// --- actions ---- // --- actions ----
......
...@@ -798,7 +798,7 @@ static bool getLinkInScope(const QCString &c, // scope ...@@ -798,7 +798,7 @@ static bool getLinkInScope(const QCString &c, // scope
FileDef *fd; FileDef *fd;
NamespaceDef *nd; NamespaceDef *nd;
GroupDef *gd; GroupDef *gd;
//printf("Trying `%s'::`%s'\n",c.data(),m.data()); //printf("getLinkInScope: trying `%s'::`%s'\n",c.data(),m.data());
if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) && if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
md->isLinkable()) md->isLinkable())
{ {
...@@ -851,6 +851,7 @@ static bool getLink(const char *className, ...@@ -851,6 +851,7 @@ static bool getLink(const char *className,
CodeOutputInterface &ol, CodeOutputInterface &ol,
const char *text=0) const char *text=0)
{ {
//printf("getLink(%s,%s)\n",className,memberName);
QCString m=removeRedundantWhiteSpace(memberName); QCString m=removeRedundantWhiteSpace(memberName);
QCString c=className; QCString c=className;
if (!getLinkInScope(c,m,memberName,ol,text)) if (!getLinkInScope(c,m,memberName,ol,text))
......
This diff is collapsed.
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include "section.h" #include "section.h"
#include "htags.h" #include "htags.h"
#include "parserintf.h" #include "parserintf.h"
#include "objcache.h"
#include "marshal.h" #include "marshal.h"
#if defined(_MSC_VER) || defined(__BORLANDC__) #if defined(_MSC_VER) || defined(__BORLANDC__)
...@@ -237,14 +236,11 @@ Definition::Definition(const char *df,int dl, ...@@ -237,14 +236,11 @@ Definition::Definition(const char *df,int dl,
const char *name,const char *b, const char *name,const char *b,
const char *d,bool isSymbol) const char *d,bool isSymbol)
{ {
m_storagePos=-1;
m_name = name; m_name = name;
m_impl = new DefinitionImpl; m_impl = new DefinitionImpl;
m_impl->init(df,dl,name,b,d); m_impl->init(df,dl,name,b,d);
m_isSymbol = isSymbol; m_isSymbol = isSymbol;
if (isSymbol) addToMap(name,this); if (isSymbol) addToMap(name,this);
m_cacheHandle=-1;
m_flushPending = FALSE;
} }
Definition::~Definition() Definition::~Definition()
...@@ -258,11 +254,6 @@ Definition::~Definition() ...@@ -258,11 +254,6 @@ Definition::~Definition()
delete m_impl; delete m_impl;
m_impl=0; m_impl=0;
} }
if (m_cacheHandle!=-1)
{
Doxygen::symbolCache->del(m_cacheHandle);
m_cacheHandle=-1;
}
} }
void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList) void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
...@@ -1173,74 +1164,14 @@ void Definition::setLocalName(const QCString name) ...@@ -1173,74 +1164,14 @@ void Definition::setLocalName(const QCString name)
} }
void Definition::makeResident() const void Definition::makeResident() const
{
if (m_cacheHandle==-1) // not yet in cache
{
Definition *victim = 0;
Definition *that = (Definition*)this; // fake method constness
that->m_cacheHandle = Doxygen::symbolCache->add(that,(void **)&victim);
//printf("adding %s to cache, handle=%d\n",m_impl->name.data(),that->m_cacheHandle);
if (victim) // cache was full, victim was the least recently used item and has to go
{
victim->m_cacheHandle=-1; // invalidate cache handle
victim->saveToDisk(); // store the item on disk
}
else // cache not yet full
{
//printf("Adding %s to cache, handle=%d\n",m_impl->name.data(),m_cacheHandle);
}
if (m_storagePos!=-1) // already been written to disk
{
if (isLocked()) // locked in memory
{
assert(m_impl!=0);
that->m_flushPending=FALSE; // no need to flush anymore
}
else // not locked in memory
{
assert(m_impl==0);
loadFromDisk();
}
}
}
else // already cached, make this object the most recently used.
{
assert(m_impl!=0);
//printf("Touching symbol %s\n",m_impl->name.data());
Doxygen::symbolCache->use(m_cacheHandle);
}
}
void Definition::saveToDisk() const
{ {
assert(m_impl!=0);
Definition *that = (Definition *)this;
if (isLocked()) // cannot flush the item as it is locked
{
that->m_flushPending=TRUE; // flush when unlocked
}
else // ready to flush the item to disk
{
//printf("Adding %s to cache, handle=%d by replacing %s\n",
// m_impl->name.data(),m_cacheHandle,victim->m_impl->name.data());
if (m_storagePos!=-1)
// if victim was stored on disk already and is not locked
{
// free the storage space occupied by the old store item
Doxygen::symbolStorage->release(m_storagePos); // free up space for others
}
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
Doxygen::symbolStorage->end();
}
} }
void Definition::flushToDisk() const void Definition::flushToDisk() const
{ {
//printf("%p: Definition::flushToDisk()\n",this); //printf("%p: Definition::flushToDisk()\n",this);
Definition *that = (Definition *)this; Definition *that = (Definition *)this;
that->m_storagePos = Doxygen::symbolStorage->alloc();
//printf("Definition::flushToDisk(): pos=%d\n",(int)m_storagePos); //printf("Definition::flushToDisk(): pos=%d\n",(int)m_storagePos);
marshalUInt(Doxygen::symbolStorage,START_MARKER); marshalUInt(Doxygen::symbolStorage,START_MARKER);
marshalSectionDict (Doxygen::symbolStorage,m_impl->sectionDict); marshalSectionDict (Doxygen::symbolStorage,m_impl->sectionDict);
...@@ -1262,7 +1193,6 @@ void Definition::flushToDisk() const ...@@ -1262,7 +1193,6 @@ void Definition::flushToDisk() const
marshalUInt(Doxygen::symbolStorage,END_MARKER); marshalUInt(Doxygen::symbolStorage,END_MARKER);
delete that->m_impl; delete that->m_impl;
that->m_impl = 0; that->m_impl = 0;
that->m_flushPending=FALSE;
} }
void Definition::loadFromDisk() const void Definition::loadFromDisk() const
...@@ -1271,7 +1201,6 @@ void Definition::loadFromDisk() const ...@@ -1271,7 +1201,6 @@ void Definition::loadFromDisk() const
Definition *that = (Definition *)this; Definition *that = (Definition *)this;
assert(m_impl==0); assert(m_impl==0);
that->m_impl = new DefinitionImpl; that->m_impl = new DefinitionImpl;
Doxygen::symbolStorage->seek(m_storagePos);
uint marker = unmarshalUInt(Doxygen::symbolStorage); uint marker = unmarshalUInt(Doxygen::symbolStorage);
assert(marker==START_MARKER); assert(marker==START_MARKER);
m_impl->sectionDict = unmarshalSectionDict (Doxygen::symbolStorage); m_impl->sectionDict = unmarshalSectionDict (Doxygen::symbolStorage);
...@@ -1294,18 +1223,3 @@ void Definition::loadFromDisk() const ...@@ -1294,18 +1223,3 @@ void Definition::loadFromDisk() const
assert(marker==END_MARKER); assert(marker==END_MARKER);
} }
void Definition::lock() const
{
}
void Definition::unlock() const
{
if (m_flushPending && !isLocked())
{
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
Doxygen::symbolStorage->end();
}
}
...@@ -279,19 +279,14 @@ class Definition : public DefinitionIntf, public LockableObj ...@@ -279,19 +279,14 @@ class Definition : public DefinitionIntf, public LockableObj
virtual void flushToDisk() const; virtual void flushToDisk() const;
virtual void loadFromDisk() const; virtual void loadFromDisk() const;
void makeResident() const; virtual void makeResident() const;
bool isResident() const void lock() const {}
{ void unlock() const {}
return m_cacheHandle!=-1;
}
private: private:
void lock() const;
void unlock() const;
static void addToMap(const char *name,Definition *d); static void addToMap(const char *name,Definition *d);
static void removeFromMap(Definition *d); static void removeFromMap(Definition *d);
void saveToDisk() const;
void _setSymbolName(const QCString &name); void _setSymbolName(const QCString &name);
...@@ -299,10 +294,7 @@ class Definition : public DefinitionIntf, public LockableObj ...@@ -299,10 +294,7 @@ class Definition : public DefinitionIntf, public LockableObj
void _writeSourceRefList(OutputList &ol,const char *scopeName, void _writeSourceRefList(OutputList &ol,const char *scopeName,
const QCString &text,MemberSDict *members,bool); const QCString &text,MemberSDict *members,bool);
DefinitionImpl *m_impl; // internal structure holding all private data DefinitionImpl *m_impl; // internal structure holding all private data
off_t m_storagePos; // location where the item is stored in file (if impl==0)
int m_cacheHandle;
QCString m_name; QCString m_name;
bool m_flushPending;
bool m_isSymbol; bool m_isSymbol;
QCString m_symbolName; QCString m_symbolName;
......
...@@ -339,6 +339,7 @@ static void checkUndocumentedParams() ...@@ -339,6 +339,7 @@ static void checkUndocumentedParams()
} }
if (found) if (found)
{ {
bool first=TRUE;
QString errMsg= QString errMsg=
"Warning: The following parameters of "+ "Warning: The following parameters of "+
QString(g_memberDef->qualifiedName()) + QString(g_memberDef->qualifiedName()) +
...@@ -349,7 +350,15 @@ static void checkUndocumentedParams() ...@@ -349,7 +350,15 @@ static void checkUndocumentedParams()
QString argName = g_memberDef->isDefine() ? a->type : a->name; QString argName = g_memberDef->isDefine() ? a->type : a->name;
if (!argName.isEmpty() && g_paramsFound.find(argName)==0) if (!argName.isEmpty() && g_paramsFound.find(argName)==0)
{ {
errMsg+=" parameter "+argName+"\n"; if (!first)
{
errMsg+="\n";
}
else
{
first=FALSE;
}
errMsg+=" parameter "+argName;
} }
} }
if (g_memberDef->inheritsDocsFrom()) if (g_memberDef->inheritsDocsFrom())
......
This diff is collapsed.
...@@ -59,11 +59,13 @@ class StringDict : public QDict<QCString> ...@@ -59,11 +59,13 @@ class StringDict : public QDict<QCString>
struct LookupInfo struct LookupInfo
{ {
LookupInfo(ClassDef *cd=0,MemberDef *td=0,QCString ts="") LookupInfo() : classDef(0), typeDef(0) {}
: classDef(cd), typeDef(td), templSpec(ts) {} LookupInfo(ClassDef *cd,MemberDef *td,QCString ts,QCString rt)
: classDef(cd), typeDef(td), templSpec(ts),resolvedType(rt) {}
ClassDef *classDef; ClassDef *classDef;
MemberDef *typeDef; MemberDef *typeDef;
QCString templSpec; QCString templSpec;
QCString resolvedType;
}; };
extern QCString spaces; extern QCString spaces;
......
...@@ -93,6 +93,7 @@ FileDef::FileDef(const char *p,const char *nm, ...@@ -93,6 +93,7 @@ FileDef::FileDef(const char *p,const char *nm,
m_isJava = name().right(5)==".java"; m_isJava = name().right(5)==".java";
memberGroupSDict = 0; memberGroupSDict = 0;
acquireFileVersion(); acquireFileVersion();
m_subGrouping=Config_getBool("SUBGROUPING");
} }
/*! destroy the file definition */ /*! destroy the file definition */
...@@ -491,7 +492,8 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -491,7 +492,8 @@ void FileDef::writeDocumentation(OutputList &ol)
MemberGroup *mg; MemberGroup *mg;
for (;(mg=mgli.current());++mgli) for (;(mg=mgli.current());++mgli)
{ {
if (mg->header()!="[NOHEADER]") if ((!mg->allMembersInSameSection() || !m_subGrouping)
&& mg->header()!="[NOHEADER]")
{ {
mg->writeDeclarations(ol,0,0,this,0); mg->writeDeclarations(ol,0,0,this,0);
} }
...@@ -689,6 +691,21 @@ void FileDef::addMembersToMemberGroup() ...@@ -689,6 +691,21 @@ void FileDef::addMembersToMemberGroup()
::addMembersToMemberGroup(ml,&memberGroupSDict,this); ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
} }
} }
// add members inside sections to their groups
if (memberGroupSDict)
{
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if (mg->allMembersInSameSection() && m_subGrouping)
{
//printf("----> addToDeclarationSection(%s)\n",mg->header().data());
mg->addToDeclarationSection();
}
}
}
} }
/*! Adds member definition \a md to the list of all members of this file */ /*! Adds member definition \a md to the list of all members of this file */
...@@ -1363,6 +1380,7 @@ void FileDef::addMemberToList(MemberList::ListType lt,MemberDef *md) ...@@ -1363,6 +1380,7 @@ void FileDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
{ {
ml->setInFile(TRUE); ml->setInFile(TRUE);
} }
if (ml->listType()&MemberList::declarationLists) md->setSectionList(this,ml);
} }
MemberList *FileDef::getMemberList(MemberList::ListType lt) const MemberList *FileDef::getMemberList(MemberList::ListType lt) const
......
...@@ -214,6 +214,7 @@ class FileDef : public Definition ...@@ -214,6 +214,7 @@ class FileDef : public Definition
MemberGroupSDict *memberGroupSDict; MemberGroupSDict *memberGroupSDict;
NamespaceSDict *namespaceSDict; NamespaceSDict *namespaceSDict;
ClassSDict *classSDict; ClassSDict *classSDict;
bool m_subGrouping;
}; };
......
...@@ -37,20 +37,15 @@ class LockableObj ...@@ -37,20 +37,15 @@ class LockableObj
/*! Returns TRUE if the object is currently locked. */ /*! Returns TRUE if the object is currently locked. */
bool isLocked() const { return m_lockCount>0; } bool isLocked() const { return m_lockCount>0; }
#ifndef _WIN32
protected: protected:
#endif
/*! Called when the object is locked. */ /*! Called when the object is locked. */
virtual void lock() const = 0; virtual void lock() const = 0;
/*! Called when the object is unlocked. */ /*! Called when the object is unlocked. */
virtual void unlock() const = 0; virtual void unlock() const = 0;
#ifndef _WIN32 // HACK: VC++ 6.0 does not understand friend template classes.
private: private:
template<class T> friend class LockingPtr; template<class T> friend class LockingPtr;
#endif
int m_lockCount; int m_lockCount;
}; };
......
...@@ -7,17 +7,17 @@ ...@@ -7,17 +7,17 @@
#include "store.h" #include "store.h"
class ArgumentList; class ArgumentList;
class BaseInfo; struct BaseInfo;
class Grouping; struct Grouping;
class SectionInfo; struct SectionInfo;
class ListItemInfo; struct ListItemInfo;
class QCString; class QCString;
class QGString; class QGString;
class SectionDict; class SectionDict;
class MemberSDict; class MemberSDict;
class GroupList; class GroupList;
class BodyInfo; struct BodyInfo;
class DocInfo; struct DocInfo;
class MemberList; class MemberList;
class ExampleSDict; class ExampleSDict;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "searchindex.h" #include "searchindex.h"
#include "parserintf.h" #include "parserintf.h"
#include "marshal.h" #include "marshal.h"
#include "objcache.h"
#define START_MARKER 0x4D454D5B // MEM[ #define START_MARKER 0x4D454D5B // MEM[
#define END_MARKER 0x4D454D5D // MEM] #define END_MARKER 0x4D454D5D // MEM]
...@@ -367,6 +368,7 @@ class MemberDefImpl ...@@ -367,6 +368,7 @@ class MemberDefImpl
bool isTypedefValCached; bool isTypedefValCached;
ClassDef *cachedTypedefValue; ClassDef *cachedTypedefValue;
QCString cachedTypedefTemplSpec; QCString cachedTypedefTemplSpec;
QCString cachedResolvedType;
// inbody documentation // inbody documentation
int inbodyLine; int inbodyLine;
...@@ -574,8 +576,11 @@ MemberDef::MemberDef(const char *df,int dl, ...@@ -574,8 +576,11 @@ MemberDef::MemberDef(const char *df,int dl,
const ArgumentList *tal,const ArgumentList *al const ArgumentList *tal,const ArgumentList *al
) : Definition(df,dl,removeRedundantWhiteSpace(na)) ) : Definition(df,dl,removeRedundantWhiteSpace(na))
{ {
m_storagePos=-1;
m_cacheHandle=-1;
m_impl = new MemberDefImpl; m_impl = new MemberDefImpl;
m_impl->init(this,t,a,e,p,v,s,r,mt,tal,al); m_impl->init(this,t,a,e,p,v,s,r,mt,tal,al);
m_flushPending = FALSE;
#if 0 #if 0
//printf("++++++ MemberDef(%s file=%s,line=%d static=%d) ++++++ \n", //printf("++++++ MemberDef(%s file=%s,line=%d static=%d) ++++++ \n",
...@@ -697,6 +702,11 @@ MemberDef::MemberDef(const char *df,int dl, ...@@ -697,6 +702,11 @@ MemberDef::MemberDef(const char *df,int dl,
MemberDef::~MemberDef() MemberDef::~MemberDef()
{ {
delete m_impl; delete m_impl;
if (m_cacheHandle!=-1)
{
Doxygen::symbolCache->del(m_cacheHandle);
m_cacheHandle=-1;
}
} }
void MemberDef::setReimplements(MemberDef *md) void MemberDef::setReimplements(MemberDef *md)
...@@ -774,7 +784,10 @@ QCString MemberDef::getOutputFileBase() const ...@@ -774,7 +784,10 @@ QCString MemberDef::getOutputFileBase() const
makeResident(); makeResident();
static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES"); static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
QCString baseName; QCString baseName;
if (m_impl->explicitOutputFileBase) //printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n",
// name().data(),m_impl->templateMaster,m_impl->group,m_impl->classDef,
// m_impl->nspace,m_impl->fileDef);
if (!m_impl->explicitOutputFileBase.isEmpty())
{ {
return m_impl->explicitOutputFileBase; return m_impl->explicitOutputFileBase;
} }
...@@ -805,6 +818,7 @@ QCString MemberDef::getOutputFileBase() const ...@@ -805,6 +818,7 @@ QCString MemberDef::getOutputFileBase() const
"Warning: Internal inconsistency: member %s does not belong to any" "Warning: Internal inconsistency: member %s does not belong to any"
" container!",name().data() " container!",name().data()
); );
exit(1);
return "dummy"; return "dummy";
} }
else if (separateMemberPages) else if (separateMemberPages)
...@@ -3375,6 +3389,12 @@ QCString MemberDef::getCachedTypedefTemplSpec() const ...@@ -3375,6 +3389,12 @@ QCString MemberDef::getCachedTypedefTemplSpec() const
return m_impl->cachedTypedefTemplSpec; return m_impl->cachedTypedefTemplSpec;
} }
QCString MemberDef::getCachedResolvedTypedef() const
{
makeResident();
return m_impl->cachedResolvedType;
}
MemberDef *MemberDef::memberDefinition() const MemberDef *MemberDef::memberDefinition() const
{ {
makeResident(); makeResident();
...@@ -3591,21 +3611,24 @@ void MemberDef::setMemberDeclaration(MemberDef *md) ...@@ -3591,21 +3611,24 @@ void MemberDef::setMemberDeclaration(MemberDef *md)
m_impl->memDec=md; m_impl->memDec=md;
} }
void MemberDef::cacheTypedefVal(ClassDef*val, QCString const& templSpec) void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const QCString &resolvedType)
{ {
makeResident(); makeResident();
m_impl->isTypedefValCached=TRUE; m_impl->isTypedefValCached=TRUE;
m_impl->cachedTypedefValue=val; m_impl->cachedTypedefValue=val;
m_impl->cachedTypedefTemplSpec=templSpec; m_impl->cachedTypedefTemplSpec=templSpec;
m_impl->cachedResolvedType=resolvedType;
} }
void MemberDef::flushToDisk() const void MemberDef::flushToDisk() const
{ {
if (isLocked()) return;
MemberDef *that = (MemberDef*)this;
that->m_storagePos = Doxygen::symbolStorage->alloc();
//printf("%p: MemberDef::flushToDisk()\n",this); //printf("%p: MemberDef::flushToDisk()\n",this);
// write the definition base class member variables to disk // write the definition base class member variables to disk
Definition::flushToDisk(); Definition::flushToDisk();
if (isLocked()) return;
//printf("%p: flushing specific part\n",this); //printf("%p: flushing specific part\n",this);
// write the memberdef member variables to disk // write the memberdef member variables to disk
...@@ -3658,6 +3681,7 @@ void MemberDef::flushToDisk() const ...@@ -3658,6 +3681,7 @@ void MemberDef::flushToDisk() const
marshalBool (Doxygen::symbolStorage,m_impl->isTypedefValCached); marshalBool (Doxygen::symbolStorage,m_impl->isTypedefValCached);
marshalObjPointer (Doxygen::symbolStorage,m_impl->cachedTypedefValue); marshalObjPointer (Doxygen::symbolStorage,m_impl->cachedTypedefValue);
marshalQCString (Doxygen::symbolStorage,m_impl->cachedTypedefTemplSpec); marshalQCString (Doxygen::symbolStorage,m_impl->cachedTypedefTemplSpec);
marshalQCString (Doxygen::symbolStorage,m_impl->cachedResolvedType);
marshalInt (Doxygen::symbolStorage,m_impl->inbodyLine); marshalInt (Doxygen::symbolStorage,m_impl->inbodyLine);
marshalQCString (Doxygen::symbolStorage,m_impl->inbodyFile); marshalQCString (Doxygen::symbolStorage,m_impl->inbodyFile);
marshalQCString (Doxygen::symbolStorage,m_impl->inbodyDocs); marshalQCString (Doxygen::symbolStorage,m_impl->inbodyDocs);
...@@ -3682,25 +3706,27 @@ void MemberDef::flushToDisk() const ...@@ -3682,25 +3706,27 @@ void MemberDef::flushToDisk() const
marshalUInt(Doxygen::symbolStorage,END_MARKER); marshalUInt(Doxygen::symbolStorage,END_MARKER);
// function doesn't modify the object conceptually but compiler doesn't know this. // function doesn't modify the object conceptually but compiler doesn't know this.
MemberDef *that = (MemberDef *)this;
delete that->m_impl; delete that->m_impl;
that->m_impl=0; that->m_impl=0;
that->m_flushPending=FALSE;
} }
void MemberDef::loadFromDisk() const void MemberDef::loadFromDisk() const
{ {
//printf("%p: MemberDef::loadFromDisk()\n",this); //printf("%p: MemberDef::loadFromDisk()\n",this);
Definition::loadFromDisk(); MemberDef *that = (MemberDef *)this;
if (isLocked()) if (isLocked())
{ {
assert(m_impl!=0); assert(m_impl!=0);
return; return;
} }
assert(m_impl==0); assert(m_impl==0);
Doxygen::symbolStorage->seek(m_storagePos);
Definition::loadFromDisk();
//printf("%p: loading specific part\n",this); //printf("%p: loading specific part\n",this);
MemberDef *that = (MemberDef *)this;
that->m_impl = new MemberDefImpl; that->m_impl = new MemberDefImpl;
uint marker = unmarshalUInt(Doxygen::symbolStorage); uint marker = unmarshalUInt(Doxygen::symbolStorage);
...@@ -3753,6 +3779,7 @@ void MemberDef::loadFromDisk() const ...@@ -3753,6 +3779,7 @@ void MemberDef::loadFromDisk() const
m_impl->isTypedefValCached = unmarshalBool (Doxygen::symbolStorage); m_impl->isTypedefValCached = unmarshalBool (Doxygen::symbolStorage);
m_impl->cachedTypedefValue = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage); m_impl->cachedTypedefValue = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
m_impl->cachedTypedefTemplSpec = unmarshalQCString (Doxygen::symbolStorage); m_impl->cachedTypedefTemplSpec = unmarshalQCString (Doxygen::symbolStorage);
m_impl->cachedResolvedType = unmarshalQCString (Doxygen::symbolStorage);
m_impl->inbodyLine = unmarshalInt (Doxygen::symbolStorage); m_impl->inbodyLine = unmarshalInt (Doxygen::symbolStorage);
m_impl->inbodyFile = unmarshalQCString (Doxygen::symbolStorage); m_impl->inbodyFile = unmarshalQCString (Doxygen::symbolStorage);
m_impl->inbodyDocs = unmarshalQCString (Doxygen::symbolStorage); m_impl->inbodyDocs = unmarshalQCString (Doxygen::symbolStorage);
...@@ -3778,3 +3805,84 @@ void MemberDef::loadFromDisk() const ...@@ -3778,3 +3805,84 @@ void MemberDef::loadFromDisk() const
assert(marker==END_MARKER); assert(marker==END_MARKER);
} }
void MemberDef::makeResident() const
{
if (m_cacheHandle==-1) // not yet in cache
{
MemberDef *victim = 0;
MemberDef *that = (MemberDef*)this; // fake method constness
that->m_cacheHandle = Doxygen::symbolCache->add(that,(void **)&victim);
//printf("adding %s to cache, handle=%d\n",m_impl->name.data(),that->m_cacheHandle);
if (victim) // cache was full, victim was the least recently used item and has to go
{
victim->m_cacheHandle=-1; // invalidate cache handle
victim->saveToDisk(); // store the item on disk
}
else // cache not yet full
{
//printf("Adding %s to cache, handle=%d\n",m_impl->name.data(),m_cacheHandle);
}
if (m_storagePos!=-1) // already been written to disk
{
if (isLocked()) // locked in memory
{
assert(m_impl!=0);
that->m_flushPending=FALSE; // no need to flush anymore
}
else // not locked in memory
{
assert(m_impl==0);
loadFromDisk();
}
}
}
else // already cached, make this object the most recently used.
{
assert(m_impl!=0);
//printf("Touching symbol %s\n",m_impl->name.data());
Doxygen::symbolCache->use(m_cacheHandle);
}
}
void MemberDef::saveToDisk() const
{
assert(m_impl!=0);
MemberDef *that = (MemberDef *)this;
if (isLocked()) // cannot flush the item as it is locked
{
that->m_flushPending=TRUE; // flush when unlocked
}
else // ready to flush the item to disk
{
//printf("Adding %s to cache, handle=%d by replacing %s\n",
// m_impl->name.data(),m_cacheHandle,victim->m_impl->name.data());
if (m_storagePos!=-1)
// if victim was stored on disk already and is not locked
{
// free the storage space occupied by the old store item
Doxygen::symbolStorage->release(m_storagePos); // free up space for others
}
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
Doxygen::symbolStorage->end();
}
}
void MemberDef::lock() const
{
}
void MemberDef::unlock() const
{
if (m_flushPending && !isLocked())
{
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
Doxygen::symbolStorage->end();
}
}
...@@ -209,6 +209,7 @@ class MemberDef : public Definition ...@@ -209,6 +209,7 @@ class MemberDef : public Definition
bool isTypedefValCached() const; bool isTypedefValCached() const;
ClassDef *getCachedTypedefVal() const; ClassDef *getCachedTypedefVal() const;
QCString getCachedTypedefTemplSpec() const; QCString getCachedTypedefTemplSpec() const;
QCString getCachedResolvedTypedef() const;
MemberDef *memberDefinition() const; MemberDef *memberDefinition() const;
MemberDef *memberDeclaration() const; MemberDef *memberDeclaration() const;
...@@ -294,7 +295,7 @@ class MemberDef : public Definition ...@@ -294,7 +295,7 @@ class MemberDef : public Definition
void setDocsForDefinition(bool b); void setDocsForDefinition(bool b);
void setGroupAlias(MemberDef *md); void setGroupAlias(MemberDef *md);
void cacheTypedefVal(ClassDef *val,const QCString &templSpec); void cacheTypedefVal(ClassDef *val,const QCString &templSpec,const QCString &resolvedType);
void invalidateTypedefValCache(); void invalidateTypedefValCache();
// declaration <-> definition relation // declaration <-> definition relation
...@@ -330,6 +331,11 @@ class MemberDef : public Definition ...@@ -330,6 +331,11 @@ class MemberDef : public Definition
void flushToDisk() const; void flushToDisk() const;
void loadFromDisk() const; void loadFromDisk() const;
private: private:
void lock() const;
void unlock() const;
void saveToDisk() const;
void makeResident() const;
static int s_indentLevel; static int s_indentLevel;
// disable copying of member defs // disable copying of member defs
MemberDef(const MemberDef &); MemberDef(const MemberDef &);
...@@ -340,6 +346,9 @@ class MemberDef : public Definition ...@@ -340,6 +346,9 @@ class MemberDef : public Definition
bool onlyText=FALSE); bool onlyText=FALSE);
MemberDefImpl *m_impl; MemberDefImpl *m_impl;
int m_cacheHandle;
off_t m_storagePos; // location where the item is stored in file (if impl==0)
bool m_flushPending;
}; };
#endif #endif
...@@ -133,6 +133,7 @@ void MemberGroup::addToDeclarationSection() ...@@ -133,6 +133,7 @@ void MemberGroup::addToDeclarationSection()
{ {
if (inDeclSection) if (inDeclSection)
{ {
//printf("Adding group %p to list %p\n",this,inDeclSection);
inDeclSection->addMemberGroup(this); inDeclSection->addMemberGroup(this);
} }
} }
......
...@@ -316,7 +316,8 @@ void MemberList::writeDeclarations(OutputList &ol, ...@@ -316,7 +316,8 @@ void MemberList::writeDeclarations(OutputList &ol,
//printf("----- writeDeclaration() ----\n"); //printf("----- writeDeclaration() ----\n");
countDecMembers(showEnumValues); // count member not in group countDecMembers(showEnumValues); // count member not in group
if (numDecMembers()==0) return; if (numDecMembers()==0) return;
//printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d\n",title,subtitle,numDecMembers()); //printf("%p: MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d\n",
// this,title,subtitle,numDecMembers());
if (title) if (title)
{ {
ol.startMemberHeader(); ol.startMemberHeader();
......
...@@ -51,6 +51,7 @@ NamespaceDef::NamespaceDef(const char *df,int dl, ...@@ -51,6 +51,7 @@ NamespaceDef::NamespaceDef(const char *df,int dl,
memberGroupSDict = new MemberGroupSDict; memberGroupSDict = new MemberGroupSDict;
memberGroupSDict->setAutoDelete(TRUE); memberGroupSDict->setAutoDelete(TRUE);
visited=FALSE; visited=FALSE;
m_subGrouping=Config_getBool("SUBGROUPING");
} }
NamespaceDef::~NamespaceDef() NamespaceDef::~NamespaceDef()
...@@ -151,6 +152,21 @@ void NamespaceDef::addMembersToMemberGroup() ...@@ -151,6 +152,21 @@ void NamespaceDef::addMembersToMemberGroup()
::addMembersToMemberGroup(ml,&memberGroupSDict,this); ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
} }
} }
// add members inside sections to their groups
if (memberGroupSDict)
{
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if (mg->allMembersInSameSection() && m_subGrouping)
{
//printf("----> addToDeclarationSection(%s)\n",mg->header().data());
mg->addToDeclarationSection();
}
}
}
} }
void NamespaceDef::insertMember(MemberDef *md) void NamespaceDef::insertMember(MemberDef *md)
...@@ -316,11 +332,18 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -316,11 +332,18 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
namespaceSDict->writeDeclaration(ol,TRUE); namespaceSDict->writeDeclaration(ol,TRUE);
/* write user defined member groups */ /* write user defined member groups */
MemberGroupSDict::Iterator mgli(*memberGroupSDict); if (memberGroupSDict)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{ {
mg->writeDeclarations(ol,0,this,0,0); MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if ((!mg->allMembersInSameSection() || !m_subGrouping)
&& mg->header()!="[NOHEADER]")
{
mg->writeDeclarations(ol,0,this,0,0);
}
}
} }
writeMemberDeclarations(ol,MemberList::decDefineMembers,theTranslator->trDefines()); writeMemberDeclarations(ol,MemberList::decDefineMembers,theTranslator->trDefines());
...@@ -676,6 +699,7 @@ void NamespaceDef::addMemberToList(MemberList::ListType lt,MemberDef *md) ...@@ -676,6 +699,7 @@ void NamespaceDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
ml->inSort(md); ml->inSort(md);
else else
ml->append(md); ml->append(md);
if (ml->listType()&MemberList::declarationLists) md->setSectionList(this,ml);
} }
MemberList *NamespaceDef::getMemberList(MemberList::ListType lt) const MemberList *NamespaceDef::getMemberList(MemberList::ListType lt) const
......
...@@ -106,7 +106,7 @@ class NamespaceDef : public Definition ...@@ -106,7 +106,7 @@ class NamespaceDef : public Definition
MemberGroupSDict *memberGroupSDict; MemberGroupSDict *memberGroupSDict;
ClassSDict *classSDict; ClassSDict *classSDict;
NamespaceSDict *namespaceSDict; NamespaceSDict *namespaceSDict;
bool m_subGrouping;
}; };
class NamespaceList : public QList<NamespaceDef> class NamespaceList : public QList<NamespaceDef>
......
...@@ -176,16 +176,31 @@ void ObjCache::moveToFront(int index) ...@@ -176,16 +176,31 @@ void ObjCache::moveToFront(int index)
unsigned int ObjCache::hash(void *addr) unsigned int ObjCache::hash(void *addr)
{ {
// Thomas Wang's 32 bit Mix Function static bool isPtr64 = sizeof(addr)==8 && sizeof(long)==8;
// TODO: what if sizeof(void*)!=4 ? unsigned long key = (unsigned long)addr;
unsigned int key = (unsigned int)addr; if (isPtr64)
key += ~(key << 15); {
key ^= (key >> 10); // Thomas Wang's 64 bit Mix Function
key += (key << 3); key += ~(key << 32);
key ^= (key >> 6); key ^= (key >> 22);
key += ~(key << 11); key += ~(key << 13);
key ^= (key >> 16); key ^= (key >> 8);
key += (key << 3);
key ^= (key >> 15);
key += ~(key << 27);
key ^= (key >> 31);
}
else
{
// Thomas Wang's 32 bit Mix Function
key += ~(key << 15);
key ^= (key >> 10);
key += (key << 3);
key ^= (key >> 6);
key += ~(key << 11);
key ^= (key >> 16);
}
return key & (m_size-1); return key & (m_size-1);
} }
......
...@@ -69,6 +69,7 @@ struct FileState ...@@ -69,6 +69,7 @@ struct FileState
static int g_yyLineNr = 1; static int g_yyLineNr = 1;
static QCString g_yyFileName; static QCString g_yyFileName;
static FileDef *g_yyFileDef; static FileDef *g_yyFileDef;
static FileDef *g_inputFileDef;
static int g_ifcount = 0; static int g_ifcount = 0;
static QStrList *g_pathList = 0; static QStrList *g_pathList = 0;
static QStack<FileState> g_includeStack; static QStack<FileState> g_includeStack;
...@@ -1043,17 +1044,13 @@ void addDefine() ...@@ -1043,17 +1044,13 @@ void addDefine()
} }
md->setInitializer(g_defLitText.stripWhiteSpace()); md->setInitializer(g_defLitText.stripWhiteSpace());
//md->setDefFile(g_yyFileName); md->setFileDef(g_inputFileDef);
//md->setDefLine(g_yyLineNr);
md->setFileDef(g_yyFileDef);
md->setDefinition("#define "+g_defName); md->setDefinition("#define "+g_defName);
MemberName *mn=Doxygen::functionNameSDict->find(g_defName); MemberName *mn=Doxygen::functionNameSDict->find(g_defName);
if (mn==0) if (mn==0)
{ {
mn = new MemberName(g_defName); mn = new MemberName(g_defName);
//Doxygen::functionNameList.append(mn);
//Doxygen::functionNameDict.insert(g_defName,mn);
Doxygen::functionNameSDict->append(g_defName,mn); Doxygen::functionNameSDict->append(g_defName,mn);
} }
mn->append(md); mn->append(md);
...@@ -1790,6 +1787,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -1790,6 +1787,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_insideComment=FALSE; g_insideComment=FALSE;
BEGIN(DefineText); BEGIN(DefineText);
} }
<DefineArg>"..." { // Variadic macro
g_defVarArgs = TRUE;
g_defArgsStr+=yytext;
g_argDict->insert("__VA_ARGS__",new int(g_defArgs));
g_defArgs++;
}
<DefineArg>{ID}{B}*("..."?) { <DefineArg>{ID}{B}*("..."?) {
//printf("Define addArg(%s)\n",yytext); //printf("Define addArg(%s)\n",yytext);
QCString argName=yytext; QCString argName=yytext;
...@@ -2372,6 +2375,7 @@ void preprocessFile(const char *fileName,BufStr &output) ...@@ -2372,6 +2375,7 @@ void preprocessFile(const char *fileName,BufStr &output)
g_level = 0; g_level = 0;
g_ifcount = 0; g_ifcount = 0;
setFileName(fileName); setFileName(fileName);
g_inputFileDef = g_yyFileDef;
BEGIN( Start ); BEGIN( Start );
g_lastGuardName.resize(0); g_lastGuardName.resize(0);
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#ifndef TRANSLATOR_JP_H #ifndef TRANSLATOR_JP_H
#define TRANSLATOR_JP_H #define TRANSLATOR_JP_H
class TranslatorJapanese : public TranslatorAdapter_1_4_6 class TranslatorJapanese : public Translator
{ {
private: private:
/*! The decode() can change euc into sjis */ /*! The decode() can change euc into sjis */
...@@ -453,12 +453,6 @@ class TranslatorJapanese : public TranslatorAdapter_1_4_6 ...@@ -453,12 +453,6 @@ class TranslatorJapanese : public TranslatorAdapter_1_4_6
virtual QCString trEnumerationTypeDocumentation() virtual QCString trEnumerationTypeDocumentation()
{ return decode("列挙型"); } { return decode("列挙型"); }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
virtual QCString trEnumerationValueDocumentation()
{ return decode("列挙型の値"); }
/*! This is used in the documentation of a file/namespace before the list /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for functions * of documentation blocks for functions
*/ */
...@@ -1562,5 +1556,23 @@ class TranslatorJapanese : public TranslatorAdapter_1_4_6 ...@@ -1562,5 +1556,23 @@ class TranslatorJapanese : public TranslatorAdapter_1_4_6
"利便性のために用意されています。" "利便性のために用意されています。"
"元の関数との違いは引き数のみです。"); "元の関数との違いは引き数のみです。");
} }
//////////////////////////////////////////////////////////////////////////
// new since 1.4.6
//////////////////////////////////////////////////////////////////////////
/*! This is used to introduce a caller (or called-by) graph */
virtual QCString trCallerGraph()
{
// return "Here is the caller graph for this function:";
return "呼出しグラフ:";
}
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
virtual QCString trEnumerationValueDocumentation()
{ return "列挙型"; }
}; };
#endif #endif
This diff is collapsed.
...@@ -175,7 +175,8 @@ ClassDef *getResolvedClass(Definition *scope, ...@@ -175,7 +175,8 @@ ClassDef *getResolvedClass(Definition *scope,
MemberDef **pTypeDef=0, MemberDef **pTypeDef=0,
QCString *pTemplSpec=0, QCString *pTemplSpec=0,
bool mayBeUnlinkable=FALSE, bool mayBeUnlinkable=FALSE,
bool mayBeHidden=FALSE); bool mayBeHidden=FALSE,
QCString *pResolvedType=0);
NamespaceDef *getResolvedNamespace(const char *key); NamespaceDef *getResolvedNamespace(const char *key);
...@@ -326,7 +327,8 @@ SrcLangExt getLanguageFromFileName(const QCString fileName); ...@@ -326,7 +327,8 @@ SrcLangExt getLanguageFromFileName(const QCString fileName);
bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n); bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n);
ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md, ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
MemberDef **pMemType=0,QCString *pTemplSpec=0); MemberDef **pMemType=0,QCString *pTemplSpec=0,
QCString *pResolvedType=0);
#endif #endif
......

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual C++ Express 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxygen", "Doxygen.vcproj", "{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}"
ProjectSection(ProjectDependencies) = postProject
{2543196E-6FC5-4D6A-96A8-91443CF7B21B} = {2543196E-6FC5-4D6A-96A8-91443CF7B21B}
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64} = {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3} = {FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxytag", "Doxytag.vcproj", "{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}"
ProjectSection(ProjectDependencies) = postProject
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64} = {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcproj", "{2543196E-6FC5-4D6A-96A8-91443CF7B21B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtools", "qtools.vcproj", "{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcproj", "{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxywizard", "Doxywizard.vcproj", "{6E404596-D6B6-41A5-8F25-C52921A7C1BF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|Win32.ActiveCfg = Debug|Win32
{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|Win32.Build.0 = Debug|Win32
{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|Win32.ActiveCfg = Release|Win32
{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|Win32.Build.0 = Release|Win32
{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Debug|Win32.ActiveCfg = Debug|Win32
{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Debug|Win32.Build.0 = Debug|Win32
{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Release|Win32.ActiveCfg = Release|Win32
{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Release|Win32.Build.0 = Release|Win32
{2543196E-6FC5-4D6A-96A8-91443CF7B21B}.Debug|Win32.ActiveCfg = Debug|Win32
{2543196E-6FC5-4D6A-96A8-91443CF7B21B}.Debug|Win32.Build.0 = Debug|Win32
{2543196E-6FC5-4D6A-96A8-91443CF7B21B}.Release|Win32.ActiveCfg = Release|Win32
{2543196E-6FC5-4D6A-96A8-91443CF7B21B}.Release|Win32.Build.0 = Release|Win32
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|Win32.ActiveCfg = Debug|Win32
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|Win32.Build.0 = Debug|Win32
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|Win32.ActiveCfg = Release|Win32
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|Win32.Build.0 = Release|Win32
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}.Debug|Win32.ActiveCfg = Debug|Win32
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}.Debug|Win32.Build.0 = Debug|Win32
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}.Release|Win32.ActiveCfg = Release|Win32
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}.Release|Win32.Build.0 = Release|Win32
{6E404596-D6B6-41A5-8F25-C52921A7C1BF}.Debug|Win32.ActiveCfg = Debug|Win32
{6E404596-D6B6-41A5-8F25-C52921A7C1BF}.Debug|Win32.Build.0 = Debug|Win32
{6E404596-D6B6-41A5-8F25-C52921A7C1BF}.Release|Win32.ActiveCfg = Release|Win32
{6E404596-D6B6-41A5-8F25-C52921A7C1BF}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="Run Moc"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="moc"
DisplayName="Moc"
CommandLine="$(QTDIR)/bin/moc.exe $(InputPath) -o moc_$(InputName).cpp"
Outputs="moc_$(InputName).cpp"
AdditionalDependencies="$(QTDIR)/bin/moc.exe"
FileExtensions="*.h"
ExecutionDescription="Moc&apos;ing $(InputPath)"
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment