📄 classdef.cpp
字号:
// only for HTML ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); startFile(ol,m_memListFileName,m_memListFileName, theTranslator->trMemberList()); startTitle(ol,0); parseText(ol,name()+" "+theTranslator->trMemberList()); endTitle(ol,0,0); parseText(ol,theTranslator->trThisIsTheListOfAllMembers()); ol.writeObjectLink(getReference(),getOutputFileBase(),0,name()); parseText(ol,theTranslator->trIncludingInheritedMembers()); //ol.startItemList(); ol.writeString("<table>\n"); //MemberNameInfo *mni=m_allMemberNameInfoList->first(); MemberNameInfoSDict::Iterator mnii(*m_allMemberNameInfoSDict); MemberNameInfo *mni; for (mnii.toFirst();(mni=mnii.current());++mnii) { MemberInfo *mi=mni->first(); while (mi) { MemberDef *md=mi->memberDef; ClassDef *cd=md->getClassDef(); Protection prot = mi->prot; //printf("%s: Member %s of class %s md->protection()=%d mi->prot=%d prot=%d inherited=%d\n", // name().data(),md->name().data(),cd->name().data(),md->protection(),mi->prot,prot,mi->inherited); Specifier virt=md->virtualness(); MemberDef *rmd=md->reimplements(); while (rmd && virt==Normal) { virt = rmd->virtualness()==Normal ? Normal : Virtual; rmd = rmd->reimplements(); } if (cd && !md->name().isEmpty() && md->name()[0]!='@') { bool memberWritten=FALSE; if (cd->isLinkable() && md->isLinkable()) // create a link to the documentation { QCString name=mi->ambiguityResolutionScope+md->name(); //ol.writeListItem(); ol.writeString(" <tr bgcolor=\"#f0f0f0\"><td>"); Definition *bd = md->getGroupDef(); if (bd==0) bd=cd; ol.writeObjectLink(bd->getReference(),bd->getOutputFileBase(), md->anchor(),name); if ( md->isFunction() || md->isSignal() || md->isSlot() || (md->isFriend() && md->argsString())) ol.docify(md->argsString()); else if (md->isEnumerate()) parseText(ol," "+theTranslator->trEnumName()); else if (md->isEnumValue()) parseText(ol," "+theTranslator->trEnumValue()); else if (md->isTypedef()) ol.docify(" typedef"); else if (md->isFriend() && !strcmp(md->typeString(),"friend class")) ol.docify(" class"); //ol.writeString("\n"); ol.writeString("</td>"); memberWritten=TRUE; } else if (!Config_getBool("HIDE_UNDOC_MEMBERS")) // no documentation, // generate link to the class instead. { //ol.writeListItem(); ol.writeString(" <tr bgcolor=\"#f0f0f0\"><td>"); ol.startBold(); ol.docify(md->name()); ol.endBold(); if ( md->isFunction() || md->isSignal() || md->isSlot() ) ol.docify(md->argsString()); else if (md->isEnumerate()) parseText(ol," "+theTranslator->trEnumName()); else if (md->isEnumValue()) parseText(ol," "+theTranslator->trEnumValue()); else if (md->isTypedef()) ol.docify(" typedef"); ol.writeString(" ("); parseText(ol,theTranslator->trDefinedIn()+" "); if (cd->isLinkable()) { ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name()); } else { ol.startBold(); ol.docify(cd->name()); ol.endBold(); } ol.writeString(")"); ol.writeString("</td>"); memberWritten=TRUE; } if (memberWritten) { ol.writeString("<td>"); ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(), 0,cd->name()); ol.writeString("</td>"); ol.writeString("<td>"); } if ((prot!=Public || virt!=Normal || md->isFriend() || md->isRelated() || md->isExplicit() || md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) || md->isSignal() || md->isSlot() || md->isStatic() ) && memberWritten) { ol.startTypewriter(); ol.docify(" ["); QStrList sl; if (md->isFriend()) sl.append("friend"); else if (md->isRelated()) sl.append("related"); else { if (Config_getBool("INLINE_INFO") && md->isInline()) sl.append("inline"); if (md->isExplicit()) sl.append("explicit"); if (md->isMutable()) sl.append("mutable"); if (prot==Protected) sl.append("protected"); else if (prot==Private) sl.append("private"); if (virt==Virtual) sl.append("virtual"); else if (virt==Pure) sl.append("pure virtual"); if (md->isStatic()) sl.append("static"); if (md->isSignal()) sl.append("signal"); if (md->isSlot()) sl.append("slot"); } const char *s=sl.first(); while (s) { ol.docify(s); s=sl.next(); if (s) ol.docify(", "); } ol.docify("]"); ol.endTypewriter(); } if (memberWritten) { ol.writeString("</td>"); ol.writeString("</tr>\n"); } } mi=mni->next(); } } //ol.endItemList(); ol.writeString("</table>"); endFile(ol); ol.popGeneratorState();}// add a reference to an examplebool ClassDef::addExample(const char *anchor,const char *nameStr, const char *file){ if (m_exampleSDict && !m_exampleSDict->find(nameStr)) { Example *e=new Example; e->anchor=anchor; e->name=nameStr; e->file=file; m_exampleSDict->inSort(nameStr,e); return TRUE; } return FALSE;}// returns TRUE if this class is used in an examplebool ClassDef::hasExamples(){ if (m_exampleSDict==0) return FALSE; else return m_exampleSDict->count()>0;}void ClassDef::setTemplateArguments(ArgumentList *al){ if (al==0) return; if (!m_tempArgs) delete m_tempArgs; // delete old list if needed m_tempArgs=new ArgumentList; m_tempArgs->setAutoDelete(TRUE); ArgumentListIterator ali(*al); Argument *a; for (;(a=ali.current());++ali) { m_tempArgs->append(new Argument(*a)); }}/*! Returns \c TRUE iff this class or a class inheriting from this class * is \e not defined in an external tag file. */bool ClassDef::hasNonReferenceSuperClass(){ bool found=!isReference(); if (found) return TRUE; // we're done if this class is not a reference BaseClassListIterator bcli(*m_inheritedBy); for ( ; bcli.current() && !found ; ++bcli ) // for each super class { ClassDef *bcd=bcli.current()->classDef; // recurse into the super class branch found = found || bcd->hasNonReferenceSuperClass(); if (!found) { // look for template instances that might have non-reference super classes QDict<ClassDef> *cil = bcd->getTemplateInstances(); if (cil) { QDictIterator<ClassDef> tidi(*cil); for ( ; tidi.current() && !found ; ++tidi) // for each template instance { // recurse into the template instance branch found = found || tidi.current()->hasNonReferenceSuperClass(); } } } } return found;}/*! called from MemberDef::writeDeclaration() to (recusively) write the * definition of an annonymous struct, union or class. */void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup){ //ol.insertMemberAlign(); //printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup); //if (inGroup && md && md->getClassDef()==this) return; ol.docify(compoundTypeString()); int ri=name().findRev("::"); if (ri==-1) ri=name().length(); QCString cn=name().right(name().length()-ri-2); if (!cn.isEmpty() && cn.at(0)!='@' && md) { ol.docify(" "); if (isLinkable()) { ol.writeObjectLink(0,0,md->anchor(),cn); } else { ol.startBold(); ol.docify(cn); ol.endBold(); } } ol.docify(" {"); ol.endMemberItem(FALSE); // write user defined member groups MemberGroupListIterator mgli(*m_memberGroupList); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { mg->setInGroup(inGroup); mg->writePlainDeclarations(ol,this,0,0,0); } pubTypes.setInGroup(inGroup); pubTypes.writePlainDeclarations(ol,this,0,0,0); pubMembers.setInGroup(inGroup); pubMembers.writePlainDeclarations(ol,this,0,0,0); pubAttribs.setInGroup(inGroup); pubAttribs.writePlainDeclarations(ol,this,0,0,0); pubSlots.setInGroup(inGroup); pubSlots.writePlainDeclarations(ol,this,0,0,0); signals.setInGroup(inGroup); signals.writePlainDeclarations(ol,this,0,0,0); dcopMethods.setInGroup(inGroup); dcopMethods.writePlainDeclarations(ol,this,0,0,0); properties.setInGroup(inGroup); properties.writePlainDeclarations(ol,this,0,0,0); pubStaticMembers.setInGroup(inGroup); pubStaticMembers.writePlainDeclarations(ol,this,0,0,0); pubStaticAttribs.setInGroup(inGroup); pubStaticAttribs.writePlainDeclarations(ol,this,0,0,0); proTypes.setInGroup(inGroup); proTypes.writePlainDeclarations(ol,this,0,0,0); proMembers.setInGroup(inGroup); proMembers.writePlainDeclarations(ol,this,0,0,0); proAttribs.setInGroup(inGroup); proAttribs.writePlainDeclarations(ol,this,0,0,0); proSlots.setInGroup(inGroup); proSlots.writePlainDeclarations(ol,this,0,0,0); proStaticMembers.setInGroup(inGroup); proStaticMembers.writePlainDeclarations(ol,this,0,0,0); proStaticAttribs.setInGroup(inGroup); proStaticAttribs.writePlainDeclarations(ol,this,0,0,0); if (Config_getBool("EXTRACT_PRIVATE")) { priTypes.setInGroup(inGroup); priTypes.writePlainDeclarations(ol,this,0,0,0); priMembers.setInGroup(inGroup); priMembers.writePlainDeclarations(ol,this,0,0,0); priAttribs.setInGroup(inGroup); priAttribs.writePlainDeclarations(ol,this,0,0,0); priSlots.setInGroup(inGroup); priSlots.writePlainDeclarations(ol,this,0,0,0); priStaticMembers.setInGroup(inGroup); priStaticMembers.writePlainDeclarations(ol,this,0,0,0); priStaticAttribs.setInGroup(inGroup); priStaticAttribs.writePlainDeclarations(ol,this,0,0,0); } friends.setInGroup(inGroup); friends.writePlainDeclarations(ol,this,0,0,0); related.setInGroup(inGroup); related.writePlainDeclarations(ol,this,0,0,0); }/*! a link to this class is possible within this project */bool ClassDef::isLinkableInProject() const{ if (m_templateMaster) { return m_templateMaster->isLinkableInProject(); } else { return !name().isEmpty() && /* no name */ //m_isTemplBaseClass==-1 && /* template base class */ !m_artificial && name().find('@')==-1 && /* anonymous compound */ (m_prot!=Private || Config_getBool("EXTRACT_PRIVATE")) && /* private */ hasDocumentation() && /* documented */ !isReference() && /* not an external reference */ (!m_isStatic || Config_getBool("EXTRACT_STATIC")); }}bool ClassDef::isLinkable() const{ if (m_templateMaster) { return m_templateMaster->isLinkable(); } else { return isLinkableInProject() || isReference(); }}/*! the class is visible in a class diagram, or class hierarchy */bool ClassDef::isVisibleInHierarchy() { return // show all classes or a subclass is visible (Config_getBool("ALLEXTERNALS") || hasNonReferenceSuperClass()) && // and not an annonymous compound name().find('@')==-1 && // not an artifically introduced class !m_artificial && // and not privately inherited (m_prot!=Private || Config_getBool("EXTRACT_PRIVATE")) && // documented or shown anyway or documentation is external (hasDocumentation() || !Config_getBool("HIDE_UNDOC_CLASSES") || (m_templateMaster && m_templateMaster->hasDocumentation()) || isReference() ) && // is not part of an unnamed namespace or shown anyway (!m_isStatic || Config_getBool("EXTRACT_STATIC"));}bool ClassDef::hasDocumentation() const{ return Definition::hasDocumentation();}//----------------------------------------------------------------------// recursive function:// returns TRUE iff class definition `bcd' represents an (in)direct base // class of class definition `cd'.bool ClassDef::isBaseClass(ClassDef *bcd){ bool found=FALSE; //printf("isBaseClass(cd=%s) looking for %s\n",cd->name().data(),bcd->name().data()); BaseClassListIterator bcli(*baseClasses()); for ( ; bcli.current() && !found ; ++bcli) { ClassDef *ccd=bcli.current()->classDef; if (ccd->templateMaster()) ccd=ccd->templateMaster(); //printf("isBaseClass() baseclass %s\n",ccd->name().data()); if (ccd==bcd) found=TRUE; else found=ccd->isBaseClass(bcd); } return found;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -