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

Added reference counting for all context objects

parent 425e64e2
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "types.h" #include "types.h"
#include "template.h" #include "template.h"
#include <qlist.h> #include <qlist.h>
#include <stdio.h>
class Definition; class Definition;
class ClassDef; class ClassDef;
...@@ -38,102 +39,190 @@ class MemberGroupList; ...@@ -38,102 +39,190 @@ class MemberGroupList;
//---------------------------------------------------- //----------------------------------------------------
class ConfigContext : public TemplateStructIntf #define DEBUG_REF 0
/** @brief Helper class to support reference counting */
#if DEBUG_REF
class RefCountedContext
{ {
public: public:
ConfigContext(); RefCountedContext(const char *className) : m_refCount(0)
~ConfigContext(); {
m_className=className;
m_insideRelease = FALSE;
}
virtual ~RefCountedContext()
{
if (!m_insideRelease) abort();
}
int addRef()
{
++s_totalCount;
printf("%p:%s::addRef()=%d\n",this,m_className.data(),m_refCount);
return ++m_refCount;
}
int release()
{
--s_totalCount;
printf("%p:%s::release()=%d\n",this,m_className.data(),m_refCount-1);
int count = --m_refCount;
if (count<=0)
{
m_insideRelease=TRUE;
delete this;
}
return count;
}
private:
int m_refCount;
QCString m_className;
bool m_insideRelease;
public:
static int s_totalCount;
};
#else // release version
class RefCountedContext
{
public:
RefCountedContext(const char *) : m_refCount(0) {}
virtual ~RefCountedContext() {}
int addRef() { return ++m_refCount; }
int release()
{
int count = --m_refCount;
if (count<=0)
{
delete this;
}
return count;
}
private:
int m_refCount;
};
#endif
//----------------------------------------------------
class ConfigContext : public RefCountedContext, public TemplateStructIntf
{
public:
static ConfigContext *alloc() { return new ConfigContext; }
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ConfigContext();
~ConfigContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class DoxygenContext : public TemplateStructIntf class DoxygenContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
DoxygenContext(); static DoxygenContext *alloc() { return new DoxygenContext; }
~DoxygenContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
DoxygenContext();
~DoxygenContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class TranslateContext : public TemplateStructIntf class TranslateContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
TranslateContext(); static TranslateContext *alloc() { return new TranslateContext; }
~TranslateContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
TranslateContext();
~TranslateContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class UsedFilesContext : public TemplateListIntf class UsedFilesContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
UsedFilesContext(ClassDef *cd); static UsedFilesContext *alloc(ClassDef *cd) { return new UsedFilesContext(cd); }
~UsedFilesContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
void addFile(FileDef *fd); void addFile(FileDef *fd);
private: private:
UsedFilesContext(ClassDef *cd);
~UsedFilesContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class IncludeInfoContext : public TemplateStructIntf class IncludeInfoContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
IncludeInfoContext(const IncludeInfo *,SrcLangExt lang); static IncludeInfoContext *alloc(const IncludeInfo *info,SrcLangExt lang)
~IncludeInfoContext(); { return new IncludeInfoContext(info,lang); }
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
IncludeInfoContext(const IncludeInfo *,SrcLangExt lang);
~IncludeInfoContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class IncludeInfoListContext : public TemplateListIntf class IncludeInfoListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang); static IncludeInfoListContext *alloc(const QList<IncludeInfo> &list,SrcLangExt lang)
~IncludeInfoListContext(); { return new IncludeInfoListContext(list,lang); }
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang);
~IncludeInfoListContext();
class Private; class Private;
Private *p; Private *p;
}; };
...@@ -141,63 +230,75 @@ class IncludeInfoListContext : public TemplateListIntf ...@@ -141,63 +230,75 @@ class IncludeInfoListContext : public TemplateListIntf
//---------------------------------------------------- //----------------------------------------------------
class ClassContext : public TemplateStructIntf class ClassContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ClassContext(ClassDef *); static ClassContext *alloc(ClassDef *cd) { return new ClassContext(cd); }
~ClassContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ClassContext(ClassDef *);
~ClassContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class NamespaceContext : public TemplateStructIntf class NamespaceContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
NamespaceContext(NamespaceDef *); static NamespaceContext *alloc(NamespaceDef *nd) { return new NamespaceContext(nd); }
~NamespaceContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
NamespaceContext(NamespaceDef *);
~NamespaceContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class FileContext : public TemplateStructIntf class FileContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
FileContext(FileDef *); static FileContext *alloc(FileDef *fd) { return new FileContext(fd); }
~FileContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
FileContext(FileDef *);
~FileContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class DirContext : public TemplateStructIntf class DirContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
DirContext(DirDef *); static DirContext *alloc(DirDef *dd) { return new DirContext(dd); }
~DirContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
DirContext(DirDef *);
~DirContext();
class Private; class Private;
Private *p; Private *p;
}; };
...@@ -205,32 +306,38 @@ class DirContext : public TemplateStructIntf ...@@ -205,32 +306,38 @@ class DirContext : public TemplateStructIntf
//---------------------------------------------------- //----------------------------------------------------
class PageContext : public TemplateStructIntf class PageContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
PageContext(PageDef *); static PageContext *alloc(PageDef *pd) { return new PageContext(pd); }
~PageContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
PageContext(PageDef *);
~PageContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class MemberContext : public TemplateStructIntf class MemberContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
MemberContext(MemberDef *); static MemberContext *alloc(MemberDef *md) { return new MemberContext(md); }
~MemberContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
MemberContext(MemberDef *);
~MemberContext();
class Private; class Private;
Private *p; Private *p;
}; };
...@@ -238,159 +345,190 @@ class MemberContext : public TemplateStructIntf ...@@ -238,159 +345,190 @@ class MemberContext : public TemplateStructIntf
//---------------------------------------------------- //----------------------------------------------------
class ModuleContext : public TemplateStructIntf class ModuleContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ModuleContext(GroupDef *); static ModuleContext *alloc(GroupDef *gd) { return new ModuleContext(gd); }
~ModuleContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ModuleContext(GroupDef *);
~ModuleContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class NestedClassListContext : public TemplateListIntf class NestedClassListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
NestedClassListContext(); static NestedClassListContext *alloc() { return new NestedClassListContext; }
~NestedClassListContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
void append(ClassDef *cd); void append(ClassDef *cd);
private: private:
NestedClassListContext();
~NestedClassListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class NestedNamespaceListContext : public TemplateListIntf class NestedNamespaceListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
NestedNamespaceListContext(); static NestedNamespaceListContext *alloc() { return new NestedNamespaceListContext; }
~NestedNamespaceListContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
void append(NamespaceDef *cd); void append(NamespaceDef *cd);
private: private:
NestedNamespaceListContext();
~NestedNamespaceListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ClassListContext : public TemplateListIntf class ClassListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
ClassListContext(); static ClassListContext *alloc() { return new ClassListContext; }
~ClassListContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ClassListContext();
~ClassListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ClassInheritanceNodeContext : public TemplateStructIntf class ClassInheritanceNodeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ClassInheritanceNodeContext(ClassDef *); static ClassInheritanceNodeContext *alloc(ClassDef *cd)
~ClassInheritanceNodeContext(); { return new ClassInheritanceNodeContext(cd); }
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
void addChildren(const BaseClassList *bcl,bool hideSuper); void addChildren(const BaseClassList *bcl,bool hideSuper);
private: private:
ClassInheritanceNodeContext(ClassDef *);
~ClassInheritanceNodeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ClassInheritanceContext : public TemplateListIntf class ClassInheritanceContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
ClassInheritanceContext(); static ClassInheritanceContext *alloc() { return new ClassInheritanceContext; }
~ClassInheritanceContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ClassInheritanceContext();
~ClassInheritanceContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ClassHierarchyContext : public TemplateStructIntf class ClassHierarchyContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ClassHierarchyContext(); static ClassHierarchyContext *alloc() { return new ClassHierarchyContext; }
~ClassHierarchyContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ClassHierarchyContext();
~ClassHierarchyContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class NestingNodeContext : public TemplateStructIntf class NestingNodeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
NestingNodeContext(const NestingNodeContext *parent, static NestingNodeContext *alloc(const NestingNodeContext *parent,Definition *def,
Definition *,int index,int level,bool addClasses); int index,int level,bool addClasses)
~NestingNodeContext(); { return new NestingNodeContext(parent,def,index,level,addClasses); }
QCString id() const; QCString id() const;
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
NestingNodeContext(const NestingNodeContext *parent,
Definition *,int index,int level,bool addClasses);
~NestingNodeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class NestingContext : public TemplateListIntf class NestingContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
NestingContext(const NestingNodeContext *parent,int level); static NestingContext *alloc(const NestingNodeContext *parent,int level)
~NestingContext(); { return new NestingContext(parent,level); }
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses); void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses);
void addClasses(const ClassSDict &clDict,bool rootOnly); void addClasses(const ClassSDict &clDict,bool rootOnly);
...@@ -398,302 +536,310 @@ class NestingContext : public TemplateListIntf ...@@ -398,302 +536,310 @@ class NestingContext : public TemplateListIntf
void addDirs(const DirList &); void addDirs(const DirList &);
void addFiles(const FileNameList &); void addFiles(const FileNameList &);
void addFiles(const FileList &); void addFiles(const FileList &);
private: private:
NestingContext(const NestingNodeContext *parent,int level);
~NestingContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ClassTreeContext : public TemplateStructIntf class ClassTreeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ClassTreeContext(); static ClassTreeContext *alloc() { return new ClassTreeContext; }
~ClassTreeContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ClassTreeContext();
~ClassTreeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class NamespaceListContext : public TemplateListIntf class NamespaceListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
NamespaceListContext(); static NamespaceListContext *alloc() { return new NamespaceListContext; }
~NamespaceListContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
NamespaceListContext();
~NamespaceListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class NamespaceTreeContext : public TemplateStructIntf class NamespaceTreeContext : public RefCountedContext, public TemplateStructIntf
{
public:
NamespaceTreeContext();
~NamespaceTreeContext();
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
private:
class Private;
Private *p;
};
//----------------------------------------------------
#if 0
class DirFileNodeContext : public TemplateStructIntf
{ {
public: public:
DirFileNodeContext(const DirFileNodeContext *parent, static NamespaceTreeContext *alloc() { return new NamespaceTreeContext; }
Definition *,int index,int level);
~DirFileNodeContext();
QCString id() const;
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
NamespaceTreeContext();
~NamespaceTreeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class DirFileContext : public TemplateListIntf class DirListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
DirFileContext(const DirFileNodeContext *parent,int level); static DirListContext *alloc() { return new DirListContext; }
~DirFileContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
void addDirs(const DirSDict &);
void addDirs(const DirList &);
void addFiles(const FileNameList &);
void addFiles(const FileList &);
private: private:
class Private;
Private *p;
};
#endif
//----------------------------------------------------
class DirListContext : public TemplateListIntf
{
public:
DirListContext(); DirListContext();
~DirListContext(); ~DirListContext();
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
private:
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class FileListContext : public TemplateListIntf class FileListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
FileListContext(); static FileListContext *alloc() { return new FileListContext; }
~FileListContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
FileListContext();
~FileListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class FileTreeContext : public TemplateStructIntf class FileTreeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
FileTreeContext(); static FileTreeContext *alloc() { return new FileTreeContext; }
~FileTreeContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
FileTreeContext();
~FileTreeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class PageNodeContext : public TemplateStructIntf class PageNodeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
PageNodeContext(PageDef *); static PageNodeContext *alloc(PageDef *pd) { return new PageNodeContext(pd); }
~PageNodeContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
PageNodeContext(PageDef *);
~PageNodeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class PageNodeListContext : public TemplateListIntf class PageNodeListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
PageNodeListContext(); static PageNodeListContext *alloc() { return new PageNodeListContext; }
~PageNodeListContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
void addPages(const PageSDict &,bool rootOnly); void addPages(const PageSDict &,bool rootOnly);
private: private:
PageNodeListContext();
~PageNodeListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class PageListContext : public TemplateStructIntf class PageListContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
PageListContext(); static PageListContext *alloc() { return new PageListContext; }
~PageListContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
PageListContext();
~PageListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class PageTreeContext : public TemplateStructIntf class PageTreeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
PageTreeContext(); static PageTreeContext *alloc() { return new PageTreeContext; }
~PageTreeContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
PageTreeContext();
~PageTreeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ModuleNodeContext : public TemplateStructIntf class ModuleNodeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ModuleNodeContext(GroupDef *); static ModuleNodeContext *alloc(GroupDef *gd) { return new ModuleNodeContext(gd); }
~ModuleNodeContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ModuleNodeContext(GroupDef *);
~ModuleNodeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ModuleListContext : public TemplateListIntf class ModuleListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
ModuleListContext(); static ModuleListContext *alloc() { return new ModuleListContext(); }
~ModuleListContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
void addModules(const GroupSDict &); void addModules(const GroupSDict &);
void addModules(const GroupList &); void addModules(const GroupList &);
private: private:
ModuleListContext();
~ModuleListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ModuleTreeContext : public TemplateStructIntf class ModuleTreeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ModuleTreeContext(); static ModuleTreeContext *alloc() { return new ModuleTreeContext(); }
~ModuleTreeContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ModuleTreeContext();
~ModuleTreeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ExampleListContext : public TemplateStructIntf class ExampleListContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ExampleListContext(); static ExampleListContext *alloc() { return new ExampleListContext(); }
~ExampleListContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ExampleListContext();
~ExampleListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class NavPathElemContext : public TemplateStructIntf class NavPathElemContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
NavPathElemContext(Definition *def); static NavPathElemContext *alloc(Definition *def) { return new NavPathElemContext(def); }
~NavPathElemContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
NavPathElemContext(Definition *def);
~NavPathElemContext();
class Private; class Private;
Private *p; Private *p;
}; };
...@@ -701,90 +847,118 @@ class NavPathElemContext : public TemplateStructIntf ...@@ -701,90 +847,118 @@ class NavPathElemContext : public TemplateStructIntf
//---------------------------------------------------- //----------------------------------------------------
class InheritanceNodeContext : public TemplateStructIntf class InheritanceNodeContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
InheritanceNodeContext(ClassDef *cd,const QCString &name); static InheritanceNodeContext *alloc(ClassDef *cd,const QCString &name)
~InheritanceNodeContext(); { return new InheritanceNodeContext(cd,name); }
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
InheritanceNodeContext(ClassDef *cd,const QCString &name);
~InheritanceNodeContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class InheritanceListContext : public TemplateListIntf class InheritanceListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
InheritanceListContext(const BaseClassList *list,bool baseClasses); static InheritanceListContext *alloc(const BaseClassList *list,bool baseClasses)
~InheritanceListContext(); { return new InheritanceListContext(list,baseClasses); }
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
InheritanceListContext(const BaseClassList *list,bool baseClasses);
~InheritanceListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class MemberListContext : public TemplateListIntf class MemberListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
MemberListContext(); static MemberListContext *alloc()
MemberListContext(const MemberList *ml); { return new MemberListContext; }
MemberListContext(MemberSDict *ml,bool doSort); static MemberListContext *alloc(const MemberList *ml)
~MemberListContext(); { return new MemberListContext(ml); }
static MemberListContext *alloc(MemberSDict *ml,bool doSort)
{ return new MemberListContext(ml,doSort); }
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
MemberListContext();
MemberListContext(const MemberList *ml);
MemberListContext(MemberSDict *ml,bool doSort);
~MemberListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class MemberGroupInfoContext : public TemplateStructIntf class MemberGroupInfoContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
MemberGroupInfoContext(Definition *def,const QCString &relPath,const MemberGroup *mg); static MemberGroupInfoContext *alloc(Definition *def,const QCString &relPath,const MemberGroup *mg)
~MemberGroupInfoContext(); { return new MemberGroupInfoContext(def,relPath,mg); }
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
MemberGroupInfoContext(Definition *def,const QCString &relPath,const MemberGroup *mg);
~MemberGroupInfoContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class MemberGroupListContext : public TemplateListIntf class MemberGroupListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
MemberGroupListContext(); static MemberGroupListContext *alloc()
MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list); { return new MemberGroupListContext; }
MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping); static MemberGroupListContext *alloc(Definition *def,const QCString &relPath,const MemberGroupList *list)
~MemberGroupListContext(); { return new MemberGroupListContext(def,relPath,list); }
static MemberGroupListContext *alloc(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping)
{ return new MemberGroupListContext(def,relPath,dict,subGrouping); }
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
MemberGroupListContext();
MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list);
MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping);
~MemberGroupListContext();
class Private; class Private;
Private *p; Private *p;
}; };
...@@ -792,123 +966,154 @@ class MemberGroupListContext : public TemplateListIntf ...@@ -792,123 +966,154 @@ class MemberGroupListContext : public TemplateListIntf
//---------------------------------------------------- //----------------------------------------------------
class MemberListInfoContext : public TemplateStructIntf class MemberListInfoContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
MemberListInfoContext(Definition *def,const QCString &relPath, static MemberListInfoContext *alloc(Definition *def,const QCString &relPath,
const MemberList *ml,const QCString &title, const MemberList *ml,const QCString &title,
const QCString &subtitle=QCString()); const QCString &subtitle=QCString())
~MemberListInfoContext(); { return new MemberListInfoContext(def,relPath,ml,title,subtitle); }
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
MemberListInfoContext(Definition *def,const QCString &relPath,
const MemberList *ml,const QCString &title,
const QCString &subtitle=QCString());
~MemberListInfoContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class MemberInfoContext : public TemplateStructIntf class MemberInfoContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
MemberInfoContext(const MemberInfo *mi); static MemberInfoContext *alloc(const MemberInfo *mi) { return new MemberInfoContext(mi); }
~MemberInfoContext();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
MemberInfoContext(const MemberInfo *mi);
~MemberInfoContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class InheritedMemberInfoContext : public TemplateStructIntf class InheritedMemberInfoContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,const QCString &title); static InheritedMemberInfoContext *alloc(ClassDef *cd,MemberList *ml,const QCString &title)
~InheritedMemberInfoContext(); { return new InheritedMemberInfoContext(cd,ml,title); }
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,const QCString &title);
~InheritedMemberInfoContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class InheritedMemberInfoListContext : public TemplateListIntf class InheritedMemberInfoListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
InheritedMemberInfoListContext(); static InheritedMemberInfoListContext *alloc() { return new InheritedMemberInfoListContext; }
void addMemberList(ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList=TRUE); void addMemberList(ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList=TRUE);
~InheritedMemberInfoListContext();
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
InheritedMemberInfoListContext();
~InheritedMemberInfoListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class AllMembersListContext : public TemplateListIntf class AllMembersListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
AllMembersListContext(); static AllMembersListContext *alloc()
AllMembersListContext(const MemberNameInfoSDict *ml); { return new AllMembersListContext; }
~AllMembersListContext(); static AllMembersListContext *alloc(const MemberNameInfoSDict *ml)
{ return new AllMembersListContext(ml); }
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
AllMembersListContext();
AllMembersListContext(const MemberNameInfoSDict *ml);
~AllMembersListContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ArgumentContext : public TemplateStructIntf class ArgumentContext : public RefCountedContext, public TemplateStructIntf
{ {
public: public:
ArgumentContext(const Argument *arg,Definition *def,const QCString &relPath); static ArgumentContext *alloc(const Argument *arg,Definition *def,const QCString &relPath)
~ArgumentContext(); { return new ArgumentContext(arg,def,relPath); }
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ArgumentContext(const Argument *arg,Definition *def,const QCString &relPath);
~ArgumentContext();
class Private; class Private;
Private *p; Private *p;
}; };
//---------------------------------------------------- //----------------------------------------------------
class ArgumentListContext : public TemplateListIntf class ArgumentListContext : public RefCountedContext, public TemplateListIntf
{ {
public: public:
ArgumentListContext(); static ArgumentListContext *alloc() { return new ArgumentListContext; }
ArgumentListContext(const ArgumentList *al,Definition *def,const QCString &relPath); static ArgumentListContext *alloc(const ArgumentList *al,Definition *def,const QCString &relPath)
~ArgumentListContext(); { return new ArgumentListContext(al,def,relPath); }
// TemplateListIntf // TemplateListIntf
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private: private:
ArgumentListContext();
ArgumentListContext(const ArgumentList *al,Definition *def,const QCString &relPath);
~ArgumentListContext();
class Private; class Private;
Private *p; Private *p;
}; };
......
...@@ -165,6 +165,7 @@ FTextStream::FTextStream( FILE *fh ) ...@@ -165,6 +165,7 @@ FTextStream::FTextStream( FILE *fh )
{ {
m_dev = new QFile; m_dev = new QFile;
((QFile *)m_dev)->open( IO_WriteOnly, fh); ((QFile *)m_dev)->open( IO_WriteOnly, fh);
m_owndev = TRUE;
} }
FTextStream::~FTextStream() FTextStream::~FTextStream()
......
...@@ -103,8 +103,8 @@ class TemplateVariant::Private ...@@ -103,8 +103,8 @@ class TemplateVariant::Private
int intVal; int intVal;
QCString strVal; QCString strVal;
bool boolVal; bool boolVal;
const TemplateStructIntf *strukt; TemplateStructIntf *strukt;
const TemplateListIntf *list; TemplateListIntf *list;
Delegate delegate; Delegate delegate;
bool raw; bool raw;
}; };
...@@ -145,17 +145,20 @@ TemplateVariant::TemplateVariant(const QCString &s,bool raw) ...@@ -145,17 +145,20 @@ TemplateVariant::TemplateVariant(const QCString &s,bool raw)
p->raw = raw; p->raw = raw;
} }
TemplateVariant::TemplateVariant(const TemplateStructIntf *s) TemplateVariant::TemplateVariant(TemplateStructIntf *s)
{ {
p = new Private; p = new Private;
p->type = Struct; p->type = Struct;
p->strukt = s; } p->strukt = s;
p->strukt->addRef();
}
TemplateVariant::TemplateVariant(const TemplateListIntf *l) TemplateVariant::TemplateVariant(TemplateListIntf *l)
{ {
p = new Private; p = new Private;
p->type = List; p->type = List;
p->list = l; p->list = l;
p->list->addRef();
} }
TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate) TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate)
...@@ -167,6 +170,8 @@ TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate) ...@@ -167,6 +170,8 @@ TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate)
TemplateVariant::~TemplateVariant() TemplateVariant::~TemplateVariant()
{ {
if (p->type==Struct) p->strukt->release();
else if (p->type==List) p->list->release();
delete p; delete p;
} }
...@@ -181,14 +186,20 @@ TemplateVariant::TemplateVariant(const TemplateVariant &v) ...@@ -181,14 +186,20 @@ TemplateVariant::TemplateVariant(const TemplateVariant &v)
case Bool: p->boolVal = v.p->boolVal; break; case Bool: p->boolVal = v.p->boolVal; break;
case Integer: p->intVal = v.p->intVal; break; case Integer: p->intVal = v.p->intVal; break;
case String: p->strVal = v.p->strVal; break; case String: p->strVal = v.p->strVal; break;
case Struct: p->strukt = v.p->strukt; break; case Struct: p->strukt = v.p->strukt; p->strukt->addRef(); break;
case List: p->list = v.p->list; break; case List: p->list = v.p->list; p->list->addRef(); break;
case Function: p->delegate= v.p->delegate;break; case Function: p->delegate= v.p->delegate;break;
} }
} }
TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v) TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v)
{ {
// assignment can change the type of the variable, so we have to be
// careful with reference counted content.
TemplateStructIntf *tmpStruct = p->type==Struct ? p->strukt : 0;
TemplateListIntf *tmpList = p->type==List ? p->list : 0;
Type tmpType = p->type;
p->type = v.p->type; p->type = v.p->type;
p->raw = v.p->raw; p->raw = v.p->raw;
switch (p->type) switch (p->type)
...@@ -197,10 +208,14 @@ TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v) ...@@ -197,10 +208,14 @@ TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v)
case Bool: p->boolVal = v.p->boolVal; break; case Bool: p->boolVal = v.p->boolVal; break;
case Integer: p->intVal = v.p->intVal; break; case Integer: p->intVal = v.p->intVal; break;
case String: p->strVal = v.p->strVal; break; case String: p->strVal = v.p->strVal; break;
case Struct: p->strukt = v.p->strukt; break; case Struct: p->strukt = v.p->strukt; p->strukt->addRef(); break;
case List: p->list = v.p->list; break; case List: p->list = v.p->list; p->list->addRef(); break;
case Function: p->delegate= v.p->delegate;break; case Function: p->delegate= v.p->delegate;break;
} }
// release overwritten reference counted values
if (tmpType==Struct && tmpStruct) tmpStruct->release();
else if (tmpType==List && tmpList ) tmpList->release();
return *this; return *this;
} }
...@@ -353,9 +368,10 @@ bool TemplateVariant::raw() const ...@@ -353,9 +368,10 @@ bool TemplateVariant::raw() const
class TemplateStruct::Private class TemplateStruct::Private
{ {
public: public:
Private() : fields(17) Private() : fields(17), refCount(0)
{ fields.setAutoDelete(TRUE); } { fields.setAutoDelete(TRUE); }
QDict<TemplateVariant> fields; QDict<TemplateVariant> fields;
int refCount;
}; };
TemplateStruct::TemplateStruct() TemplateStruct::TemplateStruct()
...@@ -368,6 +384,21 @@ TemplateStruct::~TemplateStruct() ...@@ -368,6 +384,21 @@ TemplateStruct::~TemplateStruct()
delete p; delete p;
} }
int TemplateStruct::addRef()
{
return ++p->refCount;
}
int TemplateStruct::release()
{
int count = --p->refCount;
if (count<=0)
{
delete this;
}
return count;
}
void TemplateStruct::set(const char *name,const TemplateVariant &v) void TemplateStruct::set(const char *name,const TemplateVariant &v)
{ {
TemplateVariant *pv = p->fields.find(name); TemplateVariant *pv = p->fields.find(name);
...@@ -387,6 +418,11 @@ TemplateVariant TemplateStruct::get(const char *name) const ...@@ -387,6 +418,11 @@ TemplateVariant TemplateStruct::get(const char *name) const
return v ? *v : TemplateVariant(); return v ? *v : TemplateVariant();
} }
TemplateStruct *TemplateStruct::alloc()
{
return new TemplateStruct;
}
//- Template list implementation ---------------------------------------------- //- Template list implementation ----------------------------------------------
...@@ -394,9 +430,10 @@ TemplateVariant TemplateStruct::get(const char *name) const ...@@ -394,9 +430,10 @@ TemplateVariant TemplateStruct::get(const char *name) const
class TemplateList::Private class TemplateList::Private
{ {
public: public:
Private() : index(-1) {} Private() : index(-1), refCount(0) {}
QValueList<TemplateVariant> elems; QValueList<TemplateVariant> elems;
int index; int index;
int refCount;
}; };
...@@ -410,6 +447,21 @@ TemplateList::~TemplateList() ...@@ -410,6 +447,21 @@ TemplateList::~TemplateList()
delete p; delete p;
} }
int TemplateList::addRef()
{
return ++p->refCount;
}
int TemplateList::release()
{
int count = --p->refCount;
if (count<=0)
{
delete this;
}
return count;
}
int TemplateList::count() const int TemplateList::count() const
{ {
return p->elems.count(); return p->elems.count();
...@@ -492,6 +544,11 @@ TemplateVariant TemplateList::at(int index) const ...@@ -492,6 +544,11 @@ TemplateVariant TemplateList::at(int index) const
} }
} }
TemplateList *TemplateList::alloc()
{
return new TemplateList;
}
//- Operator types ------------------------------------------------------------ //- Operator types ------------------------------------------------------------
/** @brief Class representing operators that can appear in template expressions */ /** @brief Class representing operators that can appear in template expressions */
...@@ -2156,14 +2213,14 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat> ...@@ -2156,14 +2213,14 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat>
int i, n = v.toInt(); int i, n = v.toInt();
for (i=0;i<n;i++) for (i=0;i<n;i++)
{ {
TemplateStruct s; TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
s.set("counter0", (int)i); s->set("counter0", (int)i);
s.set("counter", (int)(i+1)); s->set("counter", (int)(i+1));
s.set("revcounter", (int)(n-i)); s->set("revcounter", (int)(n-i));
s.set("revcounter0", (int)(n-i-1)); s->set("revcounter0", (int)(n-i-1));
s.set("first",i==0); s->set("first",i==0);
s.set("last", i==n-1); s->set("last", i==n-1);
c->set("repeatloop",&s); c->set("repeatloop",s.get());
// render all items for this iteration of the loop // render all items for this iteration of the loop
m_repeatNodes.render(ts,c); m_repeatNodes.render(ts,c);
} }
...@@ -2285,15 +2342,15 @@ class TemplateNodeRange : public TemplateNodeCreator<TemplateNodeRange> ...@@ -2285,15 +2342,15 @@ class TemplateNodeRange : public TemplateNodeCreator<TemplateNodeRange>
while (!done) while (!done)
{ {
// set the forloop meta-data variable // set the forloop meta-data variable
TemplateStruct s; TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
s.set("counter0", (int)index); s->set("counter0", (int)index);
s.set("counter", (int)(index+1)); s->set("counter", (int)(index+1));
s.set("revcounter", (int)(l-index)); s->set("revcounter", (int)(l-index));
s.set("revcounter0", (int)(l-index-1)); s->set("revcounter0", (int)(l-index-1));
s.set("first",index==0); s->set("first",index==0);
s.set("last", (int)index==l-1); s->set("last", (int)index==l-1);
s.set("parentloop",parentLoop ? *parentLoop : TemplateVariant()); s->set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
c->set("forloop",&s); c->set("forloop",s.get());
// set the iterator variable // set the iterator variable
c->set(m_var,i); c->set(m_var,i);
...@@ -2447,15 +2504,15 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor> ...@@ -2447,15 +2504,15 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
(it->current(v)); (it->current(v));
m_reversed ? it->toPrev() : it->toNext()) m_reversed ? it->toPrev() : it->toNext())
{ {
TemplateStruct s; TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
s.set("counter0", (int)index); s->set("counter0", (int)index);
s.set("counter", (int)(index+1)); s->set("counter", (int)(index+1));
s.set("revcounter", (int)(listSize-index)); s->set("revcounter", (int)(listSize-index));
s.set("revcounter0", (int)(listSize-index-1)); s->set("revcounter0", (int)(listSize-index-1));
s.set("first",index==0); s->set("first",index==0);
s.set("last", index==listSize-1); s->set("last", index==listSize-1);
s.set("parentloop",parentLoop ? *parentLoop : TemplateVariant()); s->set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
c->set("forloop",&s); c->set("forloop",s.get());
// add variables for this loop to the context // add variables for this loop to the context
//obj->addVariableToContext(index,m_vars,c); //obj->addVariableToContext(index,m_vars,c);
...@@ -2582,9 +2639,9 @@ class TemplateNodeBlock : public TemplateNodeCreator<TemplateNodeBlock> ...@@ -2582,9 +2639,9 @@ class TemplateNodeBlock : public TemplateNodeCreator<TemplateNodeBlock>
m_nodes.render(ss,c); // render parent of nb to string m_nodes.render(ss,c); // render parent of nb to string
} }
// add 'block.super' variable to allow access to parent block content // add 'block.super' variable to allow access to parent block content
TemplateStruct superBlock; TemplateAutoRef<TemplateStruct> superBlock(TemplateStruct::alloc());
superBlock.set("super",TemplateVariant(super.data(),TRUE)); superBlock->set("super",TemplateVariant(super.data(),TRUE));
ci->set("block",&superBlock); ci->set("block",superBlock.get());
// render the overruled block contents // render the overruled block contents
t->engine()->enterBlock(nb->m_templateName,nb->m_blockName,nb->m_line); t->engine()->enterBlock(nb->m_templateName,nb->m_blockName,nb->m_line);
nb->m_nodes.render(ts,c); nb->m_nodes.render(ts,c);
...@@ -3235,9 +3292,9 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers> ...@@ -3235,9 +3292,9 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
for (it->toFirst(); (it->current(var)) && i<entryIndex; it->toNext(),i++) {} for (it->toFirst(); (it->current(var)) && i<entryIndex; it->toNext(),i++) {}
if (ok && i==entryIndex) // found element if (ok && i==entryIndex) // found element
{ {
TemplateStruct s; TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
s.set("id",(int)i); s->set("id",(int)i);
c->set("markers",&s); c->set("markers",s.get());
c->set(m_var,var); // define local variable to hold element of list type c->set(m_var,var); // define local variable to hold element of list type
bool wasSpaceless = ci->spacelessEnabled(); bool wasSpaceless = ci->spacelessEnabled();
ci->enableSpaceless(TRUE); ci->enableSpaceless(TRUE);
......
...@@ -145,16 +145,14 @@ class TemplateVariant ...@@ -145,16 +145,14 @@ class TemplateVariant
TemplateVariant(const QCString &s,bool raw=FALSE); TemplateVariant(const QCString &s,bool raw=FALSE);
/** Constructs a new variant with a struct value \a s. /** Constructs a new variant with a struct value \a s.
* @note. Only a pointer to the struct is stored. The caller * @note. The variant will hold a reference to the object.
* is responsible to manage the memory for the struct object.
*/ */
TemplateVariant(const TemplateStructIntf *s); TemplateVariant(TemplateStructIntf *s);
/** Constructs a new variant with a list value \a l. /** Constructs a new variant with a list value \a l.
* @note. Only a pointer to the struct is stored. The caller * @note. The variant will hold a reference to the object.
* is responsible to manage the memory for the list object.
*/ */
TemplateVariant(const TemplateListIntf *l); TemplateVariant(TemplateListIntf *l);
/** Constructs a new variant which represents a method call /** Constructs a new variant which represents a method call
* @param[in] delegate Delegate object to invoke when * @param[in] delegate Delegate object to invoke when
...@@ -223,6 +221,27 @@ class TemplateVariant ...@@ -223,6 +221,27 @@ class TemplateVariant
//------------------------------------------------------------------------ //------------------------------------------------------------------------
template<class T> class TemplateAutoRef
{
public:
TemplateAutoRef(T *obj) : m_obj(obj)
{
m_obj->addRef();
}
~TemplateAutoRef()
{
m_obj->release();
}
T &operator*() const { return *m_obj; }
T *operator->() const { return m_obj; }
T *get() const { return m_obj; }
private:
T *m_obj;
};
//------------------------------------------------------------------------
/** @brief Abstract read-only interface for a context value of type list. /** @brief Abstract read-only interface for a context value of type list.
* @note The values of the list are TemplateVariants. * @note The values of the list are TemplateVariants.
*/ */
...@@ -264,26 +283,37 @@ class TemplateListIntf ...@@ -264,26 +283,37 @@ class TemplateListIntf
* @note the user should call delete on the returned pointer. * @note the user should call delete on the returned pointer.
*/ */
virtual TemplateListIntf::ConstIterator *createIterator() const = 0; virtual TemplateListIntf::ConstIterator *createIterator() const = 0;
/** Increase object's reference count */
virtual int addRef() = 0;
/** Decreases object's referenc count, destroy object if 0 */
virtual int release() = 0;
}; };
/** @brief Default implementation of a context value of type list. */ /** @brief Default implementation of a context value of type list. */
class TemplateList : public TemplateListIntf class TemplateList : public TemplateListIntf
{ {
public: public:
/** Creates a list */
TemplateList();
/** Destroys the list */
~TemplateList();
// TemplateListIntf methods // TemplateListIntf methods
virtual int count() const; virtual int count() const;
virtual TemplateVariant at(int index) const; virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const; virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef();
virtual int release();
/** Creates an instance with ref count set to 0 */
static TemplateList *alloc();
/** Appends element \a v to the end of the list */ /** Appends element \a v to the end of the list */
virtual void append(const TemplateVariant &v); virtual void append(const TemplateVariant &v);
private: private:
/** Creates a list */
TemplateList();
/** Destroys the list */
~TemplateList();
friend class TemplateListConstIterator; friend class TemplateListConstIterator;
class Private; class Private;
Private *p; Private *p;
...@@ -302,6 +332,12 @@ class TemplateStructIntf ...@@ -302,6 +332,12 @@ class TemplateStructIntf
* @param[in] name The name of the field. * @param[in] name The name of the field.
*/ */
virtual TemplateVariant get(const char *name) const = 0; virtual TemplateVariant get(const char *name) const = 0;
/** Increase object's reference count */
virtual int addRef() = 0;
/** Decreases object's referenc count, destroy object if 0 */
virtual int release() = 0;
}; };
...@@ -309,13 +345,13 @@ class TemplateStructIntf ...@@ -309,13 +345,13 @@ class TemplateStructIntf
class TemplateStruct : public TemplateStructIntf class TemplateStruct : public TemplateStructIntf
{ {
public: public:
/** Creates a struct */
TemplateStruct();
/** Destroys the struct */
virtual ~TemplateStruct();
// TemplateStructIntf methods // TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const; virtual TemplateVariant get(const char *name) const;
virtual int addRef();
virtual int release();
/** Creates an instance with ref count set to 0. */
static TemplateStruct *alloc();
/** Sets the value the field of a struct /** Sets the value the field of a struct
* @param[in] name The name of the field. * @param[in] name The name of the field.
...@@ -323,7 +359,13 @@ class TemplateStruct : public TemplateStructIntf ...@@ -323,7 +359,13 @@ class TemplateStruct : public TemplateStructIntf
*/ */
virtual void set(const char *name,const TemplateVariant &v); virtual void set(const char *name,const TemplateVariant &v);
private: private:
/** Creates a struct */
TemplateStruct();
/** Destroys the struct */
virtual ~TemplateStruct();
class Private; class Private;
Private *p; Private *p;
}; };
......
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