groupdef.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  *
4  *
5  * Copyright (C) 1997-2015 by Dimitri van Heesch.
6  *
7  * Permission to use, copy, modify, and distribute this software and its
8  * documentation under the terms of the GNU General Public License is hereby
9  * granted. No representations are made about the suitability of this software
10  * for any purpose. It is provided "as is" without express or implied warranty.
11  * See the GNU General Public License for more details.
12  *
13  * Documents produced by Doxygen are derivative works derived from the
14  * input used in their production; they are not affected by this license.
15  *
16  */
17 
18 #include <ctype.h>
19 #include <qregexp.h>
20 #include "groupdef.h"
21 #include "classdef.h"
22 #include "filedef.h"
23 #include "classlist.h"
24 #include "outputlist.h"
25 #include "namespacedef.h"
26 #include "language.h"
27 #include "util.h"
28 #include "memberlist.h"
29 #include "message.h"
30 #include "membergroup.h"
31 #include "doxygen.h"
32 #include "pagedef.h"
33 #include "docparser.h"
34 #include "searchindex.h"
35 #include "dot.h"
36 #include "vhdldocgen.h"
37 #include "layout.h"
38 #include "arguments.h"
39 #include "entry.h"
40 #include "membername.h"
41 #include "dirdef.h"
42 #include "config.h"
43 
44 //---------------------------------------------------------------------------
45 
46 GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t,
47  const char *refFileName) : Definition(df,dl,1,na)
48 {
49  fileList = new FileList;
50  classSDict = new ClassSDict(17);
51  groupList = new GroupList;
53  pageDict = new PageSDict(17);
54  exampleDict = new PageSDict(17);
55  dirList = new DirList;
58  if (refFileName)
59  {
60  fileName=stripExtension(refFileName);
61  }
62  else
63  {
64  fileName = (QCString)"group_"+na;
65  }
66  setGroupTitle( t );
69 
71 
72  visited = 0;
73  groupScope = 0;
74  m_subGrouping=Config_getBool("SUBGROUPING");
75 }
76 
78 {
79  delete fileList;
80  delete classSDict;
81  delete groupList;
82  delete namespaceSDict;
83  delete pageDict;
84  delete exampleDict;
85  delete allMemberList;
87  delete memberGroupSDict;
88  delete dirList;
89 }
90 
91 void GroupDef::setGroupTitle( const char *t )
92 {
93  if ( t && qstrlen(t) )
94  {
95  title = t;
96  titleSet = TRUE;
97  }
98  else
99  {
100  title = name();
101  title.at(0)=toupper(title.at(0));
102  titleSet = FALSE;
103  }
104 }
105 
106 
108 {
110  MemberGroup *mg;
111  for (;(mg=mgli.current());++mgli)
112  {
114  }
115 }
116 
118 {
121  MemberGroup *mg;
122  for (;(mg=mgli.current());++mgli)
123  {
125  }
126 
128  MemberList *ml;
129  for (mli.toFirst();(ml=mli.current());++mli)
130  {
132  {
134  }
135  }
136 }
137 
138 void GroupDef::addFile(const FileDef *def)
139 {
140  static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
141  if (def->isHidden()) return;
142  updateLanguage(def);
143  if (sortBriefDocs)
144  fileList->inSort(def);
145  else
146  fileList->append(def);
147 }
148 
150 {
151  static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
152  if (cd->isHidden()) return FALSE;
153  updateLanguage(cd);
154  QCString qn = cd->name();
155  if (classSDict->find(qn)==0)
156  {
157  //printf("--- addClass %s sort=%d\n",qn.data(),sortBriefDocs);
158  if (sortBriefDocs)
159  {
160  classSDict->inSort(qn,cd);
161  }
162  else
163  {
164  int i=qn.findRev("::");
165  if (i==-1) i=qn.find('.');
166  bool found=FALSE;
167  //printf("i=%d\n",i);
168  if (i!=-1)
169  {
170  // add nested classes (e.g. A::B, A::C) after their parent (A) in
171  // order of insertion
172  QCString scope = qn.left(i);
173  int j=classSDict->findAt(scope);
174  if (j!=-1)
175  {
176  while (j<(int)classSDict->count() &&
177  classSDict->at(j)->qualifiedName().left(i)==scope)
178  {
179  //printf("skipping over %s\n",classSDict->at(j)->qualifiedName().data());
180  j++;
181  }
182  //printf("Found scope at index %d\n",j);
183  classSDict->insertAt(j,qn,cd);
184  found=TRUE;
185  }
186  }
187  if (!found) // no insertion point found -> just append
188  {
189  classSDict->append(qn,cd);
190  }
191  }
192  return TRUE;
193  }
194  return FALSE;
195 }
196 
198 {
199  static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
200  if (def->isHidden()) return FALSE;
201  updateLanguage(def);
202  if (namespaceSDict->find(def->name())==0)
203  {
204  if (sortBriefDocs)
205  namespaceSDict->inSort(def->name(),def);
206  else
207  namespaceSDict->append(def->name(),def);
208  return TRUE;
209  }
210  return FALSE;
211 }
212 
213 void GroupDef::addDir(const DirDef *def)
214 {
215  if (def->isHidden()) return;
216  if (Config_getBool("SORT_BRIEF_DOCS"))
217  dirList->inSort(def);
218  else
219  dirList->append(def);
220 }
221 
223 {
224  if (def->isHidden()) return;
225  //printf("Making page %s part of a group\n",def->name.data());
226  pageDict->append(def->name(),def);
227  def->makePartOfGroup(this);
228 }
229 
231 {
232  if (def->isHidden()) return;
233  exampleDict->append(def->name(),def);
234 }
235 
236 
238 {
240  MemberList *ml;
241  for (mli.toFirst();(ml=mli.current());++mli)
242  {
244  {
246  }
247  }
248 
249  //printf("GroupDef::addMembersToMemberGroup() memberGroupList=%d\n",memberGroupList->count());
251  MemberGroup *mg;
252  for (;(mg=mgli.current());++mgli)
253  {
254  mg->setInGroup(TRUE);
255  }
256 }
257 
258 
260 {
261  if (md->isHidden()) return FALSE;
262  updateLanguage(md);
263  //printf("GroupDef(%s)::insertMember(%s)\n", title.data(), md->name().data());
264  MemberNameInfo *mni=0;
265  if ((mni=(*allMemberNameInfoSDict)[md->name()]))
266  { // member with this name already found
267  MemberNameInfoIterator srcMnii(*mni);
268  MemberInfo *srcMi;
269  for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
270  {
271  MemberDef *srcMd = srcMi->memberDef;
272  if (srcMd==md) return FALSE; // already added before!
273 
274  bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
275  // both inside a file => definition and declaration do not have to be in the same file
278 
279  ArgumentList *srcMdAl = srcMd->argumentList();
280  ArgumentList *mdAl = md->argumentList();
281  ArgumentList *tSrcMdAl = srcMd->templateArguments();
282  ArgumentList *tMdAl = md->templateArguments();
283 
284  if (srcMd->isFunction() && md->isFunction() && // both are a function
285  ((tSrcMdAl==0 && tMdAl==0) ||
286  (tSrcMdAl!=0 && tMdAl!=0 && tSrcMdAl->count()==tMdAl->count())
287  ) && // same number of template arguments
288  matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl,
289  md->getOuterScope(),md->getFileDef(),mdAl,
290  TRUE
291  ) && // matching parameters
292  sameScope // both are found in the same scope
293  )
294  {
295  if (srcMd->getGroupAlias()==0)
296  {
297  md->setGroupAlias(srcMd);
298  }
299  else if (md!=srcMd->getGroupAlias())
300  {
301  md->setGroupAlias(srcMd->getGroupAlias());
302  }
303  return FALSE; // member is the same as one that is already added
304  }
305  }
306  mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
307  }
308  else
309  {
310  mni = new MemberNameInfo(md->name());
311  mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
313  }
314  //printf("Added member!\n");
315  allMemberList->append(md);
316  switch(md->memberType())
317  {
318  case MemberType_Variable:
319  if (!docOnly)
320  {
322  }
324  break;
325  case MemberType_Function:
326  if (!docOnly)
327  {
329  }
331  break;
332  case MemberType_Typedef:
333  if (!docOnly)
334  {
336  }
338  break;
340  if (!docOnly)
341  {
343  }
345  break;
346  case MemberType_EnumValue:
347  if (!docOnly)
348  {
350  }
352  break;
353  case MemberType_Define:
354  if (!docOnly)
355  {
357  }
359  break;
360  case MemberType_Signal:
361  if (!docOnly)
362  {
364  }
366  break;
367  case MemberType_Slot:
368  if (md->protection()==Public)
369  {
370  if (!docOnly)
371  {
373  }
375  }
376  else if (md->protection()==Protected)
377  {
378  if (!docOnly)
379  {
381  }
383  }
384  else
385  {
386  if (!docOnly)
387  {
389  }
391  }
392  break;
393  case MemberType_Event:
394  if (!docOnly)
395  {
397  }
399  break;
400  case MemberType_Property:
401  if (!docOnly)
402  {
404  }
406  break;
407  case MemberType_Friend:
408  if (!docOnly)
409  {
411  }
413  break;
414  default:
415  err("GroupDef::insertMembers(): "
416  "member `%s' (typeid=%d) with scope `%s' inserted in group scope `%s'!\n",
417  md->name().data(),md->memberType(),
418  md->getClassDef() ? md->getClassDef()->name().data() : "",
419  name().data());
420  }
421  return TRUE;
422 }
423 
425 {
426  // fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", title.data(), md->name().data());
428  if (mni)
429  {
430  MemberNameInfoIterator mnii(*mni);
431  while( mnii.current() )
432  {
433  if( mnii.current()->memberDef == md )
434  {
435  mni->remove(mnii.current());
436  break;
437  }
438  ++mnii;
439  }
440  if( mni->isEmpty() )
441  {
443  }
444 
446  switch(md->memberType())
447  {
448  case MemberType_Variable:
451  break;
452  case MemberType_Function:
455  break;
456  case MemberType_Typedef:
459  break;
463  break;
464  case MemberType_EnumValue:
467  break;
468  case MemberType_Define:
471  break;
472  case MemberType_Signal:
475  break;
476  case MemberType_Slot:
477  if (md->protection()==Public)
478  {
481  }
482  else if (md->protection()==Protected)
483  {
486  }
487  else
488  {
491  }
492  break;
493  case MemberType_Event:
496  break;
497  case MemberType_Property:
500  break;
501  case MemberType_Friend:
504  break;
505  default:
506  err("GroupDef::removeMember(): unexpected member remove in file!\n");
507  }
508  }
509 }
510 
511 bool GroupDef::findGroup(const GroupDef *def) const
512 {
513  if (this==def)
514  {
515  return TRUE;
516  }
517  else if (groupList)
518  {
520  GroupDef *gd;
521  for (;(gd=it.current());++it)
522  {
523  if (gd->findGroup(def))
524  {
525  return TRUE;
526  }
527  }
528  }
529  return FALSE;
530 }
531 
532 void GroupDef::addGroup(const GroupDef *def)
533 {
534  //printf("adding group `%s' to group `%s'\n",def->name().data(),name().data());
535  //if (Config_getBool("SORT_MEMBER_DOCS"))
536  // groupList->inSort(def);
537  //else
538  groupList->append(def);
539 }
540 
542 {
543  GroupList *groups = partOfGroups();
544  return groups!=0 && groups->count()!=0;
545 }
546 
548 {
549  return fileList->count()+
550  classSDict->count()+
552  groupList->count()+
553  allMemberList->count()+
554  pageDict->count()+
555  exampleDict->count();
556 }
557 
558 /*! Compute the HTML anchor names for all members in the group */
560 {
561  //printf("GroupDef::computeAnchors()\n");
563 }
564 
566 {
567  tagFile << " <compound kind=\"group\">" << endl;
568  tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
569  tagFile << " <title>" << convertToXML(title) << "</title>" << endl;
570  tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
573  LayoutDocEntry *lde;
574  for (eli.toFirst();(lde=eli.current());++eli)
575  {
576  switch (lde->kind())
577  {
579  {
580  if (classSDict)
581  {
583  ClassDef *cd;
584  for (ci.toFirst();(cd=ci.current());++ci)
585  {
586  if (cd->isLinkableInProject())
587  {
588  tagFile << " <class kind=\"" << cd->compoundTypeString()
589  << "\">" << convertToXML(cd->name()) << "</class>" << endl;
590  }
591  }
592  }
593  }
594  break;
596  {
597  if (namespaceSDict)
598  {
600  NamespaceDef *nd;
601  for (ni.toFirst();(nd=ni.current());++ni)
602  {
603  if (nd->isLinkableInProject())
604  {
605  tagFile << " <namespace>" << convertToXML(nd->name())
606  << "</namespace>" << endl;
607  }
608  }
609  }
610  }
611  break;
613  {
614  if (fileList)
615  {
617  FileDef *fd;
618  for (;(fd=it.current());++it)
619  {
620  if (fd->isLinkableInProject())
621  {
622  tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl;
623  }
624  }
625  }
626  }
627  break;
629  {
630  if (pageDict)
631  {
633  PageDef *pd=0;
634  for (pdi.toFirst();(pd=pdi.current());++pdi)
635  {
636  QCString pageName = pd->getOutputFileBase();
637  if (pd->isLinkableInProject())
638  {
639  tagFile << " <page>" << convertToXML(pageName) << "</page>" << endl;
640  }
641  }
642  }
643  }
644  break;
646  {
647  if (dirList)
648  {
650  DirDef *dd;
651  for (;(dd=it.current());++it)
652  {
653  if (dd->isLinkableInProject())
654  {
655  tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
656  }
657  }
658  }
659  }
660  break;
662  {
663  if (groupList)
664  {
666  GroupDef *gd;
667  for (;(gd=it.current());++it)
668  {
669  if (gd->isVisible())
670  {
671  tagFile << " <subgroup>" << convertToXML(gd->name()) << "</subgroup>" << endl;
672  }
673  }
674  }
675  }
676  break;
678  {
680  MemberList * ml = getMemberList(lmd->type);
681  if (ml)
682  {
683  ml->writeTagFile(tagFile);
684  }
685  }
686  break;
688  {
689  if (memberGroupSDict)
690  {
692  MemberGroup *mg;
693  for (;(mg=mgli.current());++mgli)
694  {
695  mg->writeTagFile(tagFile);
696  }
697  }
698  }
699  break;
700  default:
701  break;
702  }
703  }
704  writeDocAnchorsToTagFile(tagFile);
705  tagFile << " </compound>" << endl;
706 }
707 
709 {
710  if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
711  || !documentation().isEmpty() || !inbodyDocumentation().isEmpty()
712  )
713  {
714  if (pageDict->count()!=countMembers()) // not only pages -> classical layout
715  {
716  ol.pushGeneratorState();
718  ol.writeRuler();
719  ol.popGeneratorState();
720  ol.pushGeneratorState();
722  ol.writeAnchor(0,"details");
723  ol.popGeneratorState();
724  ol.startGroupHeader();
725  ol.parseText(title);
726  ol.endGroupHeader();
727  }
728 
729  // repeat brief description
730  if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
731  {
733  }
734  // write separator between brief and details
735  if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
736  !documentation().isEmpty())
737  {
738  ol.pushGeneratorState();
741  // ol.newParagraph(); // FIXME:PARA
742  ol.enableAll();
745  ol.writeString("\n\n");
746  ol.popGeneratorState();
747  }
748 
749  // write detailed documentation
750  if (!documentation().isEmpty())
751  {
752  ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
753  }
754 
755  // write inbody documentation
756  if (!inbodyDocumentation().isEmpty())
757  {
759  }
760  }
761 }
762 
764 {
765  if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
766  {
767  DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
769  if (rootNode && !rootNode->isEmpty())
770  {
771  ol.startParagraph();
772  ol.writeDoc(rootNode,this,0);
773  ol.pushGeneratorState();
775  ol.writeString(" \n");
777 
778  if (Config_getBool("REPEAT_BRIEF") ||
779  !documentation().isEmpty()
780  )
781  {
783  ol.startTextLink(0,"details");
785  ol.endTextLink();
786  }
787  ol.popGeneratorState();
788  ol.endParagraph();
789  }
790  delete rootNode;
791  }
792 }
793 
795 {
796  if (Config_getBool("HAVE_DOT") /*&& Config_getBool("GROUP_GRAPHS")*/ )
797  {
799  if (!graph.isTrivial())
800  {
801  msg("Generating dependency graph for group %s\n",qualifiedName().data());
802  ol.pushGeneratorState();
804  //ol.startParagraph();
807  ol.endGroupCollaboration(graph);
808  //ol.endParagraph();
809  ol.popGeneratorState();
810  }
811  }
812 }
813 
815 {
816  // write list of files
817  if (fileList->count()>0)
818  {
819  ol.startMemberHeader("files");
820  ol.parseText(title);
821  ol.endMemberHeader();
822  ol.startMemberList();
824  FileDef *fd;
825  for (;(fd=it.current());++it)
826  {
827  if (!fd->hasDocumentation()) continue;
831  ol.insertMemberAlign();
832  ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
833  ol.endMemberItem();
834  if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
835  {
839  }
840  ol.endMemberDeclaration(0,0);
841  }
842  ol.endMemberList();
843  }
844 }
845 
847 {
848  // write list of namespaces
849  namespaceSDict->writeDeclaration(ol,title);
850 }
851 
853 {
854  // write list of groups
855  int count=0;
856  if (groupList->count()>0)
857  {
859  GroupDef *gd;
860  for (;(gd=it.current());++it)
861  {
862  if (gd->isVisible()) count++;
863  }
864  }
865  if (count>0)
866  {
867  ol.startMemberHeader("groups");
868  ol.parseText(title);
869  ol.endMemberHeader();
870  ol.startMemberList();
871  if (Config_getBool("SORT_GROUP_NAMES"))
872  {
873  groupList->sort();
874  }
876  GroupDef *gd;
877  for (;(gd=it.current());++it)
878  {
879  if (gd->isVisible())
880  {
881  if (!gd->hasDocumentation()) continue;
884  //ol.docify(theTranslator->trGroup(FALSE,TRUE));
885  //ol.docify(" ");
886  ol.insertMemberAlign();
888  ol.endMemberItem();
889  if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
890  {
894  }
895  ol.endMemberDeclaration(0,0);
896  }
897  }
898  ol.endMemberList();
899  }
900 }
901 
903 {
904  // write list of directories
905  if (dirList->count()>0)
906  {
907  ol.startMemberHeader("dirs");
908  ol.parseText(title);
909  ol.endMemberHeader();
910  ol.startMemberList();
912  DirDef *dd;
913  for (;(dd=it.current());++it)
914  {
915  if (!dd->hasDocumentation()) continue;
919  ol.insertMemberAlign();
921  ol.endMemberItem();
922  if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
923  {
927  }
928  ol.endMemberDeclaration(0,0);
929  }
930 
931  ol.endMemberList();
932  }
933 }
934 
936 {
937  // write list of classes
938  classSDict->writeDeclaration(ol,0,title,FALSE);
939 }
940 
942 {
944 }
945 
947 {
948  PageDef *pd=0;
950  for (pdi.toFirst();(pd=pdi.current());++pdi)
951  {
952  if (!pd->isReference())
953  {
954  SectionInfo *si=0;
955  if (!pd->title().isEmpty() && !pd->name().isEmpty() &&
956  (si=Doxygen::sectionDict->find(pd->name()))!=0)
957  {
959  ol.docify(si->title);
961  }
962  ol.startTextBlock();
963  ol.generateDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,0,TRUE,FALSE);
964  ol.endTextBlock();
965  }
966  }
967 }
968 
970 {
971  /* write user defined member groups */
972  if (memberGroupSDict)
973  {
975  /* write user defined member groups */
977  MemberGroup *mg;
978  for (;(mg=mgli.current());++mgli)
979  {
980  mg->writeDeclarations(ol,0,0,0,this);
981  }
982  }
983 }
984 
986 {
987  ol.startMemberSections();
988 }
989 
991 {
992  ol.endMemberSections();
993 }
994 
996 {
997  //printf("** GroupDef::startMemberDocumentation()\n");
998  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
999  {
1000  ol.pushGeneratorState();
1003  }
1004 }
1005 
1007 {
1008  //printf("** GroupDef::endMemberDocumentation()\n");
1009  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
1010  {
1011  ol.popGeneratorState();
1013  }
1014 }
1015 
1017 {
1018  // write Author section (Man only)
1019  ol.pushGeneratorState();
1021  ol.startGroupHeader();
1023  ol.endGroupHeader();
1025  ol.popGeneratorState();
1026 }
1027 
1029 {
1030  ol.pushGeneratorState();
1034  LayoutDocEntry *lde;
1035  bool first=TRUE;
1036  SrcLangExt lang = getLanguage();
1037  for (eli.toFirst();(lde=eli.current());++eli)
1038  {
1041  (lde->kind()==LayoutDocEntry::GroupFiles && fileList->count()>0) ||
1043  (lde->kind()==LayoutDocEntry::GroupDirs && dirList->count()>0)
1044  )
1045  {
1047  QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
1048  lde->kind()==LayoutDocEntry::GroupNamespaces ? "namespaces" :
1049  lde->kind()==LayoutDocEntry::GroupFiles ? "files" :
1050  lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" :
1051  "dirs";
1052  ol.writeSummaryLink(0,label,ls->title(lang),first);
1053  first=FALSE;
1054  }
1055  else if (lde->kind()==LayoutDocEntry::MemberDecl)
1056  {
1058  MemberList * ml = getMemberList(lmd->type);
1059  if (ml && ml->declVisible())
1060  {
1061  ol.writeSummaryLink(0,MemberList::listTypeAsString(ml->listType()),lmd->title(lang),first);
1062  first=FALSE;
1063  }
1064  }
1065  }
1066  if (!first)
1067  {
1068  ol.writeString(" </div>\n");
1069  }
1070  ol.popGeneratorState();
1071 }
1072 
1074 {
1075  //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
1076  ol.pushGeneratorState();
1078 
1079  ol.startHeaderSection();
1080  writeSummaryLinks(ol);
1082  ol.pushGeneratorState();
1084  ol.parseText(title);
1085  ol.popGeneratorState();
1086  addGroupListToTitle(ol,this);
1087  ol.pushGeneratorState();
1090  ol.popGeneratorState();
1091  ol.pushGeneratorState();
1094  ol.parseText(title);
1095  ol.popGeneratorState();
1096  ol.endHeaderSection();
1097  ol.startContents();
1098 
1100  {
1102  static QRegExp we("[a-zA-Z_][-a-zA-Z_0-9]*");
1103  int i=0,p=0,l=0;
1104  while ((i=we.match(title,p,&l))!=-1) // foreach word in the title
1105  {
1107  p=i+l;
1108  }
1109  }
1110 
1112 
1113  //---------------------------------------- start flexible part -------------------------------
1114 
1115  SrcLangExt lang=getLanguage();
1118  LayoutDocEntry *lde;
1119  for (eli.toFirst();(lde=eli.current());++eli)
1120  {
1121  switch (lde->kind())
1122  {
1125  break;
1128  break;
1130  {
1132  writeClasses(ol,ls->title(lang));
1133  }
1134  break;
1136  {
1137  writeInlineClasses(ol);
1138  }
1139  break;
1141  {
1143  writeNamespaces(ol,ls->title(lang));
1144  }
1145  break;
1147  writeMemberGroups(ol);
1148  break;
1150  {
1152  writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
1153  }
1154  break;
1157  break;
1159  {
1161  writeDetailedDescription(ol,ls->title(lang));
1162  }
1163  break;
1166  break;
1168  {
1170  writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
1171  }
1172  break;
1175  break;
1177  {
1179  writeNestedGroups(ol,ls->title(lang));
1180  }
1181  break;
1184  break;
1186  {
1188  writeDirs(ol,ls->title(lang));
1189  }
1190  break;
1192  {
1194  writeFiles(ol,ls->title(lang));
1195  }
1196  break;
1198  writeGroupGraph(ol);
1199  break;
1201  writeAuthorSection(ol);
1202  break;
1225  err("Internal inconsistency: member %d should not be part of "
1226  "LayoutDocManager::Group entry list\n",lde->kind());
1227  break;
1228  }
1229  }
1230 
1231  //---------------------------------------- end flexible part -------------------------------
1232 
1233  endFile(ol);
1234 
1235  ol.popGeneratorState();
1236 
1237  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
1238  {
1239  allMemberList->sort();
1240  writeMemberPages(ol);
1241  }
1242 
1243 }
1244 
1246 {
1247  ol.pushGeneratorState();
1249 
1251  MemberList *ml;
1252  for (mli.toFirst();(ml=mli.current());++mli)
1253  {
1255  {
1256  ml->writeDocumentationPage(ol,name(),this);
1257  }
1258  }
1259 
1260  ol.popGeneratorState();
1261 }
1262 
1264 {
1265  static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
1266 
1267  ol.writeString(" <div class=\"navtab\">\n");
1268  ol.writeString(" <table>\n");
1269 
1271  MemberDef *md;
1272  for (mli.toFirst();(md=mli.current());++mli)
1273  {
1274  if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
1275  {
1276  ol.writeString(" <tr><td class=\"navtab\">");
1277  if (md->isLinkableInProject())
1278  {
1279  if (md==currentMd) // selected item => highlight
1280  {
1281  ol.writeString("<a class=\"qindexHL\" ");
1282  }
1283  else
1284  {
1285  ol.writeString("<a class=\"qindex\" ");
1286  }
1287  ol.writeString("href=\"");
1288  if (createSubDirs) ol.writeString("../../");
1290  ol.writeString("\">");
1291  ol.writeString(convertToHtml(md->localName()));
1292  ol.writeString("</a>");
1293  }
1294  ol.writeString("</td></tr>\n");
1295  }
1296  }
1297 
1298  ol.writeString(" </table>\n");
1299  ol.writeString(" </div>\n");
1300 }
1301 
1302 
1303 
1304 //---- helper functions ------------------------------------------------------
1305 
1307 {
1308  QListIterator<Grouping> gli(*root->groups);
1309  Grouping *g;
1310  for (;(g=gli.current());++gli)
1311  {
1312  GroupDef *gd=0;
1313  if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
1314  {
1315  if (gd->addClass(cd))
1316  {
1317  cd->makePartOfGroup(gd);
1318  }
1319  //printf("Compound %s: in group %s\n",cd->name().data(),gd->groupTitle());
1320  }
1321  }
1322 }
1323 
1325 {
1326  //printf("root->groups->count()=%d\n",root->groups->count());
1327  QListIterator<Grouping> gli(*root->groups);
1328  Grouping *g;
1329  for (;(g=gli.current());++gli)
1330  {
1331  GroupDef *gd=0;
1332  //printf("group `%s'\n",s->data());
1333  if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
1334  {
1335  if (gd->addNamespace(nd)) nd->makePartOfGroup(gd);
1336  //printf("Namespace %s: in group %s\n",nd->name().data(),s->data());
1337  }
1338  }
1339 }
1340 
1341 void addDirToGroups(Entry *root,DirDef *dd)
1342 {
1343  //printf("*** root->groups->count()=%d\n",root->groups->count());
1344  QListIterator<Grouping> gli(*root->groups);
1345  Grouping *g;
1346  for (;(g=gli.current());++gli)
1347  {
1348  GroupDef *gd=0;
1349  //printf("group `%s'\n",g->groupname.data());
1350  if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
1351  {
1352  gd->addDir(dd);
1353  dd->makePartOfGroup(gd);
1354  //printf("Dir %s: in group %s\n",dd->name().data(),g->groupname.data());
1355  }
1356  }
1357 }
1358 
1359 void addGroupToGroups(Entry *root,GroupDef *subGroup)
1360 {
1361  //printf("addGroupToGroups for %s groups=%d\n",root->name.data(),
1362  // root->groups?root->groups->count():-1);
1363  QListIterator<Grouping> gli(*root->groups);
1364  Grouping *g;
1365  for (;(g=gli.current());++gli)
1366  {
1367  GroupDef *gd=0;
1368  if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
1369  {
1370  if (gd==subGroup)
1371  {
1372  warn(root->fileName,root->startLine,"Refusing to add group %s to itself",
1373  gd->name().data());
1374  }
1375  else if (subGroup->findGroup(gd))
1376  {
1377  warn(root->fileName,root->startLine,"Refusing to add group %s to group %s, since the latter is already a "
1378  "subgroup of the former\n", subGroup->name().data(),gd->name().data());
1379  }
1380  else if (!gd->findGroup(subGroup))
1381  {
1382  gd->addGroup(subGroup);
1383  subGroup->makePartOfGroup(gd);
1384  }
1385  }
1386  }
1387 }
1388 
1389 /*! Add a member to the group with the highest priority */
1391 {
1392  //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%d\n",
1393  // root, root->name.data(), md, md->name().data(), root->groups->count() );
1394  QListIterator<Grouping> gli(*root->groups);
1395  Grouping *g;
1396 
1397  // Search entry's group list for group with highest pri.
1399  GroupDef *fgd=0;
1400  for (;(g=gli.current());++gli)
1401  {
1402  GroupDef *gd=0;
1403  if (!g->groupname.isEmpty() &&
1404  (gd=Doxygen::groupSDict->find(g->groupname)) &&
1405  g->pri >= pri)
1406  {
1407  if (fgd && gd!=fgd && g->pri==pri)
1408  {
1409  warn(root->fileName.data(), root->startLine,
1410  "Member %s found in multiple %s groups! "
1411  "The member will be put in group %s, and not in group %s",
1412  md->name().data(), Grouping::getGroupPriName( pri ),
1413  gd->name().data(), fgd->name().data()
1414  );
1415  }
1416 
1417  fgd = gd;
1418  pri = g->pri;
1419  }
1420  }
1421  //printf("fgd=%p\n",fgd);
1422 
1423  // put member into group defined by this entry?
1424  if (fgd)
1425  {
1426  GroupDef *mgd = md->getGroupDef();
1427  //printf("mgd=%p\n",mgd);
1428  bool insertit = FALSE;
1429  if (mgd==0)
1430  {
1431  insertit = TRUE;
1432  }
1433  else if (mgd!=fgd)
1434  {
1435  bool moveit = FALSE;
1436 
1437  // move member from one group to another if
1438  // - the new one has a higher priority
1439  // - the new entry has the same priority, but with docs where the old one had no docs
1440  if (md->getGroupPri()<pri)
1441  {
1442  moveit = TRUE;
1443  }
1444  else
1445  {
1446  if (md->getGroupPri()==pri)
1447  {
1448  if (!root->doc.isEmpty() && !md->getGroupHasDocs())
1449  {
1450  moveit = TRUE;
1451  }
1452  else if (!root->doc.isEmpty() && md->getGroupHasDocs())
1453  {
1455  "Member documentation for %s found several times in %s groups!\n"
1456  "%s:%d: The member will remain in group %s, and won't be put into group %s",
1457  md->name().data(), Grouping::getGroupPriName( pri ),
1458  root->fileName.data(), root->startLine,
1459  mgd->name().data(),
1460  fgd->name().data()
1461  );
1462  }
1463  }
1464  }
1465 
1466  if (moveit)
1467  {
1468  //printf("removeMember\n");
1469  mgd->removeMember(md);
1470  insertit = TRUE;
1471  }
1472  }
1473 
1474  if (insertit)
1475  {
1476  //printf("insertMember found at %s line %d: %s: related %s\n",
1477  // md->getDefFileName().data(),md->getDefLine(),
1478  // md->name().data(),root->relates.data());
1479  bool success = fgd->insertMember(md);
1480  if (success)
1481  {
1482  //printf("insertMember successful\n");
1483  md->setGroupDef(fgd,pri,root->fileName,root->startLine,
1484  !root->doc.isEmpty());
1486  if (cd)
1487  {
1488  cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
1489  }
1490  }
1491  }
1492  }
1493 }
1494 
1495 
1497 {
1498  QListIterator<Grouping> gli(*root->groups);
1499  Grouping *g;
1500  for (;(g=gli.current());++gli)
1501  {
1502  GroupDef *gd=0;
1503  if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
1504  {
1505  gd->addExample(eg);
1506  eg->makePartOfGroup(gd);
1507  //printf("Example %s: in group %s\n",eg->name().data(),s->data());
1508  }
1509  }
1510 }
1511 
1513 {
1514  if (isReference())
1515  {
1516  return fileName;
1517  }
1518  else
1519  {
1520  return convertNameToFile(fileName);
1521  }
1522 }
1523 
1525 {
1526  {
1527  QList<ListItemInfo> *xrefItems = xrefListItems();
1528  addRefItem(xrefItems,
1531  getOutputFileBase(),name(),
1532  0,
1533  0
1534  );
1535  }
1537  MemberGroup *mg;
1538  for (;(mg=mgli.current());++mgli)
1539  {
1540  mg->addListReferences(this);
1541  }
1543  MemberList *ml;
1544  for (mli.toFirst();(ml=mli.current());++mli)
1545  {
1547  {
1548  ml->addListReferences(this);
1549  }
1550  }
1551 }
1552 
1554 {
1557  MemberList *ml;
1558  for (mli.toFirst();(ml=mli.current());++mli)
1559  {
1560  if (ml->listType()==lt)
1561  {
1562  return ml;
1563  }
1564  }
1565  // not found, create a new member list
1566  ml = new MemberList(lt);
1567  m_memberLists.append(ml);
1568  ml->setInGroup(TRUE);
1569  return ml;
1570 }
1571 
1573 {
1574  static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
1575  static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
1576  MemberList *ml = createMemberList(lt);
1577  ml->setNeedsSorting(
1578  ((ml->listType()&MemberListType_declarationLists) && sortBriefDocs) ||
1579  ((ml->listType()&MemberListType_documentationLists) && sortMemberDocs));
1580  ml->append(md);
1581 }
1582 
1584 {
1586  MemberList *ml;
1587  for (;(ml=mli.current());++mli)
1588  {
1589  if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
1590  }
1591 }
1592 
1594 {
1596  MemberList *ml;
1597  for (;(ml=mli.current());++mli)
1598  {
1599  if (ml->listType()==lt)
1600  {
1601  return ml;
1602  }
1603  }
1604  return 0;
1605 }
1606 
1608 {
1609  static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
1610 
1611  MemberList * ml = getMemberList(lt);
1612  if (optimizeVhdl && ml)
1613  {
1614  VhdlDocGen::writeVhdlDeclarations(ml,ol,this,0,0,0);
1615  return;
1616  }
1617  if (ml)
1618  {
1619  ml->writeDeclarations(ol,0,0,0,this,title,0);
1620  }
1621 }
1622 
1624 {
1625  MemberList * ml = getMemberList(lt);
1626  if (ml) ml->writeDocumentation(ol,name(),this,title);
1627 }
1628 
1630 {
1631  MemberList *ml = getMemberList(lt);
1632  if (ml) ml->remove(md);
1633 }
1634 
1636 {
1637  groupList->sort();
1638 }
1639 
1641 {
1642  return !isReference() && isLinkable();
1643 }
1644 
1646 {
1647  return hasUserDocumentation();
1648 }
1649 
1650 // let the "programming language" for a group depend on what is inserted into it.
1651 // First item that has an associated languages determines the language for the whole group.
1653 {
1655  {
1656  setLanguage(d->getLanguage());
1657  }
1658 }
1659 
1661 {
1662  static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
1663  return ((!briefDescription().isEmpty() && repeatBrief) ||
1664  !documentation().isEmpty());
1665 }
1666 
void writeMemberPages(OutputList &ol)
Definition: groupdef.cpp:1245
void writeFiles(OutputList &ol, const QCString &title)
Definition: groupdef.cpp:814
Definition: types.h:61
QCString convertToXML(const char *s)
Definition: util.cpp:5717
void startMemberItem(const char *anchor, int i1, const char *id=0)
Definition: outputlist.h:218
void writeRuler()
Definition: outputlist.h:240
void endMemberDeclaration(const char *anchor, const char *inheritId)
Definition: outputlist.h:314
MemberListType listType() const
Definition: memberlist.h:38
static GroupSDict * groupSDict
Definition: doxygen.h:119
QCString docFile() const
void append(const MemberDef *md)
Definition: memberlist.cpp:246
void setAnchors(MemberList *ml)
Definition: util.cpp:2254
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
Definition: index.cpp:263
bool isLinkable() const
Definition: groupdef.cpp:1645
void endMemberItem()
Definition: outputlist.h:220
This class represents an function or template argument list.
Definition: arguments.h:82
void endGroupHeader(int extraLevels=0)
Definition: outputlist.h:178
NamespaceSDict * namespaceSDict
Definition: groupdef.h:144
ClassSDict * classSDict
Definition: groupdef.h:143
bool isLinkableInProject() const
Definition: classdef.cpp:2707
static QCString scope
Definition: declinfo.cpp:668
bool visited
Definition: groupdef.h:86
bool matchArguments2(Definition *srcScope, FileDef *srcFileScope, ArgumentList *srcAl, Definition *dstScope, FileDef *dstFileScope, ArgumentList *dstAl, bool checkCV)
Definition: util.cpp:3647
bool m_subGrouping
Definition: groupdef.h:157
virtual QCString trFile(bool first_capital, bool singular)=0
void addDirToGroups(Entry *root, DirDef *dd)
Definition: groupdef.cpp:1341
virtual QCString getReference() const
void writePageDocumentation(OutputList &ol)
Definition: groupdef.cpp:946
void inSort(const char *key, const T *d)
Definition: sortdict.h:197
const QCString & shortName() const
Definition: dirdef.h:57
static constexpr double g
Definition: Units.h:144
bool isEmpty() const
Definition: qcstring.h:189
The QRegExp class provides pattern matching using regular expressions or wildcards.
Definition: qregexp.h:46
void startFile(OutputList &ol, const char *name, const char *manName, const char *title, HighlightedItem hli, bool additionalIndices, const char *altSidebarName)
Definition: index.cpp:244
QCString convertNameToFile(const char *name, bool allowDots=FALSE) const
void msg(const char *fmt,...)
Definition: message.cpp:107
QCString title() const
Definition: pagedef.h:54
Grouping::GroupPri_t getGroupPri() const
Definition: memberdef.cpp:4100
uint length() const
Definition: qcstring.h:195
void startGroupCollaboration()
Definition: outputlist.h:398
DirList * dirList
Definition: groupdef.h:148
void append(const type *d)
Definition: qlist.h:73
void addMemberToGroups(Entry *root, MemberDef *md)
Definition: groupdef.cpp:1390
Definition: entry.h:63
Protection protection() const
Definition: memberdef.cpp:4120
QList< ListItemInfo > * xrefListItems() const
Definition: types.h:26
static QCString htmlFileExtension
Definition: doxygen.h:130
void writeTagFile(FTextStream &)
void endHeaderSection()
Definition: outputlist.h:192
void writeString(const char *text)
Definition: outputlist.h:119
MemberListType type
Definition: layout.h:96
bool generateDoc(const char *fileName, int startLine, Definition *ctx, MemberDef *md, const QCString &docStr, bool indexWords, bool isExample, const char *exampleName=0, bool singleLine=FALSE, bool linkFromIndex=FALSE)
Definition: outputlist.cpp:131
void writeGroupGraph(OutputList &ol)
Definition: groupdef.cpp:794
QCString inbodyDocumentation() const
void setLanguage(SrcLangExt lang)
MemberList * createMemberList(MemberListType lt)
Definition: groupdef.cpp:1553
void disableAllBut(OutputGenerator::OutputType o)
Definition: outputlist.cpp:49
char & at(uint i) const
Definition: qcstring.h:326
virtual QCString trCollaborationDiagram(const char *clName)=0
void startParagraph()
Definition: outputlist.h:115
void endTitleHead(const char *fileName, const char *name)
Definition: outputlist.h:107
QCString compoundTypeString() const
Definition: classdef.cpp:3499
QCString fileName
Definition: groupdef.h:141
virtual bool hasDocumentation() const
void addExampleToGroups(Entry *root, PageDef *eg)
Definition: groupdef.cpp:1496
void addNamespaceToGroups(Entry *root, NamespaceDef *nd)
Definition: groupdef.cpp:1324
QCString title(SrcLangExt lang) const
Definition: layout.cpp:1459
void setAutoDelete(bool val)
Definition: sortdict.h:545
void writeDocumentation(OutputList &ol, const char *scopeName, Definition *container, const char *title, bool showEnumValues=FALSE, bool showInline=FALSE)
Definition: memberlist.cpp:655
void findSectionsInDocumentation()
Definition: groupdef.cpp:117
bool isLinkableInProject() const
Definition: groupdef.cpp:1640
const bool FALSE
Definition: qglobal.h:370
friend class Iterator
Definition: sortdict.h:598
void startHeaderSection()
Definition: outputlist.h:190
static LayoutDocManager & instance()
Definition: layout.cpp:1359
def graph(desc, maker=maker)
Definition: apa.py:294
QCString label
Definition: section.h:56
void startMemberDeclarations(OutputList &ol)
Definition: groupdef.cpp:985
bool isLinkableInProject() const
Definition: memberdef.cpp:1150
void startMemberDescription(const char *anchor, const char *inheritId=0)
Definition: outputlist.h:308
bool declVisible(const ClassDef::CompoundType *filter=0) const
Definition: classlist.cpp:65
void distributeMemberGroupDocumentation()
Definition: groupdef.cpp:107
GroupPri_t
Definition: types.h:64
int countMembers() const
Definition: groupdef.cpp:547
void addDir(const DirDef *dd)
Definition: groupdef.cpp:213
void writeMemberGroups(OutputList &ol)
Definition: groupdef.cpp:969
void startMemberSections()
Definition: outputlist.h:186
QCString left(uint len) const
Definition: qcstring.cpp:213
GroupPri_t pri
priority of this definition
Definition: types.h:94
bool isASubGroup() const
Definition: groupdef.cpp:541
MemberDef * memberDef
Definition: membername.h:62
DocRoot * validatingParseDoc(const char *fileName, int startLine, Definition *ctx, MemberDef *md, const char *input, bool indexWords, bool isExample, const char *exampleName, bool singleLine, bool linkFromIndex)
Definition: docparser.cpp:7179
void writeDeclarations(OutputList &ol, ClassDef *cd, NamespaceDef *nd, FileDef *fd, GroupDef *gd, bool showInline=FALSE)
void writeNamespaces(OutputList &ol, const QCString &title)
Definition: groupdef.cpp:846
void writeDirs(OutputList &ol, const QCString &title)
Definition: groupdef.cpp:902
static bool suppressDocWarnings
Definition: doxygen.h:142
int briefLine() const
void writeTagFile(FTextStream &)
Definition: memberlist.cpp:963
virtual bool isReference() const
bool addClass(const ClassDef *def)
Definition: groupdef.cpp:149
Simplified and optimized version of QTextStream.
Definition: ftextstream.h:11
void writeInlineClasses(OutputList &ol)
Definition: groupdef.cpp:941
bool titleSet
Definition: groupdef.h:140
int find(char c, int index=0, bool cs=TRUE) const
Definition: qcstring.cpp:41
int count() const
Definition: sortdict.h:284
void addMemberToList(MemberListType lt, MemberDef *md)
Definition: groupdef.cpp:1572
void removeMember(MemberDef *md)
Definition: groupdef.cpp:424
void setGroupTitle(const char *newtitle)
Definition: groupdef.cpp:91
const char * groupTitle() const
Definition: groupdef.h:54
MemberDef * getGroupAlias() const
Definition: memberdef.cpp:4608
void startMemberList()
Definition: outputlist.h:206
MemberList * allMemberList
Definition: groupdef.h:150
GroupList * partOfGroups() const
void append(const char *key, const T *d)
Definition: sortdict.h:135
static constexpr double mg
Definition: Units.h:145
SrcLangExt
Definition: types.h:41
static QStrList * l
Definition: config.cpp:1044
void startMemberDocumentation(OutputList &ol)
Definition: groupdef.cpp:995
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition: qcstring.cpp:95
Represents of a member definition list with configurable title.
Definition: layout.h:105
void startTextLink(const char *file, const char *anchor)
Definition: outputlist.h:159
void writeClasses(OutputList &ol, const QCString &title)
Definition: groupdef.cpp:935
QCString title(SrcLangExt lang) const
Definition: layout.cpp:1440
void addGroup(const GroupDef *def)
Definition: groupdef.cpp:532
bool parseText(const QCString &textStr)
Definition: outputlist.cpp:175
void endGroupCollaboration(const DotGroupCollaboration &g)
Definition: outputlist.h:400
void sortSubGroups()
Definition: groupdef.cpp:1635
bool declVisible() const
Definition: memberlist.cpp:256
QCString displayName(bool=TRUE) const
Definition: dirdef.h:56
Represents of a member declaration list with configurable title and subtitle.
Definition: layout.h:89
void writeDocAnchorsToTagFile(FTextStream &)
Definition: definition.cpp:520
void setAutoDelete(bool val)
Definition: sortdict.h:222
void writeDocumentation(OutputList &ol)
Definition: groupdef.cpp:1073
FileDef * getFileDef() const
Definition: memberdef.cpp:4075
void writeDetailedDescription(OutputList &ol, const QCString &title)
Definition: groupdef.cpp:708
void popGeneratorState()
Definition: outputlist.cpp:121
bool isTrivial() const
Definition: dot.cpp:4740
void endMemberHeader()
Definition: outputlist.h:196
void setGroupAlias(MemberDef *md)
Definition: memberdef.cpp:4776
virtual DefType definitionType() const =0
Specifier virtualness(int count=0) const
Definition: memberdef.cpp:3560
Definition: sortdict.h:73
uint count() const
Definition: qlist.h:66
void addIndexItem(Definition *context, MemberDef *md, const char *sectionAnchor=0, const char *title=0)
Definition: index.h:142
static SearchIndexIntf * searchIndex
Definition: doxygen.h:133
void endParagraph()
Definition: outputlist.h:117
Q_EXPORT uint qstrlen(const char *str)
Definition: qcstring.h:81
const QCString & name() const
Definition: definition.h:114
Definition: dirdef.h:37
bool isEnumValue() const
Definition: memberdef.cpp:4150
QList< Grouping > * groups
list of groups this entry belongs to
Definition: entry.h:280
void writeSummaryLink(const char *file, const char *anchor, const char *title, bool first)
Definition: outputlist.h:362
void inSort(const type *d)
Definition: qlist.h:71
QCString inbodyFile() const
void writeMemberDocumentation(OutputList &ol, MemberListType lt, const QCString &title)
Definition: groupdef.cpp:1623
void findSectionsInDocumentation()
Definition: memberlist.cpp:818
void addMembersToMemberGroup()
Definition: groupdef.cpp:237
void setGroupDefForAllMembers(GroupDef *g, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs)
Definition: classdef.cpp:3615
void pushGeneratorState()
Definition: outputlist.cpp:111
void startMemberDeclaration()
Definition: outputlist.h:312
bool isLinkableInProject() const
Definition: filedef.cpp:1877
QCString name() const
Definition: filedef.cpp:1193
bool isEmpty() const
Definition: qlist.h:67
QCString convertToHtml(const char *s, bool keepEntities)
Definition: util.cpp:5746
static void writeVhdlDeclarations(MemberList *, OutputList &, GroupDef *, ClassDef *, FileDef *, NamespaceDef *)
SrcLangExt getLanguage() const
virtual QCString trAuthor(bool first_capital, bool singular)=0
void sort()
Definition: qlist.h:85
virtual void addWord(const char *word, bool hiPriority)=0
bool findGroup(const GroupDef *def) const
Definition: groupdef.cpp:511
bool insertMember(MemberDef *def, bool docOnly=FALSE)
Definition: groupdef.cpp:259
bool remove(const char *key)
Definition: sortdict.h:166
Definition * groupScope
Definition: groupdef.h:153
virtual QCString trGeneratedAutomatically(const char *s)=0
void addListReferences()
Definition: groupdef.cpp:1524
void setInGroup(bool b)
int startLine
start line of entry in the source
Definition: entry.h:283
p
Definition: test.py:223
void disable(OutputGenerator::OutputType o)
Definition: outputlist.cpp:79
void makePartOfGroup(GroupDef *gd)
static SectionDict * sectionDict
Definition: doxygen.h:117
void writeSummaryLinks(OutputList &ol)
Definition: groupdef.cpp:1028
void addGroupToGroups(Entry *root, GroupDef *subGroup)
Definition: groupdef.cpp:1359
void setNeedsSorting(bool b)
Definition: memberlist.cpp:902
A bunch of utility functions.
const char * data() const
Definition: qcstring.h:207
void addGroupListToTitle(OutputList &ol, Definition *d)
Definition: util.cpp:6528
virtual bool hasUserDocumentation() const
Definition: dirdef.h:44
QCString anchor() const
Definition: memberdef.cpp:1031
#define Config_getString(val)
Definition: config.cpp:660
type * current() const
Definition: qlist.h:146
void setInGroup(bool inGroup)
Definition: memberlist.h:73
void writeDoc(DocRoot *root, Definition *ctx, MemberDef *md)
Definition: outputlist.cpp:162
GroupDef(const char *fileName, int line, const char *name, const char *title, const char *refFileName=0)
Definition: groupdef.cpp:46
QList< MemberList > m_memberLists
Definition: groupdef.h:155
void enable(OutputGenerator::OutputType o)
Definition: outputlist.cpp:89
#define Config_getBool(val)
Definition: config.cpp:664
ClassDef * getClassDef() const
Definition: memberdef.cpp:4070
virtual bool isVisible() const
QCString briefFile() const
QCString title
Definition: section.h:57
virtual QCString trGroup(bool first_capital, bool singular)=0
virtual QCString qualifiedName() const
void addPage(PageDef *def)
Definition: groupdef.cpp:222
void warn(const char *file, int line, const char *fmt,...)
Definition: message.cpp:183
void sort()
Definition: sortdict.h:522
bool isLinkableInProject() const
Definition: dirdef.cpp:58
QCString groupname
name of the group
Definition: types.h:93
void err(const char *fmt,...)
Definition: message.cpp:226
void writeMemberDeclarations(OutputList &ol, MemberListType lt, const QCString &title)
Definition: groupdef.cpp:1607
int findAt(const QCString &key)
Definition: sortdict.h:244
void addExample(const PageDef *def)
Definition: groupdef.cpp:230
const char * memberName() const
Definition: membername.h:77
MemberType memberType() const
Definition: memberdef.cpp:4125
virtual QCString trMore()=0
int inbodyLine() const
virtual QCString briefDescription(bool abbreviate=FALSE) const
void addClassToGroups(Entry *root, ClassDef *cd)
Definition: groupdef.cpp:1306
PageSDict * exampleDict
Definition: groupdef.h:147
MemberGroupSDict * memberGroupSDict
Definition: groupdef.h:156
void startGroupHeader(int extraLevels=0)
Definition: outputlist.h:176
QCString mid(uint index, uint len=0xffffffff) const
Definition: qcstring.cpp:246
QCString getOutputFileBase() const
Definition: filedef.h:83
int match(const QCString &str, int index=0, int *len=0, bool indexIsStart=TRUE) const
Definition: qregexp.cpp:649
void writeDocumentationPage(OutputList &ol, const char *scopeName, Definition *container)
Definition: memberlist.cpp:715
void sortMemberLists()
Definition: groupdef.cpp:1583
FileList * fileList
Definition: groupdef.h:142
bool hasDetailedDescription() const
Definition: groupdef.cpp:1660
~GroupDef()
Definition: groupdef.cpp:77
void writeTagFile(FTextStream &)
Definition: groupdef.cpp:565
QCString doc
documentation block (partly parsed)
Definition: entry.h:260
bool isLinkableInProject() const
Definition: pagedef.h:41
void addFile(const FileDef *def)
Definition: groupdef.cpp:138
void endSection(const char *lab, SectionInfo::SectionType t)
Definition: outputlist.h:336
MemberListType type
Definition: layout.h:111
const char * getGroupFileName() const
Definition: memberdef.cpp:4105
bool addNamespace(const NamespaceDef *def)
Definition: groupdef.cpp:197
virtual Definition * getOuterScope() const
void writeNestedGroups(OutputList &ol, const QCString &title)
Definition: groupdef.cpp:852
bool isHidden() const
GroupDef * getGroupDef() const
Definition: memberdef.cpp:4095
void writeDeclaration(OutputList &ol, const ClassDef::CompoundType *filter=0, const char *header=0, bool localNames=FALSE)
Definition: classlist.cpp:94
QCString getOutputFileBase() const
Definition: dirdef.cpp:113
MemberList * getMemberList(MemberListType lt) const
Definition: groupdef.cpp:1593
ArgumentList * argumentList() const
Definition: memberdef.cpp:4512
void startTextBlock(bool dense=FALSE)
Definition: outputlist.h:404
A model of a page symbol.
Definition: pagedef.h:29
virtual Kind kind() const =0
void enableAll()
Definition: outputlist.cpp:59
PageSDict * pageDict
Definition: groupdef.h:146
QCString fileName
file this entry was extracted from
Definition: entry.h:282
Base class representing a piece of a documentation page.
Definition: layout.h:30
virtual void setCurrentDoc(Definition *ctx, const char *anchor, bool isSourceFile)=0
QCString getOutputFileBase() const
Definition: memberdef.cpp:941
void writeAnchor(const char *fileName, const char *name)
Definition: outputlist.h:242
MemberNameInfoSDict * allMemberNameInfoSDict
Definition: groupdef.h:151
void computeAnchors()
Definition: groupdef.cpp:559
void endMemberDescription()
Definition: outputlist.h:310
ClassDef * getClassDefOfAnonymousType()
Definition: memberdef.cpp:1236
T * at(uint i)
Definition: sortdict.h:258
static const char * getGroupPriName(GroupPri_t priority)
Definition: types.h:75
void addRefItem(const QList< ListItemInfo > *sli, const char *key, const char *prefix, const char *name, const char *title, const char *args, Definition *scope)
Definition: util.cpp:6456
Translator * theTranslator
Definition: language.cpp:157
void writeDocumentation(OutputList &ol, Definition *container=0)
Definition: classlist.cpp:119
bool needsSorting() const
Definition: memberlist.h:53
virtual QCString trDir(bool first_capital, bool singular)=0
int getGroupStartLine() const
Definition: memberdef.cpp:4110
static QCString listTypeAsString(MemberListType type)
Definition: memberlist.cpp:907
void endTextBlock(bool paraBreak=FALSE)
Definition: outputlist.h:406
MemberListType
Definition: types.h:104
void writeQuickMemberLinks(OutputList &ol, MemberDef *currentMd) const
Definition: groupdef.cpp:1263
void writeDeclarations(OutputList &ol, ClassDef *cd, NamespaceDef *nd, FileDef *fd, GroupDef *gd, const char *title, const char *subtitle, bool showEnumValues=FALSE, bool showInline=FALSE, ClassDef *inheritedFrom=0, MemberListType lt=MemberListType_pubMethods)
Definition: memberlist.cpp:519
void endMemberSections()
Definition: outputlist.h:188
bool isFunction() const
Definition: memberdef.cpp:4160
bool isEmpty() const
Definition: docparser.h:1409
void startTitleHead(const char *fileName)
Definition: outputlist.h:105
void createSubDirs(QDir &d)
Definition: util.cpp:5458
friend class Iterator
Definition: sortdict.h:289
void writeBriefDescription(OutputList &ol)
Definition: groupdef.cpp:763
void endMemberDeclarations(OutputList &ol)
Definition: groupdef.cpp:990
void distributeMemberGroupDocumentation()
void removeMemberFromList(MemberListType lt, MemberDef *md)
Definition: groupdef.cpp:1629
void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs, MemberDef *member=0)
Definition: memberdef.cpp:3363
void endMemberDocumentation(OutputList &ol)
Definition: groupdef.cpp:1006
int docLine() const
void docFindSections(const char *input, Definition *d, MemberGroup *mg, const char *fileName)
Definition: docparser.cpp:7434
bool isLinkableInProject() const
QCString getOutputFileBase() const
Definition: groupdef.cpp:1512
void startMemberHeader(const char *anchor)
Definition: outputlist.h:194
QCString title
Definition: groupdef.h:139
void docify(const char *s)
Definition: outputlist.h:145
void insertMemberAlign(bool templ=FALSE)
Definition: outputlist.h:238
void findSectionsInDocumentation()
T * find(const char *key)
Definition: sortdict.h:232
void startSection(const char *lab, const char *title, SectionInfo::SectionType t)
Definition: outputlist.h:334
virtual QCString documentation() const
void insertAt(int i, const char *key, const T *d)
Definition: sortdict.h:209
bool remove(uint i)
Definition: qlist.h:76
void writeObjectLink(const char *ref, const char *file, const char *anchor, const char *name)
Definition: outputlist.h:149
void setAutoDelete(bool enable)
Definition: qlist.h:99
bool declVisible() const
QCString getOutputFileBase() const
Definition: pagedef.cpp:58
bool isLinkable() const
Definition: memberdef.cpp:1161
void writeDeclaration(OutputList &ol, const char *title, bool isConstantGroup=false, bool localName=FALSE)
void endTextLink()
Definition: outputlist.h:161
void addListReferences(Definition *def)
Definition: memberlist.cpp:784
GroupList * groupList
Definition: groupdef.h:145
QCString stripExtension(const char *fName)
Definition: util.cpp:6799
QCString anchor() const
Definition: groupdef.h:52
QCString localName() const
const bool TRUE
Definition: qglobal.h:371
void updateLanguage(const Definition *)
Definition: groupdef.cpp:1652
static IndexList * indexList
Definition: doxygen.h:149
void writeAuthorSection(OutputList &ol)
Definition: groupdef.cpp:1016
void endMemberList()
Definition: outputlist.h:208
QCString title(SrcLangExt lang) const
Definition: layout.cpp:1447
QTextStream & endl(QTextStream &s)
ArgumentList * templateArguments() const
Definition: memberdef.cpp:4522
void startContents()
Definition: outputlist.h:364
bool getGroupHasDocs() const
Definition: memberdef.cpp:4115
void addListReferences(Definition *d)
type * toFirst()
Definition: qlist.h:135