📄 classdef.cpp
字号:
enumMembers.inSort(md); else enumMembers.append(md); break; case MemberDef::EnumValue: if (Config_getBool("SORT_MEMBER_DOCS")) enumValMembers.inSort(md); else enumValMembers.append(md); break; case MemberDef::Function: if (md->name()==localName() || // constructor (md->name().find('~')!=-1 && // hack to detect destructor md->name().find("operator")==-1 ) ) { constructors.append(md); } else { if (Config_getBool("SORT_MEMBER_DOCS")) functionMembers.inSort(md); else functionMembers.append(md); } break; case MemberDef::Variable: if (Config_getBool("SORT_MEMBER_DOCS")) variableMembers.inSort(md); else variableMembers.append(md); break; default: err("Unexpected member type %d found!\n",md->memberType()); } } break; } } /*************************************************/ /* insert member in the appropriate member group */ /*************************************************/ // Note: this must be done AFTER inserting the member in the // regular groups //addMemberToGroup(md,groupId); } if (md->virtualness()==Pure) { m_isAbstract=TRUE; } MemberInfo *mi = new MemberInfo((MemberDef *)md, md->protection(),md->virtualness(),FALSE); MemberNameInfo *mni=0; if ((mni=m_allMemberNameInfoSDict->find(md->name()))) { mni->append(mi); } else { mni = new MemberNameInfo(md->name()); mni->append(mi); m_allMemberNameInfoSDict->inSort(mni->memberName(),mni); }}//void ClassDef::computeMemberGroups()//{// MemberNameInfoListIterator mnili(*m_allMemberNameInfoList);// MemberNameInfo *mni;// for (;(mni=mnili.current());++mnili)// {// MemberNameInfoIterator mnii(*mni);// MemberInfo *mi;// for (mnii.toFirst();(mi=mnii.current());++mnii)// {// MemberDef *md=mi->memberDef;// MemberGroup *mg = md->getMemberGroup();// if (mg && m_memberGroupDict->find(mg->groupId())==0)// {// m_memberGroupDict->insert(mg->groupId(),mg);// m_memberGroupList->append(mg);// }// }// }//}// compute the anchors for all membersvoid ClassDef::computeAnchors(){ setAnchors('a',&pubMembers); setAnchors('b',&proMembers); setAnchors('c',&priMembers); setAnchors('d',&pubStaticMembers); setAnchors('e',&proStaticMembers); setAnchors('f',&priStaticMembers); setAnchors('g',&pubSlots); setAnchors('h',&proSlots); setAnchors('i',&priSlots); setAnchors('j',&signals); setAnchors('k',&related); setAnchors('l',&friends); setAnchors('m',&pubAttribs); setAnchors('n',&proAttribs); setAnchors('o',&priAttribs); setAnchors('p',&pubStaticAttribs); setAnchors('q',&proStaticAttribs); setAnchors('r',&priStaticAttribs); setAnchors('s',&pubTypes); setAnchors('t',&proTypes); setAnchors('u',&priTypes); setAnchors('v',&dcopMethods); setAnchors('w',&properties);}void ClassDef::distributeMemberGroupDocumentation(){ MemberGroupListIterator mgli(*m_memberGroupList); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { mg->distributeMemberGroupDocumentation(); }}// add a file name to the used files setvoid ClassDef::insertUsedFile(const char *f){ if (m_files.find(f)==-1) m_files.append(f); if (m_templateInstances) { QDictIterator<ClassDef> qdi(*m_templateInstances); ClassDef *cd; for (qdi.toFirst();(cd=qdi.current());++qdi) { cd->insertUsedFile(f); } }}static void writeInheritanceSpecifier(OutputList &ol,BaseClassDef *bcd){ if (bcd->prot!=Public || bcd->virt!=Normal) { ol.startTypewriter(); ol.docify(" ["); QStrList sl; if (bcd->prot==Protected) sl.append("protected"); else if (bcd->prot==Private) sl.append("private"); if (bcd->virt==Virtual) sl.append("virtual"); const char *s=sl.first(); while (s) { ol.docify(s); s=sl.next(); if (s) ol.docify(", "); } ol.docify("]"); ol.endTypewriter(); }}void ClassDef::setIncludeFile(FileDef *fd,const char *includeName,bool local){ //printf("ClassDef::setInclude(%p,%s,%d)\n",fd,includeName,local); if (!m_incInfo) m_incInfo=new IncludeInfo; if ((includeName && m_incInfo->includeName.isEmpty()) || (fd!=0 && m_incInfo->fileDef==0) ) { //printf("Setting file info\n"); m_incInfo->fileDef = fd; m_incInfo->includeName = includeName; m_incInfo->local = local; }}// TODO: fix this: a nested template class can have multiple outer templatesArgumentList *ClassDef::outerTemplateArguments() const{ int ti; ClassDef *pcd=0; int pi=0; if (m_tempArgs) return m_tempArgs; // find the outer most class scope while ((ti=name().find("::",pi))!=-1 && (pcd=getClass(name().left(ti)))==0 ) pi=ti+2; if (pcd) { return pcd->templateArguments(); } return 0;}static void searchTemplateSpecs(/*in*/ Definition *d, /*out*/ QList<ArgumentList> &result, /*out*/ QCString &name){ if (d->definitionType()==Definition::TypeClass) { if (d->getOuterScope()) { searchTemplateSpecs(d->getOuterScope(),result,name); } ClassDef *cd=(ClassDef *)d; if (!name.isEmpty()) name+="::"; name+=d->localName(); bool isSpecialization = d->localName().find('<')!=-1; if (cd->templateArguments()) { result.append(cd->templateArguments()); if (!isSpecialization) { name+=tempArgListToString(cd->templateArguments()); } } } else { name+=d->qualifiedName(); }}static void writeTemplateSpec(OutputList &ol,Definition *d, const QCString &type){ QList<ArgumentList> specs; QCString name; searchTemplateSpecs(d,specs,name); if (specs.count()>0) // class has template scope specifiers { ol.startSubsubsection(); QListIterator<ArgumentList> spi(specs); ArgumentList *al; for (spi.toFirst();(al=spi.current());++spi) { ol.docify("template<"); Argument *a=al->first(); while (a) { ol.docify(a->type); if (!a->name.isEmpty()) { ol.docify(" "); ol.docify(a->name); } if (a->defval.length()!=0) { ol.docify(" = "); ol.docify(a->defval); } a=al->next(); if (a) ol.docify(", "); } ol.docify(">"); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.lineBreak(); ol.popGeneratorState(); } ol.docify(type.lower()+" "+name); ol.endSubsubsection(); ol.writeString("\n"); }} // write all documentation for this classvoid ClassDef::writeDocumentation(OutputList &ol){ // write title QCString pageTitle=name().copy(); QCString pageType; ArgumentList *outerTempArgList = outerTemplateArguments(); QCString cType=compoundTypeString(); toupper(cType.at(0)); pageType+=" "; pageType+=cType; pageTitle+=pageType+" Reference"; if (outerTempArgList) pageTitle.prepend(" Template"); startFile(ol,getOutputFileBase(),name(),pageTitle); startTitle(ol,getOutputFileBase()); parseText(ol,theTranslator->trCompoundReference(name(),m_compType,outerTempArgList!=0)); endTitle(ol,getOutputFileBase(),name()); ol.startTextBlock(); //printf("Class %s brief=`%s' doc=`%s'\n",name().data(),briefDescription().data(),documentation().data()); bool exampleFlag=hasExamples(); // write brief description OutputList briefOutput(&ol); if (!briefDescription().isEmpty()) { parseDoc(briefOutput,m_defFileName,m_defLine,name(),0,briefDescription()); ol+=briefOutput; ol.writeString(" \n"); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.startTextLink(0,"_details"); if (Config_getBool("REPEAT_BRIEF") || !documentation().isEmpty() || exampleFlag ) { parseText(ol,theTranslator->trMore()); } ol.endTextLink(); ol.popGeneratorState(); ol.disable(OutputGenerator::Man); ol.newParagraph(); ol.enable(OutputGenerator::Man); } ol.writeSynopsis(); if (m_incInfo) { QCString nm=m_incInfo->includeName.isEmpty() ? (m_incInfo->fileDef ? m_incInfo->fileDef->docName().data() : "" ) : m_incInfo->includeName.data(); if (!nm.isEmpty()) { ol.startTypewriter(); ol.docify("#include "); if (m_incInfo->local) ol.docify("\""); else ol.docify("<"); ol.pushGeneratorState(); ol.disable(OutputGenerator::Html); ol.docify(nm); ol.disableAllBut(OutputGenerator::Html); ol.enable(OutputGenerator::Html); if (m_incInfo->fileDef) { ol.writeObjectLink(0,m_incInfo->fileDef->includeName(),0,nm); } else { ol.docify(nm); } ol.popGeneratorState(); if (m_incInfo->local) ol.docify("\""); else ol.docify(">"); ol.endTypewriter(); ol.newParagraph(); } } if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { Doxygen::tagFile << " <compound kind=\"" << compoundTypeString(); Doxygen::tagFile << "\">" << endl; Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl; Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << ".html</filename>" << endl; if (m_tempArgs) { ArgumentListIterator ali(*m_tempArgs); Argument *a; for (;(a=ali.current());++ali) { Doxygen::tagFile << " <templarg>" << convertToXML(a->name) << "</templarg>" << endl; } } } if (Config_getBool("CLASS_DIAGRAMS")) ol.disableAllBut(OutputGenerator::Man); // write super classes int count; if ((count=m_inherits->count())>0) { //parseText(ol,theTranslator->trInherits()+" "); QCString inheritLine = theTranslator->trInheritsList(m_inherits->count()); QRegExp marker("@[0-9]+"); int index=0,newIndex,matchLen; // now replace all markers in inheritLine with links to the classes while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1) { parseText(ol,inheritLine.mid(index,newIndex-index)); bool ok; uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok); BaseClassDef *bcd=m_inherits->at(entryIndex); if (ok && bcd) { ClassDef *cd=bcd->classDef; if (cd->isLinkable()) { if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { Doxygen::tagFile << " <base"; if (bcd->prot==Protected)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -