summaryrefslogtreecommitdiffstats
path: root/src/classdef.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/classdef.cpp')
-rw-r--r--src/classdef.cpp234
1 files changed, 175 insertions, 59 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 4c43d61..55cc8a0 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * $Id$
+ *
*
* Copyright (C) 1997-2000 by Dimitri van Heesch.
*
@@ -79,7 +79,9 @@ ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fN
fileDef=0;
usesImplClassDict=0;
usesIntfClassDict=0;
- //printf("*** New class `%s' *** \n",nm);
+ memberGroupList = new MemberGroupList;
+ memberGroupList->setAutoDelete(TRUE);
+ memberGroupDict = new MemberGroupDict(257);
}
// destroy the class definition
@@ -94,6 +96,8 @@ ClassDef::~ClassDef()
delete usesImplClassDict;
delete usesIntfClassDict;
delete incInfo;
+ delete memberGroupList;
+ delete memberGroupDict;
}
// inserts a base class in the inheritance list
@@ -112,27 +116,48 @@ void ClassDef::insertSuperClass(ClassDef *cd,Protection p,
inheritedBy->inSort(new BaseClassDef(cd,p,s,t));
}
+void ClassDef::addMemberToGroup(MemberDef *md,int groupId)
+{
+ if (groupId!=-1)
+ {
+ QCString *pGrpHeader = memberHeaderDict[groupId];
+ QCString *pDocs = memberDocDict[groupId];
+ if (pGrpHeader)
+ {
+ MemberGroup *mg = memberGroupDict->find(groupId);
+ if (mg==0)
+ {
+ mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
+ memberGroupDict->insert(groupId,mg);
+ memberGroupList->append(mg);
+ }
+ mg->insertMember(md);
+ md->setMemberGroup(mg);
+ }
+ }
+}
+
// adds new member definition to the class
-void ClassDef::insertMember(const MemberDef *md)
+void ClassDef::insertMember(MemberDef *md,int groupId)
{
- //printf("adding %s::%s\n",name(),md->name());
+ //printf("adding %s::%s\n",name().data(),md->name().data());
if (!isReference())
{
+ /*************************************************/
+ /* insert member in the appropriate member group */
+ /*************************************************/
+ addMemberToGroup(md,groupId);
+
+ /********************************************/
+ /* insert member in the declaration section */
+ /********************************************/
if (md->isRelated() && (Config::extractPrivateFlag || md->protection()!=Private))
{
related.append(md);
- if (Config::sortMembersFlag)
- relatedMembers.inSort(md);
- else
- relatedMembers.append(md);
}
else if (md->isFriend())
{
friends.append(md);
- if (Config::sortMembersFlag)
- relatedMembers.inSort(md);
- else
- relatedMembers.append(md);
}
else
{
@@ -140,34 +165,18 @@ void ClassDef::insertMember(const MemberDef *md)
{
case MemberDef::Signal:
signals.append(md);
- if (Config::sortMembersFlag)
- functionMembers.inSort(md);
- else
- functionMembers.append(md);
break;
case MemberDef::Slot:
switch (md->protection())
{
case Protected:
proSlots.append(md);
- if (Config::sortMembersFlag)
- functionMembers.inSort(md);
- else
- functionMembers.append(md);
break;
case Public:
pubSlots.append(md);
- if (Config::sortMembersFlag)
- functionMembers.inSort(md);
- else
- functionMembers.append(md);
break;
case Private:
priSlots.append(md);
- if (Config::sortMembersFlag)
- functionMembers.inSort(md);
- else
- functionMembers.append(md);
break;
}
break;
@@ -235,6 +244,57 @@ void ClassDef::insertMember(const MemberDef *md)
}
}
}
+ break;
+ }
+ }
+
+ /*******************************************************/
+ /* insert member in the detailed documentation section */
+ /*******************************************************/
+ if ((md->isRelated() &&
+ (Config::extractPrivateFlag || md->protection()!=Private)
+ ) || md->isFriend()
+ )
+ {
+ if (Config::sortMembersFlag)
+ relatedMembers.inSort(md);
+ else
+ relatedMembers.append(md);
+ }
+ else
+ {
+ switch (md->memberType())
+ {
+ case MemberDef::Signal:
+ if (Config::sortMembersFlag)
+ functionMembers.inSort(md);
+ else
+ functionMembers.append(md);
+ break;
+ case MemberDef::Slot:
+ switch (md->protection())
+ {
+ case Protected:
+ if (Config::sortMembersFlag)
+ functionMembers.inSort(md);
+ else
+ functionMembers.append(md);
+ break;
+ case Public:
+ if (Config::sortMembersFlag)
+ functionMembers.inSort(md);
+ else
+ functionMembers.append(md);
+ break;
+ case Private:
+ if (Config::sortMembersFlag)
+ functionMembers.inSort(md);
+ else
+ functionMembers.append(md);
+ break;
+ }
+ break;
+ default: // any of the other members
if (md->protection()!=Private || Config::extractPrivateFlag)
{
switch (md->memberType())
@@ -279,33 +339,51 @@ void ClassDef::insertMember(const MemberDef *md)
variableMembers.append(md);
break;
default:
- printf("Unexpected member type %d found!\n",md->memberType());
+ err("Unexpected member type %d found!\n",md->memberType());
}
}
break;
}
}
}
- // check if we should add this member in the `all members' list
- if (1 /*md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag*/)
+
+ MemberInfo *mi = new MemberInfo((MemberDef *)md,Public,Normal);
+ MemberNameInfo *mni=0;
+ if ((mni=(*allMemberNameInfoDict)[md->name()]))
+ {
+ mni->append(mi);
+ }
+ else
{
- MemberInfo *mi = new MemberInfo((MemberDef *)md,Public,Normal);
- MemberNameInfo *mni=0;
- if ((mni=(*allMemberNameInfoDict)[md->name()]))
- {
- mni->append(mi);
- }
- else
+ mni = new MemberNameInfo(md->name());
+ mni->append(mi);
+ allMemberNameInfoList->inSort(mni);
+ allMemberNameInfoDict->insert(mni->memberName(),mni);
+ }
+}
+
+
+void ClassDef::computeMemberGroups()
+{
+ MemberNameInfoListIterator mnili(*allMemberNameInfoList);
+ MemberNameInfo *mni;
+ for (;(mni=mnili.current());++mnili)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for (mnii.toFirst();(mi=mnii.current());++mnii)
{
- mni = new MemberNameInfo(md->name());
- mni->append(mi);
- allMemberNameInfoList->inSort(mni);
- allMemberNameInfoDict->insert(mni->memberName(),mni);
+ MemberDef *md=mi->memberDef;
+ MemberGroup *mg = md->getMemberGroup();
+ if (mg && memberGroupDict->find(mg->groupId())==0)
+ {
+ memberGroupDict->insert(mg->groupId(),mg);
+ memberGroupList->append(mg);
+ }
}
}
}
-
// compute the anchors for all members
void ClassDef::computeAnchors()
{
@@ -330,6 +408,12 @@ void ClassDef::computeAnchors()
setAnchors('s',&pubTypes);
setAnchors('t',&proTypes);
setAnchors('u',&priTypes);
+ //MemberGroupListIterator mgli(*memberGroupList);
+ //MemberGroup *mg;
+ //for (;(mg=mgli.current());++mgli)
+ //{
+ // mg->setAnchors();
+ //}
}
// add a file name to the used files set
@@ -598,6 +682,14 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write member groups
ol.startMemberSections();
+ // write user defined member groups
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->writeDeclarations(ol,this,0,0,0);
+ }
+
// non static public members
pubTypes.writeDeclarations(ol,this,0,0,0,theTranslator->trPublicTypes(),0);
pubMembers.writeDeclarations(ol,this,0,0,0,theTranslator->trPublicMembers(),0);
@@ -1174,10 +1266,13 @@ bool ClassDef::hasNonReferenceSuperClass()
// htmlHelp->decContentsDepth();
//}
-void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md)
+void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
{
//ol.insertMemberAlign();
- //printf("ClassName=`%s'\n",name().data());
+ //printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup);
+
+ if (inGroup && md && md->memberClass()==this) return;
+
switch(compType)
{
case Class: ol.docify("class"); break;
@@ -1193,24 +1288,45 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md)
ol.writeObjectLink(0,0,md->anchor(),cn);
}
ol.docify(" {");
- ol.endMemberItem(FALSE,0,0,FALSE); // TODO: pass correct group parameters
+ ol.endMemberItem(FALSE);
// insert members of this class
- pubMembers.writePlainDeclarations(ol,this,0,0,0);
- pubSlots.writePlainDeclarations(ol,this,0,0,0);
- signals.writePlainDeclarations(ol,this,0,0,0);
- pubStaticMembers.writePlainDeclarations(ol,this,0,0,0);
- proMembers.writePlainDeclarations(ol,this,0,0,0);
- proSlots.writePlainDeclarations(ol,this,0,0,0);
- proStaticMembers.writePlainDeclarations(ol,this,0,0,0);
- if (Config::extractPrivateFlag)
+ if (inGroup)
{
- priMembers.writePlainDeclarations(ol,this,0,0,0);
- priSlots.writePlainDeclarations(ol,this,0,0,0);
- priStaticMembers.writePlainDeclarations(ol,this,0,0,0);
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->writePlainDeclarations(ol,this,0,0,0);
+ }
+ }
+ else
+ {
+ pubTypes.writePlainDeclarations(ol,this,0,0,0);
+ pubMembers.writePlainDeclarations(ol,this,0,0,0);
+ pubAttribs.writePlainDeclarations(ol,this,0,0,0);
+ pubSlots.writePlainDeclarations(ol,this,0,0,0);
+ signals.writePlainDeclarations(ol,this,0,0,0);
+ pubStaticMembers.writePlainDeclarations(ol,this,0,0,0);
+ pubStaticAttribs.writePlainDeclarations(ol,this,0,0,0);
+ proTypes.writePlainDeclarations(ol,this,0,0,0);
+ proMembers.writePlainDeclarations(ol,this,0,0,0);
+ proAttribs.writePlainDeclarations(ol,this,0,0,0);
+ proSlots.writePlainDeclarations(ol,this,0,0,0);
+ proStaticMembers.writePlainDeclarations(ol,this,0,0,0);
+ proStaticAttribs.writePlainDeclarations(ol,this,0,0,0);
+ if (Config::extractPrivateFlag)
+ {
+ priTypes.writePlainDeclarations(ol,this,0,0,0);
+ priMembers.writePlainDeclarations(ol,this,0,0,0);
+ priAttribs.writePlainDeclarations(ol,this,0,0,0);
+ priSlots.writePlainDeclarations(ol,this,0,0,0);
+ priStaticMembers.writePlainDeclarations(ol,this,0,0,0);
+ priStaticAttribs.writePlainDeclarations(ol,this,0,0,0);
+ }
+ friends.writePlainDeclarations(ol,this,0,0,0);
+ related.writePlainDeclarations(ol,this,0,0,0);
}
- friends.writePlainDeclarations(ol,this,0,0,0);
- related.writePlainDeclarations(ol,this,0,0,0);
}
/*! a link to this class is possible within this project */