summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp6
-rw-r--r--src/classdef.h1
-rw-r--r--src/context.cpp1006
-rw-r--r--src/context.h48
-rw-r--r--src/definition.cpp11
-rw-r--r--src/definition.h9
-rw-r--r--src/htmlgen.h2
-rw-r--r--src/markdown.cpp12
-rw-r--r--src/memberdef.cpp51
-rw-r--r--src/memberdef.h8
-rw-r--r--src/membergroup.h4
-rw-r--r--src/portable.cpp6
-rw-r--r--src/template.cpp24
-rw-r--r--src/template.h82
-rw-r--r--src/util.cpp23
-rw-r--r--src/util.h2
16 files changed, 1077 insertions, 218 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 25c6b58..53eabc2 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -4769,3 +4769,9 @@ const ExampleSDict *ClassDef::exampleList() const
{
return m_impl->exampleSDict;
}
+
+bool ClassDef::subGrouping() const
+{
+ return m_impl->subGrouping;
+}
+
diff --git a/src/classdef.h b/src/classdef.h
index eb36383..f6d594c 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -317,6 +317,7 @@ class ClassDef : public Definition
const ExampleSDict *exampleList() const;
bool hasExamples() const;
QCString getMemberListFileName() const;
+ bool subGrouping() const;
//-----------------------------------------------------------------------------------
// --- setters ----
diff --git a/src/context.cpp b/src/context.cpp
index 1881147..7e14c8b 100644
--- a/src/context.cpp
+++ b/src/context.cpp
@@ -21,6 +21,7 @@
#include "diagram.h"
#include "example.h"
#include "membername.h"
+#include "parserintf.h"
struct ContextGlobals
{
@@ -328,31 +329,7 @@ class TranslateContext::Private : public PropertyMapper
{
public:
- static TemplateVariant generatedAtFunc(const void *obj,const QValueList<TemplateVariant> &args)
- {
- return ((TranslateContext::Private*)obj)->generatedAt(args);
- }
- static TemplateVariant inheritanceDiagramForFunc(const void *obj,const QValueList<TemplateVariant> &args)
- {
- return ((TranslateContext::Private*)obj)->inheritanceDiagramFor(args);
- }
- static TemplateVariant inheritsListFunc(const void *obj,const QValueList<TemplateVariant> &args)
- {
- return ((TranslateContext::Private*)obj)->inheritsList(args);
- }
- static TemplateVariant inheritedByListFunc(const void *obj,const QValueList<TemplateVariant> &args)
- {
- return ((TranslateContext::Private*)obj)->inheritedByList(args);
- }
- static TemplateVariant collaborationDiagramForFunc(const void *obj,const QValueList<TemplateVariant> &args)
- {
- return ((TranslateContext::Private*)obj)->collaborationDiagramFor(args);
- }
- static TemplateVariant writeListFunc(const void *obj,const QValueList<TemplateVariant> &args)
- {
- return ((TranslateContext::Private*)obj)->writeList(args);
- }
- TemplateVariant generatedAt(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleGeneratedAt(const QValueList<TemplateVariant> &args) const
{
if (args.count()==2)
{
@@ -364,7 +341,7 @@ class TranslateContext::Private : public PropertyMapper
}
return TemplateVariant();
}
- TemplateVariant inheritanceDiagramFor(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleInheritanceDiagramFor(const QValueList<TemplateVariant> &args) const
{
if (args.count()==1)
{
@@ -376,7 +353,7 @@ class TranslateContext::Private : public PropertyMapper
}
return TemplateVariant();
}
- TemplateVariant collaborationDiagramFor(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleCollaborationDiagramFor(const QValueList<TemplateVariant> &args) const
{
if (args.count()==1)
{
@@ -388,7 +365,7 @@ class TranslateContext::Private : public PropertyMapper
}
return TemplateVariant();
}
- TemplateVariant inheritsList(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleInheritsList(const QValueList<TemplateVariant> &args) const
{
if (args.count()==1)
{
@@ -400,7 +377,7 @@ class TranslateContext::Private : public PropertyMapper
}
return TemplateVariant();
}
- QCString inheritedByList(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleInheritedByList(const QValueList<TemplateVariant> &args) const
{
if (args.count()==1)
{
@@ -410,9 +387,9 @@ class TranslateContext::Private : public PropertyMapper
{
err("tr.inheritedByList should take one integer parameter, got %d!\n",args.count());
}
- return QCString();
+ return TemplateVariant();
}
- QCString writeList(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleWriteList(const QValueList<TemplateVariant> &args) const
{
if (args.count()==1)
{
@@ -422,7 +399,55 @@ class TranslateContext::Private : public PropertyMapper
{
err("tr.*List should take one integer parameter, got %d!\n",args.count());
}
- return QCString();
+ return TemplateVariant();
+ }
+ TemplateVariant handleImplementedBy(const QValueList<TemplateVariant> &args) const
+ {
+ if (args.count()==1)
+ {
+ return theTranslator->trImplementedInList(args[0].toInt());
+ }
+ else
+ {
+ err("tr.implementedBy should take one integer parameter, got %d!\n",args.count());
+ }
+ return TemplateVariant();
+ }
+ TemplateVariant handleReimplementedBy(const QValueList<TemplateVariant> &args) const
+ {
+ if (args.count()==1)
+ {
+ return theTranslator->trReimplementedInList(args[0].toInt());
+ }
+ else
+ {
+ err("tr.reimplementedBy should take one integer parameter, got %d!\n",args.count());
+ }
+ return TemplateVariant();
+ }
+ TemplateVariant handleSourceRefs(const QValueList<TemplateVariant> &args) const
+ {
+ if (args.count()==1)
+ {
+ return theTranslator->trReferences()+" "+theTranslator->trWriteList(args[0].toInt())+".";
+ }
+ else
+ {
+ err("tr.sourceRefs should take one integer parameter, got %d\n",args.count());
+ }
+ return TemplateVariant();
+ }
+ TemplateVariant handleSourceRefBys(const QValueList<TemplateVariant> &args) const
+ {
+ if (args.count()==1)
+ {
+ return theTranslator->trReferencedBy()+" "+theTranslator->trWriteList(args[0].toInt())+".";
+ }
+ else
+ {
+ err("tr.sourceRefBys should take one integer parameter, got %d\n",args.count());
+ }
+ return TemplateVariant();
}
@@ -433,15 +458,15 @@ class TranslateContext::Private : public PropertyMapper
}
TemplateVariant generatedAt() const
{
- return TemplateVariant(this,&Private::generatedAtFunc);
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleGeneratedAt>(this);
}
TemplateVariant inheritanceDiagramFor() const
{
- return TemplateVariant(this,&Private::inheritanceDiagramForFunc);
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritanceDiagramFor>(this);
}
TemplateVariant collaborationDiagramFor() const
{
- return TemplateVariant(this,&Private::collaborationDiagramForFunc);
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleCollaborationDiagramFor>(this);
}
TemplateVariant search() const
{
@@ -554,11 +579,11 @@ class TranslateContext::Private : public PropertyMapper
}
TemplateVariant inheritsList() const
{
- return TemplateVariant(this,&Private::inheritsListFunc);
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritsList>(this);
}
TemplateVariant inheritedByList() const
{
- return TemplateVariant(this,&Private::inheritedByListFunc);
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritedByList>(this);
}
TemplateVariant definedAtLineInSourceFile() const
{
@@ -570,7 +595,7 @@ class TranslateContext::Private : public PropertyMapper
}
TemplateVariant exampleList() const
{
- return TemplateVariant(this,&Private::writeListFunc);
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleWriteList>(this);
}
TemplateVariant listOfAllMembers() const
{
@@ -588,6 +613,50 @@ class TranslateContext::Private : public PropertyMapper
{
return theTranslator->trIncludingInheritedMembers();
}
+ TemplateVariant defineValue() const
+ {
+ return theTranslator->trDefineValue();
+ }
+ TemplateVariant initialValue() const
+ {
+ return theTranslator->trInitialValue();
+ }
+ TemplateVariant enumerationValues() const
+ {
+ return theTranslator->trEnumerationValues();
+ }
+ TemplateVariant implements() const
+ {
+ return theTranslator->trImplementedFromList(1);
+ }
+ TemplateVariant reimplements() const
+ {
+ return theTranslator->trReimplementedFromList(1);
+ }
+ TemplateVariant implementedBy() const
+ {
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleImplementedBy>(this);
+ }
+ TemplateVariant reimplementedBy() const
+ {
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleReimplementedBy>(this);
+ }
+ TemplateVariant sourceRefs() const
+ {
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefs>(this);
+ }
+ TemplateVariant sourceRefBys() const
+ {
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefBys>(this);
+ }
+ TemplateVariant callGraph() const
+ {
+ return theTranslator->trCallGraph();
+ }
+ TemplateVariant callerGraph() const
+ {
+ return theTranslator->trCallerGraph();
+ }
Private()
{
//%% string generatedBy
@@ -654,6 +723,28 @@ class TranslateContext::Private : public PropertyMapper
addProperty("theListOfAllMembers",this,&Private::theListOfAllMembers);
//%% string incInheritedMembers
addProperty("incInheritedMembers",this,&Private::incInheritedMembers);
+ //%% string defineValue
+ addProperty("defineValue", this,&Private::defineValue);
+ //%% string initialValue
+ addProperty("initialValue", this,&Private::initialValue);
+ //%% string enumerationValues
+ addProperty("enumerationValues", this,&Private::enumerationValues);
+ //%% markerstring implements
+ addProperty("implements", this,&Private::implements);
+ //%% markerstring reimplements
+ addProperty("reimplements", this,&Private::reimplements);
+ //%% markerstring implementedBy
+ addProperty("implementedBy", this,&Private::implementedBy);
+ //%% markerstring reimplementedBy
+ addProperty("reimplementedBy", this,&Private::reimplementedBy);
+ //%% markerstring sourceRefs
+ addProperty("sourceRefs", this,&Private::sourceRefs);
+ //%% markerstring sourceRefBys
+ addProperty("sourceRefBys", this,&Private::sourceRefBys);
+ //%% string callGraph
+ addProperty("callGraph", this,&Private::callGraph);
+ //%% string callerGraph
+ addProperty("callerGraph", this,&Private::callerGraph);
m_javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
m_fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
@@ -703,6 +794,19 @@ static TemplateVariant parseDoc(Definition *def,const QCString &file,int line,
return result;
}
+static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const QCString &relPath,
+ const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE)
+{
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(md->getDefFileExtension());
+ pIntf->resetCodeParserState();
+ QGString s;
+ FTextStream t(&s);
+ HtmlCodeGenerator codeGen(t,relPath);
+ pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
+ startLine,endLine,TRUE,md,showLineNumbers,md);
+ return TemplateVariant(s.data(),TRUE);
+}
+
//------------------------------------------------------------------------
//%% struct Symbol: shared info for all symbols
@@ -727,6 +831,8 @@ class DefinitionContext : public PropertyMapper
addProperty("details",this,&DefinitionContext::details);
//%% string brief: the brief description for this symbol
addProperty("brief",this,&DefinitionContext::brief);
+ //%% string inbodyDocs: the documentation found in the body
+ addProperty("inbodyDocs",this,&DefinitionContext::inbodyDocs);
//%% string sourceFileName: the file name of the source file (without extension)
addProperty("sourceFileName",this,&DefinitionContext::sourceFileName);
//%% bool isLinkable: can the symbol be linked to?
@@ -745,7 +851,7 @@ class DefinitionContext : public PropertyMapper
m_sourceDef.append(&m_lineLink);
m_sourceDef.append(&m_fileLink);
m_lineLink.set("text",m_def->getStartBodyLine());
- m_lineLink.set("isLinkable",m_def->isLinkable());
+ m_lineLink.set("isLinkable",TRUE);
m_lineLink.set("fileName",m_def->getSourceFileBase());
m_lineLink.set("anchor",m_def->getSourceAnchor());
if (m_def->definitionType()==Definition::TypeFile)
@@ -760,7 +866,7 @@ class DefinitionContext : public PropertyMapper
{
m_fileLink.set("text",name());
}
- m_fileLink.set("isLinkable",m_def->isLinkable());
+ m_fileLink.set("isLinkable",TRUE);
m_fileLink.set("fileName",m_def->getSourceFileBase());
m_fileLink.set("anchor",QCString());
}
@@ -827,6 +933,22 @@ class DefinitionContext : public PropertyMapper
}
return *m_cache.brief;
}
+ TemplateVariant inbodyDocs() const
+ {
+ if (!m_cache.inbodyDocs)
+ {
+ if (!m_def->inbodyDocumentation().isEmpty())
+ {
+ m_cache.inbodyDocs.reset(new TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(),
+ relPathAsString(),m_def->inbodyDocumentation(),FALSE)));
+ }
+ else
+ {
+ m_cache.inbodyDocs.reset(new TemplateVariant(""));
+ }
+ }
+ return *m_cache.inbodyDocs;
+ }
TemplateVariant dynSectionId() const
{
return g_globals.dynSectionId;
@@ -873,6 +995,7 @@ class DefinitionContext : public PropertyMapper
{
ScopedPtr<TemplateVariant> details;
ScopedPtr<TemplateVariant> brief;
+ ScopedPtr<TemplateVariant> inbodyDocs;
};
mutable Cachable m_cache;
TemplateList m_sourceDef;
@@ -954,7 +1077,7 @@ TemplateVariant IncludeInfoContext::get(const char *n) const
class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
public:
- Private(ClassDef *cd) : DefinitionContext(cd) ,
+ Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd) ,
m_classDef(cd), m_usedFiles(cd),
m_includeInfo(cd ? cd->includeInfo() : 0, cd ? cd->getLanguage() : SrcLangExt_Unknown)
{
@@ -1001,12 +1124,17 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
addProperty("properties", this,&Private::properties);
addProperty("events", this,&Private::events);
addProperty("friends", this,&Private::friends);
- addProperty("relatedDecls", this,&Private::relatedDecls);
-
- addProperty("typedefs", this,&Private::typedefs);
- addProperty("methods", this,&Private::methods);
- addProperty("relatedDefs", this,&Private::relatedDefs);
-
+ addProperty("related", this,&Private::related);
+ addProperty("detailedTypedefs", this,&Private::detailedTypedefs);
+ addProperty("detailedEnums", this,&Private::detailedEnums);
+ addProperty("detailedServices", this,&Private::detailedServices);
+ addProperty("detailedInterfaces", this,&Private::detailedInterfaces);
+ addProperty("detailedConstructors", this,&Private::detailedConstructors);
+ addProperty("detailedMethods", this,&Private::detailedMethods);
+ addProperty("detailedRelated", this,&Private::detailedRelated);
+ addProperty("detailedVariables", this,&Private::detailedVariables);
+ addProperty("detailedProperties", this,&Private::detailedProperties);
+ addProperty("detailedEvents", this,&Private::detailedEvents);
addProperty("nestedClasses", this,&Private::nestedClasses);
addProperty("compoundType", this,&Private::compoundType);
addProperty("templateDecls", this,&Private::templateDecls);
@@ -1014,6 +1142,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
addProperty("examples", this,&Private::examples);
addProperty("allMembersList", this,&Private::allMembersList);
addProperty("allMembersFileName", this,&Private::allMembersFileName);
+ addProperty("memberGroups", this,&Private::memberGroups);
}
TemplateVariant title() const
{
@@ -1176,7 +1305,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
MemberList *ml = m_classDef->getMemberList(type);
if (ml)
{
- list.reset(new MemberListInfoContext(ml,title));
+ list.reset(new MemberListInfoContext(m_classDef,relPathAsString(),ml,title));
}
}
if (list)
@@ -1308,21 +1437,49 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
return getMemberList(m_cache.friends,MemberListType_friends,theTranslator->trFriends());
}
- TemplateVariant relatedDecls() const
+ TemplateVariant related() const
+ {
+ return getMemberList(m_cache.related,MemberListType_related,theTranslator->trRelatedFunctions());
+ }
+ TemplateVariant detailedTypedefs() const
+ {
+ return getMemberList(m_cache.detailedTypedefs,MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation());
+ }
+ TemplateVariant detailedEnums() const
+ {
+ return getMemberList(m_cache.detailedEnums,MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation());
+ }
+ TemplateVariant detailedServices() const
+ {
+ return getMemberList(m_cache.detailedServices,MemberListType_serviceMembers,theTranslator->trServices());
+ }
+ TemplateVariant detailedInterfaces() const
+ {
+ return getMemberList(m_cache.detailedInterfaces,MemberListType_interfaceMembers,theTranslator->trInterfaces());
+ }
+ TemplateVariant detailedConstructors() const
+ {
+ return getMemberList(m_cache.detailedConstructors,MemberListType_constructors,theTranslator->trConstructorDocumentation());
+ }
+ TemplateVariant detailedMethods() const
+ {
+ return getMemberList(m_cache.detailedMethods,MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation());
+ }
+ TemplateVariant detailedRelated() const
{
- return getMemberList(m_cache.relatedDecls,MemberListType_related,theTranslator->trRelatedFunctions());
+ return getMemberList(m_cache.detailedRelated,MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation());
}
- TemplateVariant typedefs() const
+ TemplateVariant detailedVariables() const
{
- return getMemberList(m_cache.typedefs,MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation());
+ return getMemberList(m_cache.detailedVariables,MemberListType_variableMembers,theTranslator->trMemberDataDocumentation());
}
- TemplateVariant methods() const
+ TemplateVariant detailedProperties() const
{
- return getMemberList(m_cache.methods,MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation());
+ return getMemberList(m_cache.detailedProperties,MemberListType_propertyMembers,theTranslator->trPropertyDocumentation());
}
- TemplateVariant relatedDefs() const
+ TemplateVariant detailedEvents() const
{
- return getMemberList(m_cache.relatedDefs,MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation());
+ return getMemberList(m_cache.detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation());
}
TemplateVariant nestedClasses() const
{
@@ -1331,9 +1488,9 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
if (!m_cache.nestedClasses)
{
+ NestedClassListContext *classList = new NestedClassListContext;
if (m_classDef->getClassSDict())
{
- NestedClassListContext *classList = new NestedClassListContext;
ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
ClassDef *cd;
for (sdi.toFirst();(cd=sdi.current());++sdi)
@@ -1348,17 +1505,10 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
classList->append(cd);
}
}
- m_cache.nestedClasses.reset(classList);
}
+ m_cache.nestedClasses.reset(classList);
}
- if (m_cache.nestedClasses)
- {
- return m_cache.nestedClasses.get();
- }
- else
- {
- return TemplateVariant(FALSE);
- }
+ return m_cache.nestedClasses.get();
}
TemplateVariant compoundType() const
{
@@ -1410,14 +1560,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
addTemplateDecls(m_classDef,tl);
m_cache.templateDecls.reset(tl);
}
- if (m_cache.templateDecls)
- {
- return m_cache.templateDecls.get();
- }
- else
- {
- return TemplateVariant(FALSE);
- }
+ return m_cache.templateDecls.get();
}
TemplateVariant typeConstraints() const
{
@@ -1425,14 +1568,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
m_cache.typeConstraints.reset(new ArgumentListContext(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
}
- if (m_cache.typeConstraints)
- {
- return m_cache.typeConstraints.get();
- }
else
{
- return TemplateVariant(FALSE);
+ m_cache.typeConstraints.reset(new ArgumentListContext);
}
+ return m_cache.typeConstraints.get();
}
TemplateVariant examples() const
{
@@ -1442,14 +1582,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
addExamples(exampleList);
m_cache.examples.reset(exampleList);
}
- if (m_cache.examples)
- {
- return m_cache.examples.get();
- }
- else
- {
- return TemplateVariant(FALSE);
- }
+ return m_cache.examples.get();
}
TemplateVariant allMembersList() const
{
@@ -1458,19 +1591,31 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
AllMembersListContext *ml = new AllMembersListContext(m_classDef->memberNameInfoSDict());
m_cache.allMembersList.reset(ml);
}
- if (m_cache.allMembersList)
- {
- return m_cache.allMembersList.get();
- }
else
{
- return TemplateVariant(FALSE);
+ m_cache.allMembersList.reset(new AllMembersListContext);
}
+ return m_cache.allMembersList.get();
}
TemplateVariant allMembersFileName() const
{
return m_classDef->getMemberListFileName();
}
+ TemplateVariant memberGroups() const
+ {
+ if (!m_cache.memberGroups)
+ {
+ if (m_classDef->getMemberGroupSDict())
+ {
+ m_cache.memberGroups.reset(new MemberGroupListContext(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
+ }
+ else
+ {
+ m_cache.memberGroups.reset(new MemberGroupListContext);
+ }
+ }
+ return m_cache.memberGroups.get();
+ }
private:
ClassDef *m_classDef;
@@ -1517,10 +1662,18 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
ScopedPtr<MemberListInfoContext> properties;
ScopedPtr<MemberListInfoContext> events;
ScopedPtr<MemberListInfoContext> friends;
- ScopedPtr<MemberListInfoContext> relatedDecls;
- ScopedPtr<MemberListInfoContext> typedefs;
- ScopedPtr<MemberListInfoContext> methods;
- ScopedPtr<MemberListInfoContext> relatedDefs;
+ ScopedPtr<MemberListInfoContext> related;
+ ScopedPtr<MemberListInfoContext> detailedTypedefs;
+ ScopedPtr<MemberListInfoContext> detailedEnums;
+ ScopedPtr<MemberListInfoContext> detailedServices;
+ ScopedPtr<MemberListInfoContext> detailedInterfaces;
+ ScopedPtr<MemberListInfoContext> detailedConstructors;
+ ScopedPtr<MemberListInfoContext> detailedMethods;
+ ScopedPtr<MemberListInfoContext> detailedRelated;
+ ScopedPtr<MemberListInfoContext> detailedVariables;
+ ScopedPtr<MemberListInfoContext> detailedProperties;
+ ScopedPtr<MemberListInfoContext> detailedEvents;
+ ScopedPtr<MemberGroupListContext> memberGroups;
ScopedPtr<AllMembersListContext> allMembersList;
ScopedPtr<ArgumentListContext> typeConstraints;
ScopedPtr<TemplateList> examples;
@@ -1556,7 +1709,7 @@ TemplateVariant ClassContext::get(const char *n) const
class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Private>
{
public:
- Private(NamespaceDef *nd) : DefinitionContext(nd) , m_namespaceDef(nd)
+ Private(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>(nd) , m_namespaceDef(nd)
{
addProperty("title",this,&Private::title);
addProperty("highlight",this,&Private::highlight);
@@ -1601,7 +1754,7 @@ TemplateVariant NamespaceContext::get(const char *n) const
class FileContext::Private : public DefinitionContext<FileContext::Private>
{
public:
- Private(FileDef *fd) : DefinitionContext(fd) , m_fileDef(fd)
+ Private(FileDef *fd) : DefinitionContext<FileContext::Private>(fd) , m_fileDef(fd)
{
addProperty("title",this,&Private::title);
addProperty("highlight",this,&Private::highlight);
@@ -1651,7 +1804,7 @@ TemplateVariant FileContext::get(const char *n) const
class DirContext::Private : public DefinitionContext<DirContext::Private>
{
public:
- Private(DirDef *dd) : DefinitionContext(dd) , m_dirDef(dd)
+ Private(DirDef *dd) : DefinitionContext<DirContext::Private>(dd) , m_dirDef(dd)
{
addProperty("title",this,&Private::title);
addProperty("highlight",this,&Private::highlight);
@@ -1702,7 +1855,7 @@ TemplateVariant DirContext::get(const char *n) const
class PageContext::Private : public DefinitionContext<PageContext::Private>
{
public:
- Private(PageDef *pd) : DefinitionContext(pd) , m_pageDef(pd)
+ Private(PageDef *pd) : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd)
{
addProperty("title",this,&Private::title);
addProperty("highlight",this,&Private::highlight);
@@ -1857,7 +2010,7 @@ TemplateVariant createLinkedText(Definition *def,const QCString &relPath,const Q
class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
public:
- Private(MemberDef *md) : DefinitionContext(md) , m_memberDef(md)
+ Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
{
addProperty("declType", this,&Private::declType);
addProperty("declArgs", this,&Private::declArgs);
@@ -1871,11 +2024,14 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
addProperty("isEnumeration", this,&Private::isEnumeration);
addProperty("isEnumValue", this,&Private::isEnumValue);
addProperty("isAnonymous", this,&Private::isAnonymous);
+ addProperty("isRelated", this,&Private::isRelated);
addProperty("hasDetails", this,&Private::hasDetails);
addProperty("exception", this,&Private::exception);
addProperty("bitfields", this,&Private::bitfields);
addProperty("initializer", this,&Private::initializer);
- addProperty("oneLineInitializer", this,&Private::oneLineInitializer);
+ addProperty("initializerAsCode", this,&Private::initializerAsCode);
+ addProperty("hasOneLineInitializer", this,&Private::hasOneLineInitializer);
+ addProperty("hasMultiLineInitializer", this,&Private::hasMultiLineInitializer);
addProperty("templateArgs", this,&Private::templateArgs);
addProperty("templateAlias", this,&Private::templateAlias);
addProperty("propertyAttrs", this,&Private::propertyAttrs);
@@ -1892,6 +2048,22 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
addProperty("labels", this,&Private::labels);
addProperty("enumBaseType", this,&Private::enumBaseType);
addProperty("enumValues", this,&Private::enumValues);
+ addProperty("paramDocs", this,&Private::paramDocs);
+ addProperty("reimplements", this,&Private::reimplements);
+ addProperty("implements", this,&Private::implements);
+ addProperty("reimplementedBy", this,&Private::reimplementedBy);
+ addProperty("implementedBy", this,&Private::implementedBy);
+ addProperty("examples", this,&Private::examples);
+ addProperty("typeConstraints", this,&Private::typeConstraints);
+ addProperty("functionQualifier", this,&Private::functionQualifier);
+ addProperty("sourceRefs", this,&Private::sourceRefs);
+ addProperty("sourceRefBys", this,&Private::sourceRefBys);
+ addProperty("hasSources", this,&Private::hasSources);
+ addProperty("sourceCode", this,&Private::sourceCode);
+ addProperty("hasCallGraph", this,&Private::hasCallGraph);
+ addProperty("callGraph", this,&Private::callGraph);
+ addProperty("hasCallerGraph", this,&Private::hasCallerGraph);
+ addProperty("callerGraph", this,&Private::callerGraph);
if (md && md->isProperty())
{
@@ -1961,6 +2133,25 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->initializer());
}
+ TemplateVariant initializerAsCode() const
+ {
+ if (!m_cache.initializerParsed)
+ {
+ QCString scopeName;
+ if (m_memberDef->getClassDef())
+ {
+ scopeName = m_memberDef->getClassDef()->name();
+ }
+ else if (m_memberDef->getNamespaceDef())
+ {
+ scopeName = m_memberDef->getNamespaceDef()->name();
+ }
+ m_cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(),
+ m_memberDef->initializer());
+ m_cache.initializerParsed = TRUE;
+ }
+ return m_cache.initializer;
+ }
TemplateVariant isDefine() const
{
return m_memberDef->isDefine();
@@ -1970,14 +2161,22 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
QCString name = m_memberDef->name();
return !name.isEmpty() && name.at(0)=='@';
}
+ TemplateVariant isRelated() const
+ {
+ return m_memberDef->isRelated();
+ }
TemplateVariant enumBaseType() const
{
return m_memberDef->enumBaseType();
}
- TemplateVariant oneLineInitializer() const
+ TemplateVariant hasOneLineInitializer() const
{
return m_memberDef->hasOneLineInitializer();
}
+ TemplateVariant hasMultiLineInitializer() const
+ {
+ return m_memberDef->hasMultiLineInitializer();
+ }
TemplateVariant enumValues() const
{
if (!m_cache.enumValues)
@@ -1987,23 +2186,27 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
m_cache.enumValues.reset(new MemberListContext(ml));
}
+ else
+ {
+ m_cache.enumValues.reset(new MemberListContext);
+ }
}
- if (m_cache.enumValues)
- {
- return m_cache.enumValues.get();
- }
- else
- {
- return FALSE;
- }
+ return m_cache.enumValues.get();
}
TemplateVariant templateArgs() const
{
- if (!m_cache.templateArgs)
+ if (!m_cache.templateArgs && m_memberDef->templateArguments())
{
m_cache.templateArgs.reset(new ArgumentListContext(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
}
- return m_cache.templateArgs.get();
+ if (m_cache.templateArgs)
+ {
+ return m_cache.templateArgs.get();
+ }
+ else
+ {
+ return TemplateVariant(FALSE);
+ }
}
TemplateVariant templateAlias() const
{
@@ -2056,15 +2259,12 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
m_cache.arguments.reset(new ArgumentListContext(defArgList,m_memberDef,relPathAsString()));
}
+ else
+ {
+ m_cache.arguments.reset(new ArgumentListContext);
+ }
}
- if (m_cache.arguments)
- {
- return m_cache.arguments.get();
- }
- else
- {
- return FALSE;
- }
+ return m_cache.arguments.get();
}
TemplateVariant hasParameterList() const
{
@@ -2109,8 +2309,6 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
if (tal->count()>0)
{
ArgumentListContext *al = new ArgumentListContext(tal,m_memberDef,relPathAsString());
- // since a TemplateVariant does take ownership of the object, we add it
- // a separate list just to be able to delete it and avoid a memory leak
m_cache.templateArgList.append(al);
tl->append(al);
}
@@ -2118,7 +2316,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
}
else
{
- if (cd && !m_memberDef->isTemplateSpecialization())
+ if (cd && !m_memberDef->isRelated() && !m_memberDef->isTemplateSpecialization())
{
QList<ArgumentList> tempParamLists;
cd->getTemplateParameterLists(tempParamLists);
@@ -2130,8 +2328,6 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
if (tal->count()>0)
{
ArgumentListContext *al = new ArgumentListContext(tal,m_memberDef,relPathAsString());
- // since a TemplateVariant does take ownership of the object, we add it
- // a separate list just to be able to delete it and avoid a memory leak
m_cache.templateArgList.append(al);
tl->append(al);
}
@@ -2141,8 +2337,6 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
ArgumentListContext *al = new ArgumentListContext(
m_memberDef->templateArguments(),m_memberDef,relPathAsString());
- // since a TemplateVariant does take ownership of the object, we add it
- // a separate list just to be able to delete it and avoid a memory leak
m_cache.templateArgList.append(al);
tl->append(al);
}
@@ -2156,14 +2350,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
addTemplateDecls(tl);
m_cache.templateDecls.reset(tl);
}
- if (m_cache.templateDecls)
- {
- return m_cache.templateDecls.get();
- }
- else
- {
- return TemplateVariant(FALSE);
- }
+ return m_cache.templateDecls.get();
}
TemplateVariant labels() const
{
@@ -2171,37 +2358,354 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
QStrList sl;
m_memberDef->getLabels(sl,m_memberDef->getOuterScope());
+ TemplateList *tl = new TemplateList;
if (sl.count()>0)
{
- TemplateList *tl = new TemplateList;
QStrListIterator it(sl);
for (;it.current();++it)
{
tl->append(*it);
}
- m_cache.labels.reset(tl);
+ }
+ m_cache.labels.reset(tl);
+ }
+ return m_cache.labels.get();
+ }
+ TemplateVariant paramDocs() const
+ {
+ if (!m_cache.paramDocs)
+ {
+ if (m_memberDef->argumentList() && m_memberDef->argumentList()->hasDocumentation())
+ {
+ QCString paramDocs;
+ ArgumentListIterator ali(*m_memberDef->argumentList());
+ Argument *a;
+ // convert the parameter documentation into a list of @param commands
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (a->hasDocumentation())
+ {
+ QCString direction = extractDirection(a->docs);
+ paramDocs+="@param"+direction+" "+a->name+" "+a->docs;
+ }
+ }
+ m_cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef,
+ m_memberDef->docFile(),m_memberDef->docLine(),
+ relPathAsString(),paramDocs,FALSE)));
+ }
+ else
+ {
+ m_cache.paramDocs.reset(new TemplateVariant(""));
+ }
+ }
+ return *m_cache.paramDocs;
+ }
+ TemplateVariant implements() const
+ {
+ if (!m_cache.implements)
+ {
+ MemberDef *md = m_memberDef->reimplements();
+ m_cache.implements.reset(new TemplateList);
+ if (md)
+ {
+ ClassDef *cd = md->getClassDef();
+ if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
+ {
+ MemberContext *mc = new MemberContext(md);
+ m_cache.implementsMember.reset(mc);
+ m_cache.implements->append(mc);
+ }
+ }
+ }
+ return m_cache.implements.get();
+ }
+ TemplateVariant reimplements() const
+ {
+ if (!m_cache.reimplements)
+ {
+ MemberDef *md = m_memberDef->reimplements();
+ m_cache.reimplements.reset(new TemplateList);
+ if (md)
+ {
+ ClassDef *cd = md->getClassDef();
+ if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
+ {
+ MemberContext *mc = new MemberContext(md);
+ m_cache.reimplementsMember.reset(mc);
+ m_cache.reimplements->append(mc);
+ }
+ }
+ }
+ return m_cache.reimplements.get();
+ }
+ TemplateVariant implementedBy() const
+ {
+ if (!m_cache.implementedBy)
+ {
+ MemberList *ml = m_memberDef->reimplementedBy();
+ m_cache.implementedBy.reset(new TemplateList);
+ if (ml)
+ {
+ MemberListIterator mli(*ml);
+ MemberDef *md=0;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ ClassDef *cd = md->getClassDef();
+ if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
+ {
+ MemberContext *mc = new MemberContext(md);
+ m_cache.implementedByMembers.append(mc);
+ m_cache.implementedBy->append(mc);
+ }
+ }
+ }
+ }
+ return m_cache.implementedBy.get();
+ }
+ TemplateVariant reimplementedBy() const
+ {
+ if (!m_cache.reimplementedBy)
+ {
+ m_cache.reimplementedBy.reset(new TemplateList);
+ MemberList *ml = m_memberDef->reimplementedBy();
+ if (ml)
+ {
+ MemberListIterator mli(*ml);
+ MemberDef *md=0;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ ClassDef *cd = md->getClassDef();
+ if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
+ {
+ MemberContext *mc = new MemberContext(md);
+ m_cache.reimplementedByMembers.append(mc);
+ m_cache.reimplementedBy->append(mc);
+ }
+ }
}
}
- if (m_cache.labels)
+ return m_cache.reimplementedBy.get();
+ }
+ void addExamples(TemplateList *list) const
+ {
+ if (m_memberDef->hasExamples())
{
- return m_cache.labels.get();
+ ExampleSDict::Iterator it(*m_memberDef->getExamples());
+ Example *ex;
+ for (it.toFirst();(ex=it.current());++it)
+ {
+ TemplateStruct *s = new TemplateStruct;
+ m_cache.exampleList.append(s);
+ s->set("text",ex->name);
+ s->set("isLinkable",TRUE);
+ s->set("anchor",ex->anchor);
+ s->set("fileName",ex->file);
+ list->append(s);
+ }
+ }
+ }
+ TemplateVariant examples() const
+ {
+ if (!m_cache.examples)
+ {
+ TemplateList *exampleList = new TemplateList;
+ addExamples(exampleList);
+ m_cache.examples.reset(exampleList);
+ }
+ return m_cache.examples.get();
+ }
+ TemplateVariant typeConstraints() const
+ {
+ if (!m_cache.typeConstraints && m_memberDef->typeConstraints())
+ {
+ m_cache.typeConstraints.reset(new ArgumentListContext(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
}
else
{
- return TemplateVariant(FALSE);
+ m_cache.typeConstraints.reset(new ArgumentListContext);
+ }
+ return m_cache.typeConstraints.get();
+ }
+ TemplateVariant functionQualifier() const
+ {
+ if (!m_memberDef->isObjCMethod() &&
+ (m_memberDef->isFunction() || m_memberDef->isSlot() ||
+ m_memberDef->isPrototype() || m_memberDef->isSignal()
+ )
+ )
+ {
+ return "()";
+ }
+ else
+ {
+ return "";
+ }
+ }
+ TemplateVariant sourceRefs() const
+ {
+ if (!m_cache.sourceRefs)
+ {
+ m_cache.sourceRefs.reset(new MemberListContext(m_memberDef->getReferencesMembers(),TRUE));
+ }
+ return m_cache.sourceRefs.get();
+ }
+ TemplateVariant sourceRefBys() const
+ {
+ if (!m_cache.sourceRefBys)
+ {
+ m_cache.sourceRefBys.reset(new MemberListContext(m_memberDef->getReferencedByMembers(),TRUE));
+ }
+ return m_cache.sourceRefBys.get();
+ }
+ TemplateVariant hasSources() const
+ {
+ return TemplateVariant(m_memberDef->hasSources());
+ }
+ TemplateVariant sourceCode() const
+ {
+ if (!m_cache.sourceCodeParsed)
+ {
+ QCString codeFragment;
+ FileDef *fd = m_memberDef->getBodyDef();
+ int startLine = m_memberDef->getStartBodyLine();
+ int endLine = m_memberDef->getEndBodyLine();
+ if (fd && readCodeFragment(fd->absFilePath(),
+ startLine,endLine,codeFragment)
+ )
+ {
+ QCString scopeName;
+ if (m_memberDef->getClassDef())
+ {
+ scopeName = m_memberDef->getClassDef()->name();
+ }
+ else if (m_memberDef->getNamespaceDef())
+ {
+ scopeName = m_memberDef->getNamespaceDef()->name();
+ }
+ m_cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE);
+ m_cache.sourceCodeParsed = TRUE;
+ }
+ }
+ return m_cache.sourceCode;
+ }
+ DotCallGraph *getCallGraph() const
+ {
+ if (!m_cache.callGraph)
+ {
+ m_cache.callGraph.reset(new DotCallGraph(m_memberDef,FALSE));
+ }
+ return m_cache.callGraph.get();
+ }
+ TemplateVariant hasCallGraph() const
+ {
+ static bool haveDot = Config_getBool("HAVE_DOT");
+ static bool callGraph = Config_getBool("CALL_GRAPH");
+ if ((callGraph || m_memberDef->hasCallGraph()) && haveDot &&
+ (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal()))
+ {
+ DotCallGraph *cg = getCallGraph();
+ return !cg->isTooBig() && !cg->isTrivial();
+ }
+ return TemplateVariant(FALSE);
+ }
+ TemplateVariant callGraph() const
+ {
+ if (hasCallGraph().toBool())
+ {
+ DotCallGraph *cg = getCallGraph();
+ QGString result;
+ FTextStream t(&result);
+ cg->writeGraph(t,BITMAP,
+ g_globals.outputDir,
+ m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+ relPathAsString(),TRUE,g_globals.dynSectionId
+ );
+ g_globals.dynSectionId++;
+ return TemplateVariant(result.data(),TRUE);
+ }
+ else
+ {
+ return TemplateVariant("");
+ }
+ }
+ DotCallGraph *getCallerGraph() const
+ {
+ if (!m_cache.callerGraph)
+ {
+ m_cache.callerGraph.reset(new DotCallGraph(m_memberDef,TRUE));
+ }
+ return m_cache.callerGraph.get();
+ }
+ TemplateVariant hasCallerGraph() const
+ {
+ static bool haveDot = Config_getBool("HAVE_DOT");
+ static bool callerGraph = Config_getBool("CALLER_GRAPH");
+ if ((callerGraph || m_memberDef->hasCallerGraph()) && haveDot &&
+ (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal()))
+ {
+ DotCallGraph *cg = getCallerGraph();
+ return !cg->isTooBig() && !cg->isTrivial();
+ }
+ return TemplateVariant(FALSE);
+ }
+ TemplateVariant callerGraph() const
+ {
+ if (hasCallerGraph().toBool())
+ {
+ DotCallGraph *cg = getCallerGraph();
+ QGString result;
+ FTextStream t(&result);
+ cg->writeGraph(t,BITMAP,
+ g_globals.outputDir,
+ m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+ relPathAsString(),TRUE,g_globals.dynSectionId
+ );
+ g_globals.dynSectionId++;
+ return TemplateVariant(result.data(),TRUE);
+ }
+ else
+ {
+ return TemplateVariant("");
}
}
private:
MemberDef *m_memberDef;
struct Cachable
{
+ Cachable() : initializerParsed(FALSE), sourceCodeParsed(FALSE)
+ {
+ implementedByMembers.setAutoDelete(TRUE);
+ reimplementedByMembers.setAutoDelete(TRUE);
+ templateArgList.setAutoDelete(TRUE);
+ exampleList.setAutoDelete(TRUE);
+ }
ScopedPtr<ArgumentListContext> templateArgs;
ScopedPtr<ArgumentListContext> arguments;
ScopedPtr<MemberListContext> enumValues;
ScopedPtr<ClassContext> classDef;
ScopedPtr<TemplateList> templateDecls;
+ ScopedPtr<TemplateVariant> paramDocs;
+ ScopedPtr<TemplateList> implements;
+ ScopedPtr<MemberContext> implementsMember;
+ ScopedPtr<TemplateList> reimplements;
+ ScopedPtr<MemberContext> reimplementsMember;
+ ScopedPtr<TemplateList> implementedBy;
+ ScopedPtr<MemberListContext> sourceRefs;
+ ScopedPtr<MemberListContext> sourceRefBys;
+ ScopedPtr<DotCallGraph> callGraph;
+ ScopedPtr<DotCallGraph> callerGraph;
+ QList<MemberContext> implementedByMembers;
+ ScopedPtr<TemplateList> reimplementedBy;
+ QList<MemberContext> reimplementedByMembers;
QList<ArgumentListContext> templateArgList;
ScopedPtr<TemplateList> labels;
+ TemplateVariant initializer;
+ bool initializerParsed;
+ TemplateVariant sourceCode;
+ bool sourceCodeParsed;
+ ScopedPtr<TemplateList> examples;
+ QList<TemplateStruct> exampleList;
+ ScopedPtr<ArgumentListContext> typeConstraints;
};
mutable Cachable m_cache;
TemplateList m_propertyAttrs;
@@ -2232,7 +2736,7 @@ TemplateVariant MemberContext::get(const char *n) const
class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
{
public:
- Private(GroupDef *gd) : DefinitionContext(gd) , m_groupDef(gd)
+ Private(GroupDef *gd) : DefinitionContext<ModuleContext::Private>(gd) , m_groupDef(gd)
{
addProperty("title",this,&Private::title);
addProperty("highlight",this,&Private::highlight);
@@ -4004,6 +4508,11 @@ class MemberListContext::Private : public GenericNodeListContext<MemberContext>
}
};
+MemberListContext::MemberListContext()
+{
+ p = new Private;
+}
+
MemberListContext::MemberListContext(const MemberList *list)
{
p = new Private;
@@ -4021,6 +4530,24 @@ MemberListContext::MemberListContext(const MemberList *list)
}
}
+MemberListContext::MemberListContext(MemberSDict *list,bool doSort)
+{
+ p = new Private;
+ if (list)
+ {
+ if (doSort)
+ {
+ list->sort();
+ }
+ MemberSDict::Iterator it(*list);
+ MemberDef *md;
+ for (it.toFirst();(md=it.current());++it)
+ {
+ p->addMember(md);
+ }
+ }
+}
+
MemberListContext::~MemberListContext()
{
delete p;
@@ -4158,6 +4685,11 @@ class AllMembersListContext::Private : public GenericNodeListContext<MemberInfoC
}
};
+AllMembersListContext::AllMembersListContext()
+{
+ p = new Private(0);
+}
+
AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml)
{
p = new Private(ml);
@@ -4186,19 +4718,178 @@ TemplateListIntf::ConstIterator *AllMembersListContext::createIterator() const
//------------------------------------------------------------------------
+//%% struct MemberGroupInfo: member group information
+//%% {
+class MemberGroupInfoContext::Private : public PropertyMapper
+{
+ public:
+ Private(Definition *def,const QCString &relPath,const MemberGroup *mg) :
+ m_def(def),
+ m_relPath(relPath),
+ m_memberListContext(mg->members()),
+ m_memberGroups(def,relPath,0), m_memberGroup(mg)
+ {
+ addProperty("members", this,&Private::members);
+ addProperty("title", this,&Private::groupTitle);
+ addProperty("subtitle", this,&Private::groupSubtitle);
+ addProperty("anchor", this,&Private::groupAnchor);
+ addProperty("memberGroups", this,&Private::memberGroups);
+ addProperty("docs", this,&Private::docs);
+ }
+ TemplateVariant members() const
+ {
+ return &m_memberListContext;
+ }
+ TemplateVariant groupTitle() const
+ {
+ return m_memberGroup->header();
+ }
+ TemplateVariant groupSubtitle() const
+ {
+ return "";
+ }
+ TemplateVariant groupAnchor() const
+ {
+ return m_memberGroup->anchor();
+ }
+ TemplateVariant memberGroups() const
+ {
+ return &m_memberGroups;
+ }
+ TemplateVariant docs() const
+ {
+ if (!m_docs)
+ {
+ QCString docs = m_memberGroup->documentation();
+ if (!docs.isEmpty())
+ {
+ m_docs.reset(new TemplateVariant(
+ parseDoc(m_def,"[@name docs]",-1, // TODO store file & line
+ m_relPath,
+ m_memberGroup->documentation()+"\n",FALSE)));
+ }
+ else
+ {
+ m_docs.reset(new TemplateVariant(""));
+ }
+ }
+ return *m_docs;
+ }
+ private:
+ Definition *m_def;
+ QCString m_relPath;
+ MemberListContext m_memberListContext;
+ MemberGroupListContext m_memberGroups;
+ const MemberGroup *m_memberGroup;
+ mutable ScopedPtr<TemplateVariant> m_docs;
+};
+//%% }
+
+MemberGroupInfoContext::MemberGroupInfoContext(Definition *def,
+ const QCString &relPath,const MemberGroup *mg)
+{
+ p = new Private(def,relPath,mg);
+}
+
+MemberGroupInfoContext::~MemberGroupInfoContext()
+{
+ delete p;
+}
+
+TemplateVariant MemberGroupInfoContext::get(const char *name) const
+{
+ return p->get(name);
+}
+
+//------------------------------------------------------------------------
+
+//%% list MemberGroupList[MemberGroupInfo] : list of member groups
+class MemberGroupListContext::Private : public GenericNodeListContext<MemberGroupInfoContext>
+{
+ public:
+ void addMemberGroup(Definition *def,const QCString &relPath,const MemberGroup *mg)
+ {
+ append(new MemberGroupInfoContext(def,relPath,mg));
+ }
+};
+
+MemberGroupListContext::MemberGroupListContext()
+{
+ p = new Private;
+}
+
+MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list)
+{
+ p = new Private;
+ if (list)
+ {
+ MemberGroupListIterator mgli(*list);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ p->addMemberGroup(def,relPath,mg);
+ }
+ }
+}
+
+MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping)
+{
+ p = new Private;
+ if (dict)
+ {
+ MemberGroupSDict::Iterator di(*dict);
+ const MemberGroup *mg;
+ for (di.toFirst();(mg=di.current());++di)
+ {
+ if (!mg->allMembersInSameSection() || !subGrouping)
+ {
+ p->addMemberGroup(def,relPath,mg);
+ }
+ }
+ }
+}
+
+MemberGroupListContext::~MemberGroupListContext()
+{
+ delete p;
+}
+
+// TemplateListIntf
+int MemberGroupListContext::count() const
+{
+ return p->count();
+}
+
+TemplateVariant MemberGroupListContext::at(int index) const
+{
+ return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *MemberGroupListContext::createIterator() const
+{
+ return p->createIterator();
+}
+
+
+//------------------------------------------------------------------------
+
//%% struct MemberListInfo: member list information
//%% {
class MemberListInfoContext::Private : public PropertyMapper
{
public:
- Private(const MemberList *ml,const QCString &title,const QCString &subtitle) :
- m_memberListContext(ml), m_memberList(ml), m_title(title), m_subtitle(subtitle)
- {
- addProperty("members", this,&Private::members);
- addProperty("title", this,&Private::title);
- addProperty("subtitle",this,&Private::subtitle);
- addProperty("anchor", this,&Private::anchor);
- // TODO: member groups
+ Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) :
+ m_memberListContext(ml),
+ m_memberGroups(def,relPath,ml ? ml->getMemberGroupList() : 0),
+ m_memberList(ml),
+ m_title(title),
+ m_subtitle(subtitle)
+ {
+ addProperty("members", this,&Private::members);
+ addProperty("title", this,&Private::title);
+ addProperty("subtitle", this,&Private::subtitle);
+ addProperty("anchor", this,&Private::anchor);
+ addProperty("memberGroups", this,&Private::memberGroups);
}
TemplateVariant members() const
{
@@ -4216,18 +4907,24 @@ class MemberListInfoContext::Private : public PropertyMapper
{
return m_memberList->listTypeAsString(m_memberList->listType());
}
+ TemplateVariant memberGroups() const
+ {
+ return &m_memberGroups;
+ }
private:
MemberListContext m_memberListContext;
+ MemberGroupListContext m_memberGroups;
const MemberList *m_memberList;
QCString m_title;
QCString m_subtitle;
};
//%% }
-MemberListInfoContext::MemberListInfoContext(const MemberList *ml,
+MemberListInfoContext::MemberListInfoContext(
+ Definition *def,const QCString &relPath,const MemberList *ml,
const QCString &title,const QCString &subtitle)
{
- p = new Private(ml,title,subtitle);
+ p = new Private(def,relPath,ml,title,subtitle);
}
MemberListInfoContext::~MemberListInfoContext()
@@ -4345,6 +5042,11 @@ class ArgumentListContext::Private : public GenericNodeListContext<ArgumentConte
}
};
+ArgumentListContext::ArgumentListContext()
+{
+ p = new Private;
+}
+
ArgumentListContext::ArgumentListContext(const ArgumentList *list,
Definition *def,const QCString &relPath)
{
diff --git a/src/context.h b/src/context.h
index 75f1579..6ae2c28 100644
--- a/src/context.h
+++ b/src/context.h
@@ -25,11 +25,15 @@ class GroupDef;
class GroupList;
struct IncludeInfo;
class MemberList;
+class MemberSDict;
class MemberDef;
struct Argument;
class ArgumentList;
class MemberNameInfoSDict;
struct MemberInfo;
+class MemberGroup;
+class MemberGroupSDict;
+class MemberGroupList;
//----------------------------------------------------
@@ -649,7 +653,9 @@ class InheritanceListContext : public TemplateListIntf
class MemberListContext : public TemplateListIntf
{
public:
+ MemberListContext();
MemberListContext(const MemberList *ml);
+ MemberListContext(MemberSDict *ml,bool doSort);
~MemberListContext();
// TemplateListIntf
@@ -664,10 +670,48 @@ class MemberListContext : public TemplateListIntf
//----------------------------------------------------
+class MemberGroupInfoContext : public TemplateStructIntf
+{
+ public:
+ MemberGroupInfoContext(Definition *def,const QCString &relPath,const MemberGroup *mg);
+ ~MemberGroupInfoContext();
+
+ // TemplateStructIntf methods
+ virtual TemplateVariant get(const char *name) const;
+
+ private:
+ class Private;
+ Private *p;
+};
+
+//----------------------------------------------------
+
+class MemberGroupListContext : public TemplateListIntf
+{
+ public:
+ MemberGroupListContext();
+ MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list);
+ MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping);
+ ~MemberGroupListContext();
+
+ // TemplateListIntf
+ virtual int count() const;
+ virtual TemplateVariant at(int index) const;
+ virtual TemplateListIntf::ConstIterator *createIterator() const;
+
+ private:
+ class Private;
+ Private *p;
+};
+
+
+//----------------------------------------------------
+
class MemberListInfoContext : public TemplateStructIntf
{
public:
- MemberListInfoContext(const MemberList *ml,const QCString &title,
+ MemberListInfoContext(Definition *def,const QCString &relPath,
+ const MemberList *ml,const QCString &title,
const QCString &subtitle=QCString());
~MemberListInfoContext();
@@ -700,6 +744,7 @@ class MemberInfoContext : public TemplateStructIntf
class AllMembersListContext : public TemplateListIntf
{
public:
+ AllMembersListContext();
AllMembersListContext(const MemberNameInfoSDict *ml);
~AllMembersListContext();
@@ -734,6 +779,7 @@ class ArgumentContext : public TemplateStructIntf
class ArgumentListContext : public TemplateListIntf
{
public:
+ ArgumentListContext();
ArgumentListContext(const ArgumentList *al,Definition *def,const QCString &relPath);
~ArgumentListContext();
diff --git a/src/definition.cpp b/src/definition.cpp
index 2c05f29..46147fc 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -1050,6 +1050,13 @@ void Definition::setBodyDef(FileDef *fd)
m_impl->body->fileDef=fd;
}
+bool Definition::hasSources() const
+{
+ return m_impl->body && m_impl->body->startLine!=-1 &&
+ m_impl->body->endLine>=m_impl->body->startLine &&
+ m_impl->body->fileDef;
+}
+
/*! Write code of this definition into the documentation */
void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
{
@@ -1057,9 +1064,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
ol.pushGeneratorState();
//printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(),
// m_startBodyLine,m_endBodyLine,m_bodyDef);
- if (inlineSources &&
- m_impl->body && m_impl->body->startLine!=-1 &&
- m_impl->body->endLine>=m_impl->body->startLine && m_impl->body->fileDef)
+ if (inlineSources && hasSources())
{
QCString codeFragment;
int actualStart=m_impl->body->startLine,actualEnd=m_impl->body->endLine;
diff --git a/src/definition.h b/src/definition.h
index 9de08fd..f444cc5 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -137,18 +137,18 @@ class Definition : public DefinitionIntf
virtual QCString getSourceAnchor() const;
/*! Returns the detailed description of this definition */
- QCString documentation() const;
-
+ virtual QCString documentation() const;
+
/*! Returns the line number at which the detailed documentation was found. */
int docLine() const;
- /*! Returns the file in which the detailed documentation block was found.
+ /*! Returns the file in which the detailed documentation block was found.
* This can differ from getDefFileName().
*/
QCString docFile() const;
/*! Returns the brief description of this definition. This can include commands. */
- QCString briefDescription(bool abbreviate=FALSE) const;
+ virtual QCString briefDescription(bool abbreviate=FALSE) const;
/*! Returns a plain text version of the brief description suitable for use
* as a tool tip.
@@ -259,6 +259,7 @@ class Definition : public DefinitionIntf
MemberSDict *getReferencedByMembers() const;
bool hasSections() const;
+ bool hasSources() const;
/** returns TRUE if this class has a brief description */
bool hasBriefDescription() const;
diff --git a/src/htmlgen.h b/src/htmlgen.h
index 6fb168b..366027d 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -282,7 +282,7 @@ class HtmlGenerator : public OutputGenerator
//{ t << "<tr><td valign=\"top\"><em>"; }
{ t << "<tr><td class=\"fieldname\"><em>"; }
void endDescTableTitle()
- { t << "</em>&nbsp;</td>"; }
+ { t << "</em>&#160;</td>"; }
void startDescTableData()
//{ t << "<td>" << endl; }
{ t << "<td class=\"fielddoc\">" << endl; }
diff --git a/src/markdown.cpp b/src/markdown.cpp
index eb5a2a2..ac824f4 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -1974,6 +1974,9 @@ static QCString processBlocks(const QCString &s,int indent)
end++;
}
+#if 0 // commented out, since starting with a comment block is probably a usage error
+ // see also http://stackoverflow.com/q/20478611/784672
+
// special case when the documentation starts with a code block
// since the first line is skipped when looking for a code block later on.
if (end>codeBlockIndent && isCodeBlock(data,0,end,blockIndent))
@@ -1982,6 +1985,7 @@ static QCString processBlocks(const QCString &s,int indent)
end=i+1;
pi=-1;
}
+#endif
// process each line
while (i<size)
@@ -2288,9 +2292,13 @@ void MarkdownFileParser::parseInput(const char *fileName,
QCString titleFn = QFileInfo(fileName).baseName().utf8();
QCString fn = QFileInfo(fileName).fileName().utf8();
static QCString mdfileAsMainPage = Config_getString("USE_MDFILE_AS_MAINPAGE");
- if (id.isEmpty()) id = markdownFileNameToId(fileName);
+ if (id.isEmpty()) id = markdownFileNameToId(fileName);
if (title.isEmpty()) title = titleFn;
- if (fn==mdfileAsMainPage)
+ if (!mdfileAsMainPage.isEmpty() &&
+ (fn==mdfileAsMainPage || // name reference
+ QFileInfo(fileName).absFilePath()==
+ QFileInfo(mdfileAsMainPage).absFilePath()) // file reference with path
+ )
{
docs.prepend("@mainpage\n");
}
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 2059341..5d88d4a 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -449,27 +449,6 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
ol.docify("> ");
}
-QCString extractDirection(QCString &docs)
-{
- QRegExp re("\\[[^\\]]+\\]"); // [...]
- int l=0;
- if (re.match(docs,0,&l)==0)
- {
- int inPos = docs.find("in", 1,FALSE);
- int outPos = docs.find("out",1,FALSE);
- bool input = inPos!=-1 && inPos<l;
- bool output = outPos!=-1 && outPos<l;
- if (input || output) // in,out attributes
- {
- docs = docs.mid(l); // strip attributes
- if (input && output) return "[in,out]";
- else if (input) return "[in]";
- else if (output) return "[out]";
- }
- }
- return QCString();
-}
-
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
@@ -4985,3 +4964,33 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
}
}
+QCString MemberDef::briefDescription(bool abbr) const
+{
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->briefDescription(abbr);
+ }
+ else
+ {
+ return Definition::briefDescription(abbr);
+ }
+}
+
+QCString MemberDef::documentation() const
+{
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->documentation();
+ }
+ else
+ {
+ return Definition::documentation();
+ }
+}
+
+const ArgumentList *MemberDef::typeConstraints() const
+{
+ return m_impl->typeConstraints;
+}
+
+
diff --git a/src/memberdef.h b/src/memberdef.h
index aa17798..926906c 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -245,6 +245,14 @@ class MemberDef : public Definition
QCString getDeclType() const;
void getLabels(QStrList &sl,Definition *container) const;
+ const ArgumentList *typeConstraints() const;
+
+ // overrules
+ QCString documentation() const;
+ QCString briefDescription(bool abbr=FALSE) const;
+
+
+
//-----------------------------------------------------------------------------------
// ---- setters -----
//-----------------------------------------------------------------------------------
diff --git a/src/membergroup.h b/src/membergroup.h
index 64a521b..c5a2d0c 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -61,8 +61,8 @@ class MemberGroup
MemberListType lt,
ClassDef *inheritedFrom,const QCString &inheritId);
- QCString documentation() { return doc; }
- bool allMembersInSameSection() { return inSameSection; }
+ QCString documentation() const { return doc; }
+ bool allMembersInSameSection() const { return inSameSection; }
void addToDeclarationSection();
int countDecMembers(GroupDef *gd=0);
int countDocMembers();
diff --git a/src/portable.cpp b/src/portable.cpp
index 7b78439..258c50f 100644
--- a/src/portable.cpp
+++ b/src/portable.cpp
@@ -84,7 +84,11 @@ int portable_system(const char *command,const char *args,bool commandHasConsole)
#else // Other Unices just use fork
pid = fork();
- if (pid==-1) return -1;
+ if (pid==-1)
+ {
+ perror("fork error");
+ return -1;
+ }
if (pid==0)
{
const char * argv[4];
diff --git a/src/template.cpp b/src/template.cpp
index e3eecf9..75596f2 100644
--- a/src/template.cpp
+++ b/src/template.cpp
@@ -104,8 +104,7 @@ class TemplateVariant::Private
bool boolVal;
const TemplateStructIntf *strukt;
const TemplateListIntf *list;
- FuncType func;
- const void *obj;
+ Delegate delegate;
bool raw;
};
@@ -158,12 +157,11 @@ TemplateVariant::TemplateVariant(const TemplateListIntf *l)
p->list = l;
}
-TemplateVariant::TemplateVariant(const void *obj,FuncType f)
+TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate)
{
p = new Private;
p->type = Function;
- p->func = f;
- p->obj = obj;
+ p->delegate = delegate;
}
TemplateVariant::~TemplateVariant()
@@ -184,8 +182,7 @@ TemplateVariant::TemplateVariant(const TemplateVariant &v)
case String: p->strVal = v.p->strVal; break;
case Struct: p->strukt = v.p->strukt; break;
case List: p->list = v.p->list; break;
- case Function: p->func = v.p->func;
- p->obj = v.p->obj; break;
+ case Function: p->delegate= v.p->delegate;break;
}
}
@@ -201,8 +198,7 @@ TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v)
case String: p->strVal = v.p->strVal; break;
case Struct: p->strukt = v.p->strukt; break;
case List: p->list = v.p->list; break;
- case Function: p->func = v.p->func;
- p->obj = v.p->obj; break;
+ case Function: p->delegate= v.p->delegate;break;
}
return *this;
}
@@ -305,7 +301,7 @@ const TemplateListIntf *TemplateVariant::toList() const
TemplateVariant TemplateVariant::call(const QValueList<TemplateVariant> &args)
{
- if (p->type==Function) return p->func(p->obj,args);
+ if (p->type==Function) return p->delegate(args);
return TemplateVariant();
}
@@ -766,14 +762,12 @@ class FilterDivisibleBy
public:
static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &n)
{
- printf("FilterDivisibleBy::apply()\n");
if (!v.isValid() || !n.isValid())
{
return TemplateVariant();
}
if (v.type()==TemplateVariant::Integer && n.type()==TemplateVariant::Integer)
{
- printf("FilterDivisibleBy(%d,%d)=%d",v.toInt(),n.toInt(),(v.toInt()%n.toInt())==0);
return TemplateVariant((v.toInt()%n.toInt())==0);
}
else
@@ -2045,10 +2039,13 @@ class TemplateNodeMsg : public TemplateNodeCreator<TemplateNodeMsg>
TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
TemplateEscapeIntf *escIntf = ci->escapeIntf();
ci->setEscapeIntf(0); // avoid escaping things we send to standard out
+ bool enable = ci->spacelessEnabled();
+ ci->enableSpaceless(FALSE);
FTextStream ts(stdout);
m_nodes.render(ts,c);
ts << endl;
ci->setEscapeIntf(escIntf);
+ ci->enableSpaceless(enable);
}
private:
TemplateNodeList m_nodes;
@@ -2423,7 +2420,8 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
if (list && list->count()>0) // non-empty list
{
TreeContext childCtx(this,list,ctx->templateCtx);
- TemplateVariant children(&childCtx,renderChildrenStub);
+// TemplateVariant children(&childCtx,renderChildrenStub);
+ TemplateVariant children(TemplateVariant::Delegate::fromFunction(&childCtx,renderChildrenStub));
children.setRaw(TRUE);
c->set("children",children);
m_treeNodes.render(ss,c);
diff --git a/src/template.h b/src/template.h
index f5598f1..22dca13 100644
--- a/src/template.h
+++ b/src/template.h
@@ -26,7 +26,7 @@ class TemplateEngine;
* When the template engine encounters a variable, it evaluates that variable and
* replaces it with the result. Variable names consist of any combination of
* alphanumeric characters and the underscore ("_").
- * Use a dot (.) to access attributes of a variable.
+ * Use a dot (.) to access attributes of a structured variable.
*
* One can modify variables for display by using \b filters, for example:
* `{{ value|default:"nothing" }}`
@@ -40,28 +40,33 @@ class TemplateEngine;
*
* Supported Django tags:
* - `for ... empty ... endfor`
- * - `if ... else ... endif`
- * - `block ... endblock`
+ * - `if ... else ... endif`
+ * - `block ... endblock`
* - `extend`
* - `include`
* - `with ... endwith`
* - `spaceless ... endspaceless`
+ * - `cycle`
+ *
+ * Extension tags:
+ * - `create` which instantiates a template and writes the result to a file.
+ * The syntax is `{% create 'filename' from 'template' %}`.
+ * - `recursetree`
+ * - `markers`
+ * - `msg` ... `endmsg`
+ * - `set`
*
* Supported Django filters:
* - `default`
* - `length`
* - `add`
- *
- * Extension tags:
- * - `create` which instantiates a template and writes the result to a file.
- * The syntax is `{% create 'filename' from 'template' %}`.
- * - `recursetree`
- * - `markers`
+ * - `divisibleby`
*
* Extension filters:
* - `stripPath`
* - `nowrap`
* - `prepend`
+ * - `append`
*
* @{
*/
@@ -70,8 +75,50 @@ class TemplateEngine;
class TemplateVariant
{
public:
- /** Signature of the callback function, used for function type variants */
- typedef TemplateVariant (*FuncType)(const void *obj, const QValueList<TemplateVariant> &args);
+ /** @brief Helper class to create a delegate that can store a function/method call. */
+ class Delegate
+ {
+ public:
+ /** Callback type to use when creating a delegate from a function. */
+ typedef TemplateVariant (*StubType)(const void *obj, const QValueList<TemplateVariant> &args);
+
+ Delegate() : m_objectPtr(0) , m_stubPtr(0) {}
+
+ /** Creates a delegate given an object. The method to call is passed as a template parameter */
+ template <class T, TemplateVariant (T::*TMethod)(const QValueList<TemplateVariant> &) const>
+ static Delegate fromMethod(const T* objectPtr)
+ {
+ Delegate d;
+ d.m_objectPtr = objectPtr;
+ d.m_stubPtr = &methodStub<T, TMethod>;
+ return d;
+ }
+ /** Creates a delegate given an object, and a plain function. */
+ static Delegate fromFunction(const void *obj,StubType func)
+ {
+ Delegate d;
+ d.m_objectPtr = obj;
+ d.m_stubPtr = func;
+ return d;
+ }
+
+ /** Invokes the function/method stored in the delegate */
+ TemplateVariant operator()(const QValueList<TemplateVariant> &args) const
+ {
+ return (*m_stubPtr)(m_objectPtr, args);
+ }
+
+ private:
+ const void* m_objectPtr;
+ StubType m_stubPtr;
+
+ template <class T, TemplateVariant (T::*TMethod)(const QValueList<TemplateVariant> &) const>
+ static TemplateVariant methodStub(const void* objectPtr, const QValueList<TemplateVariant> &args)
+ {
+ T* p = (T*)(objectPtr);
+ return (p->*TMethod)(args);
+ }
+ };
/** Types of data that can be stored in a TemplateVariant */
enum Type { None, Bool, Integer, String, Struct, List, Function };
@@ -109,13 +156,14 @@ class TemplateVariant
*/
TemplateVariant(const TemplateListIntf *l);
- /** Constructs a new variant which represents a function
- * @param[in] obj Opaque user defined pointer, which
- * is passed back when call() is invoked.
- * @param[in] func Callback function to invoke when
+ /** Constructs a new variant which represents a method call
+ * @param[in] delegate Delegate object to invoke when
* calling call() on this variant.
+ * @note Use TemplateVariant::Delegate::fromMethod() and
+ * TemplateVariant::Delegate::fromFunction() to create
+ * Delegate objects.
*/
- TemplateVariant(const void *obj,FuncType func);
+ TemplateVariant(const Delegate &delegate);
/** Destroys the Variant object */
~TemplateVariant();
@@ -167,7 +215,7 @@ class TemplateVariant
* @see setRaw()
*/
bool raw() const;
-
+
private:
class Private;
Private *p;
diff --git a/src/util.cpp b/src/util.cpp
index 202ba82..42bf819 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -8057,3 +8057,26 @@ bool classVisibleInIndex(ClassDef *cd)
return (allExternals && cd->isLinkable()) || cd->isLinkableInProject();
}
+//----------------------------------------------------------------------------
+
+QCString extractDirection(QCString &docs)
+{
+ QRegExp re("\\[[^\\]]+\\]"); // [...]
+ int l=0;
+ if (re.match(docs,0,&l)==0)
+ {
+ int inPos = docs.find("in", 1,FALSE);
+ int outPos = docs.find("out",1,FALSE);
+ bool input = inPos!=-1 && inPos<l;
+ bool output = outPos!=-1 && outPos<l;
+ if (input || output) // in,out attributes
+ {
+ docs = docs.mid(l); // strip attributes
+ if (input && output) return "[in,out]";
+ else if (input) return "[in]";
+ else if (output) return "[out]";
+ }
+ }
+ return QCString();
+}
+
diff --git a/src/util.h b/src/util.h
index 28d4a0c..23795f4 100644
--- a/src/util.h
+++ b/src/util.h
@@ -446,7 +446,7 @@ uint getUtf8Code( const QCString& s, int idx );
uint getUtf8CodeToLower( const QCString& s, int idx );
uint getUtf8CodeToUpper( const QCString& s, int idx );
-
+QCString extractDirection(QCString &docs);
#endif