classdef.h 19.5 KB
Newer Older
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1 2
/******************************************************************************
 *
3
 * 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
4
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
5
 * Copyright (C) 1997-2013 by Dimitri van Heesch.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
6 7 8 9 10 11 12
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby 
 * granted. No representations are made about the suitability of this software 
 * for any purpose. It is provided "as is" without express or implied warranty.
 * See the GNU General Public License for more details.
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
13 14
 * Documents produced by Doxygen are derivative works derived from the
 * input used in their production; they are not affected by this license.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
15 16 17 18 19 20 21 22
 *
 */

#ifndef CLASSDEF_H
#define CLASSDEF_H

#include <qlist.h>
#include <qdict.h>
23
#include <qptrdict.h>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
24 25 26

#include "definition.h"

27 28
class MemberDef;
class MemberList;
29
class MemberDict;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
30
class ClassList;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
31
class ClassSDict;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
32 33
class OutputList;
class FileDef;
34
class FileList;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
35 36
class BaseClassList;
class NamespaceDef;
37
class MemberDef;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
38 39
class ExampleSDict;
class MemberNameInfoSDict;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
40
class UsesClassDict;
41
class MemberGroupSDict;
42
class QTextStream;
43
class PackageDef;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
44 45
class GroupDef;
class StringDict;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
46
struct IncludeInfo;
47
class ClassDefImpl;
48
class ArgumentList;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
49

50
/** A class representing of a compound symbol.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
51
 *
52 53
 *  A compound can be a class, struct, union, interface, service, singleton,
 *  or exception.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
54
 *  \note This class should be renamed to CompoundDef
Dimitri van Heesch's avatar
Dimitri van Heesch committed
55
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
56 57 58
class ClassDef : public Definition
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
59
    /** The various compound types */
60 61 62
    enum CompoundType { Class,     //=Entry::CLASS_SEC, 
                        Struct,    //=Entry::STRUCT_SEC, 
                        Union,     //=Entry::UNION_SEC,
63
                        Interface, //=Entry::INTERFACE_SEC,
64 65
                        Protocol,  //=Entry::PROTOCOL_SEC,
                        Category,  //=Entry::CATEGORY_SEC,
66 67 68
                        Exception, //=Entry::EXCEPTION_SEC
                        Service,   //=Entry::CLASS_SEC
                        Singleton, //=Entry::CLASS_SEC
Dimitri van Heesch's avatar
Dimitri van Heesch committed
69
                      };
70

Dimitri van Heesch's avatar
Dimitri van Heesch committed
71
    /** Creates a new compound definition.
72 73 74 75
     *  \param fileName  full path and file name in which this compound was
     *                   found.
     *  \param startLine line number where the definition of this compound
     *                   starts.
76 77
     *  \param startColumn column number where the definition of this compound
     *                   starts.
78 79 80 81 82 83 84 85 86
     *  \param name      the name of this compound (including scope)
     *  \param ct        the kind of Compound
     *  \param ref       the tag file from which this compound is extracted
     *                   or 0 if the compound doesn't come from a tag file
     *  \param fName     the file name as found in the tag file. 
     *                   This overwrites the file that doxygen normally 
     *                   generates based on the compound type & name.
     *  \param isSymbol  If TRUE this class name is added as a publicly 
     *                   visible (and referencable) symbol.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
87 88 89
     *  \param isJavaEnum If TRUE this class is actually a Java enum.
     *                    I didn't add this to CompoundType to avoid having
     *                    to adapt all translators.
90
     */
91
    ClassDef(const char *fileName,int startLine,int startColumn,
92 93
             const char *name,CompoundType ct,
             const char *ref=0,const char *fName=0,
Dimitri van Heesch's avatar
Dimitri van Heesch committed
94
             bool isSymbol=TRUE,bool isJavaEnum=FALSE);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
95
    /** Destroys a compound definition. */
96 97 98 99 100 101
   ~ClassDef();

    //-----------------------------------------------------------------------------------
    // --- getters 
    //-----------------------------------------------------------------------------------

Dimitri van Heesch's avatar
Dimitri van Heesch committed
102
    /** Used for RTTI, this is a class */
103
    DefType definitionType() const { return TypeClass; }
104

Dimitri van Heesch's avatar
Dimitri van Heesch committed
105
    /** Returns the unique base name (without extension) of the class's file on disk */
106
    QCString getOutputFileBase() const;
107
    QCString getInstanceOutputFileBase() const; 
108
    QCString getFileBase() const;
109

Dimitri van Heesch's avatar
Dimitri van Heesch committed
110
    /** Returns the base name for the source code file */
111
    QCString getSourceFileBase() const; 
112

Dimitri van Heesch's avatar
Dimitri van Heesch committed
113
    /** If this class originated from a tagfile, this will return the tag file reference */
114
    QCString getReference() const;
115

Dimitri van Heesch's avatar
Dimitri van Heesch committed
116
    /** Returns TRUE if this class is imported via a tag file */
117
    bool isReference() const;
118

Dimitri van Heesch's avatar
Dimitri van Heesch committed
119
    /** Returns TRUE if this is a local class definition, see EXTRACT_LOCAL_CLASSES */
120
    bool isLocal() const;
121

Dimitri van Heesch's avatar
Dimitri van Heesch committed
122
    /** returns the classes nested into this class */
123
    ClassSDict *getClassSDict();
124

Dimitri van Heesch's avatar
Dimitri van Heesch committed
125
    /** returns TRUE if this class has documentation */
126 127
    bool hasDocumentation() const;

128 129 130
    /** returns TRUE if this class has a non-empty detailed description */
    bool hasDetailedDescription() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
131 132
    /** Returns the name as it is appears in the documentation */
    QCString displayName(bool includeScope=TRUE) const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
133

Dimitri van Heesch's avatar
Dimitri van Heesch committed
134
    /** Returns the type of compound this is, i.e. class/struct/union/.. */
135
    CompoundType compoundType() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
136

Dimitri van Heesch's avatar
Dimitri van Heesch committed
137
    /** Returns the type of compound as a string */
138
    QCString compoundTypeString() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
139

Dimitri van Heesch's avatar
Dimitri van Heesch committed
140
    /** Returns the list of base classes from which this class directly
Dimitri van Heesch's avatar
Dimitri van Heesch committed
141 142
     *  inherits.
     */
143
    BaseClassList *baseClasses() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
144
    
Dimitri van Heesch's avatar
Dimitri van Heesch committed
145
    /** Returns the list of sub classes that directly derive from this class
Dimitri van Heesch's avatar
Dimitri van Heesch committed
146
     */
147
    BaseClassList *subClasses() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
148

Dimitri van Heesch's avatar
Dimitri van Heesch committed
149
    /** Returns a dictionary of all members. This includes any inherited 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
150 151
     *  members. Members are sorted alphabetically.
     */ 
152
    MemberNameInfoSDict *memberNameInfoSDict() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
153

Dimitri van Heesch's avatar
Dimitri van Heesch committed
154
    /** Return the protection level (Public,Protected,Private) in which 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
155 156
     *  this compound was found.
     */
157
    Protection protection() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
158

Dimitri van Heesch's avatar
Dimitri van Heesch committed
159
    /** returns TRUE iff a link is possible to this item within this project.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
160
     */
161
    bool isLinkableInProject() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
162

Dimitri van Heesch's avatar
Dimitri van Heesch committed
163
    /** return TRUE iff a link to this class is possible (either within 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
164
     *  this project, or as a cross-reference to another project).
165
     */
166
    bool isLinkable() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
167

Dimitri van Heesch's avatar
Dimitri van Heesch committed
168
    /** the class is visible in a class diagram, or class hierarchy */
169
    bool isVisibleInHierarchy();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
170
    
171 172 173
    /** show this class in the declaration section of its parent? */
    bool visibleInParentsDeclList() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
174
    /** Returns the template arguments of this class 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
175 176
     *  Will return 0 if not applicable.
     */
177
    ArgumentList *templateArguments() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
178

Dimitri van Heesch's avatar
Dimitri van Heesch committed
179
    /** Returns the namespace this compound is in, or 0 if it has a global
Dimitri van Heesch's avatar
Dimitri van Heesch committed
180 181
     *  scope.
     */
182
    NamespaceDef *getNamespaceDef() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
183

Dimitri van Heesch's avatar
Dimitri van Heesch committed
184
    /** Returns the file in which this compound's definition can be found.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
185 186
     *  Should not return 0 (but it might be a good idea to check anyway).
     */
187
    FileDef      *getFileDef() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
188

Dimitri van Heesch's avatar
Dimitri van Heesch committed
189
    /** Returns the Java package this class is in or 0 if not applicable. 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
190
     */ 
191

192
    MemberDef    *getMemberByName(const QCString &) const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
193
    
Dimitri van Heesch's avatar
Dimitri van Heesch committed
194
    /** Returns TRUE iff \a bcd is a direct or indirect base class of this
Dimitri van Heesch's avatar
Dimitri van Heesch committed
195 196 197
     *  class. This function will recusively traverse all branches of the
     *  inheritance tree.
     */
198
    bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
199

Dimitri van Heesch's avatar
Dimitri van Heesch committed
200 201 202 203 204
    /** Returns TRUE iff \a bcd is a direct or indirect sub class of this
     *  class.
     */
    bool isSubClass(ClassDef *bcd,int level=0);

Dimitri van Heesch's avatar
Dimitri van Heesch committed
205
    /** returns TRUE iff \a md is a member of this class or of the
206 207 208 209
     *  the public/protected members of a base class 
     */
    bool isAccessibleMember(MemberDef *md);

Dimitri van Heesch's avatar
Dimitri van Heesch committed
210
    /** Returns a sorted dictionary with all template instances found for
211 212
     *  this template class. Returns 0 if not a template or no instances.
     */
213
    QDict<ClassDef> *getTemplateInstances() const;
214

Dimitri van Heesch's avatar
Dimitri van Heesch committed
215
    /** Returns the template master of which this class is an instance.
216 217
     *  Returns 0 if not applicable.
     */
218
    ClassDef *templateMaster() const;
219

Dimitri van Heesch's avatar
Dimitri van Heesch committed
220
    /** Returns TRUE if this class is a template */
221
    bool isTemplate() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
222

223
    IncludeInfo *includeInfo() const;
224
    
225
    UsesClassDict *usedImplementationClasses() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
226

227
    UsesClassDict *usedByImplementationClasses() const;
228

229
    UsesClassDict *usedInterfaceClasses() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
230

231
    bool isTemplateArgument() const;
232

Dimitri van Heesch's avatar
Dimitri van Heesch committed
233
    /** Returns the definition of a nested compound if
234 235 236
     *  available, or 0 otherwise.
     *  @param name The name of the nested compound
     */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
237 238
    virtual Definition *findInnerCompound(const char *name);

Dimitri van Heesch's avatar
Dimitri van Heesch committed
239
    /** Returns the template parameter lists that form the template
240 241 242 243 244 245 246
     *  declaration of this class.
     *  
     *  Example: <code>template<class T> class TC {};</code>
     *  will return a list with one ArgumentList containing one argument
     *  with type="class" and name="T".
     */
    void getTemplateParameterLists(QList<ArgumentList> &lists) const;
247

248
    QCString qualifiedNameWithTemplateParameters(
249
        QList<ArgumentList> *actualParams=0,int *actualParamIndex=0) const;
250

Dimitri van Heesch's avatar
Dimitri van Heesch committed
251
    /** Returns TRUE if there is at least one pure virtual member in this
Dimitri van Heesch's avatar
Dimitri van Heesch committed
252 253
     *  class.
     */
254
    bool isAbstract() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
255

Dimitri van Heesch's avatar
Dimitri van Heesch committed
256
    /** Returns TRUE if this class is implemented in Objective-C */
257
    bool isObjectiveC() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
258

Dimitri van Heesch's avatar
Dimitri van Heesch committed
259
    /** Returns TRUE if this class is implemented in C# */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
260 261
    bool isCSharp() const;

262 263 264 265 266 267
    /** Returns TRUE if this class is marked as final */
    bool isFinal() const;

    /** Returns TRUE if this class is marked as sealed */
    bool isSealed() const;

268 269 270
    /** Returns TRUE if this class is marked as published */
    bool isPublished() const;

271 272 273
    /** Returns TRUE if this class represents an Objective-C 2.0 extension (nameless category) */
    bool isExtension() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
274
    /** Returns the class of which this is a category (Objective-C only) */
275
    ClassDef *categoryOf() const;
276

Dimitri van Heesch's avatar
Dimitri van Heesch committed
277
    /** Returns the name of the class including outer classes, but not
278 279 280 281
     *  including namespaces.
     */
    QCString className() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
282
    /** Returns the members in the list identified by \a lt */
283
    MemberList *getMemberList(MemberListType lt);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
284

Dimitri van Heesch's avatar
Dimitri van Heesch committed
285
    /** Returns the list containing the list of members sorted per type */
286
    const QList<MemberList> &getMemberLists() const;
287

Dimitri van Heesch's avatar
Dimitri van Heesch committed
288
    /** Returns the member groups defined for this class */
289
    MemberGroupSDict *getMemberGroupSDict() const;
290 291

    QDict<int> *getTemplateBaseClassNames() const;
292

293 294
    ClassDef *getVariableInstance(const char *templSpec);

295 296
    bool isUsedOnly() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
297
    QCString anchor() const;
298
    bool isEmbeddedInOuterScope() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
299

300 301
    bool isSimple() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
302 303 304
    const ClassList *taggedInnerClasses() const;
    ClassDef *tagLessReference() const;

305 306
    MemberDef *isSmartPointer() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
307 308
    bool isJavaEnum() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
309
    bool isGeneric() const;
310 311
    const ClassSDict *innerClasses() const;
    QCString title() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
312

313 314 315
    QCString generatedFromFiles() const;
    const FileList &usedFiles() const;

316 317 318 319
    const ArgumentList *typeConstraints() const;
    const ExampleSDict *exampleList() const;
    bool hasExamples() const;
    QCString getMemberListFileName() const;
320
    bool subGrouping() const;
321

322

323 324 325
    //-----------------------------------------------------------------------------------
    // --- setters ----
    //-----------------------------------------------------------------------------------
Dimitri van Heesch's avatar
Dimitri van Heesch committed
326 327 328

    void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0);
    void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
329
    void setIncludeFile(FileDef *fd,const char *incName,bool local,bool force); 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
330
    void insertMember(MemberDef *);
331
    void insertUsedFile(FileDef *);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
332
    bool addExample(const char *anchor,const char *name, const char *file);
333
    void mergeCategory(ClassDef *category);
334 335 336 337
    void setNamespace(NamespaceDef *nd);
    void setFileDef(FileDef *fd);
    void setSubGrouping(bool enabled);
    void setProtection(Protection p);
338
    void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
339
    void addInnerCompound(Definition *d);
340
    ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
341
                                const QCString &templSpec,bool &freshInstance);
342 343
    void addUsedClass(ClassDef *cd,const char *accessName,Protection prot);
    void addUsedByClass(ClassDef *cd,const char *accessName,Protection prot);
344 345
    void setIsStatic(bool b);
    void setCompoundType(CompoundType t);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
346
    void setClassName(const char *name);
347
    void setClassSpecifier(uint64 spec);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
348

349 350
    void setTemplateArguments(ArgumentList *al);
    void setTemplateBaseClassNames(QDict<int> *templateNames);
351
    void setTemplateMaster(ClassDef *tm);
352
    void setTypeConstraints(ArgumentList *al);
353
    void addMembersToTemplateInstance(ClassDef *cd,const char *templSpec);
354 355
    void makeTemplateArgument(bool b=TRUE);
    void setCategoryOf(ClassDef *cd);
356
    void setUsedOnly(bool b);
357

Dimitri van Heesch's avatar
Dimitri van Heesch committed
358 359 360
    void addTaggedInnerClass(ClassDef *cd);
    void setTagLessReference(ClassDef *cd);

361 362 363 364 365 366 367 368 369
    //-----------------------------------------------------------------------------------
    // --- actions ----
    //-----------------------------------------------------------------------------------

    void findSectionsInDocumentation();
    void addMembersToMemberGroup();
    void addListReferences();
    void computeAnchors();
    void mergeMembers();
370
    void sortMemberLists();
371 372 373 374 375
    void distributeMemberGroupDocumentation();
    void writeDocumentation(OutputList &ol);
    void writeDocumentationForInnerClasses(OutputList &ol);
    void writeMemberPages(OutputList &ol);
    void writeMemberList(OutputList &ol);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
376 377
    void writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup,
                          ClassDef *inheritedFrom,const char *inheritId);
378
    void writeQuickMemberLinks(OutputList &ol,MemberDef *md) const;
379
    void writeSummaryLinks(OutputList &ol);
380
    void reclassifyMember(MemberDef *md,MemberType t);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
381 382 383
    void writeInlineDocumentation(OutputList &ol);
    void writeDeclarationLink(OutputList &ol,bool &found,
                              const char *header,bool localNames);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
384
    void removeMemberFromLists(MemberDef *md);
385
    void addGroupedInheritedMembers(OutputList &ol,MemberListType lt,
Dimitri van Heesch's avatar
Dimitri van Heesch committed
386
                              ClassDef *inheritedFrom,const QCString &inheritId);
387
    int countMembersIncludingGrouped(MemberListType lt,ClassDef *inheritedFrom,bool additional);
388
    int countInheritanceNodes();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
389 390 391
    
    bool visited;

392 393
  protected:
    void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
394
    bool hasNonReferenceSuperClass();
395
    void showUsedFiles(OutputList &ol);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
396

397
  private: 
398
    void writeTagFileMarker();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
399
    void writeDocumentationContents(OutputList &ol,const QCString &pageTitle);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
400
    void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList);
401 402
    void addMemberToList(MemberListType lt,MemberDef *md,bool isBrief);
    MemberList *createMemberList(MemberListType lt);
403
    void writeInheritedMemberDeclarations(OutputList &ol,MemberListType lt,int lt2,const QCString &title,ClassDef *inheritedFrom,bool invert,bool showAlways,QPtrDict<void> *visitedClasses);
404
    void writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title,
405
                                 const char *subTitle=0,bool showInline=FALSE,ClassDef *inheritedFrom=0,int lt2=-1,bool invert=FALSE,bool showAlways=FALSE,QPtrDict<void> *visitedClasses=0);
406 407 408
    void writeMemberDocumentation(OutputList &ol,MemberListType lt,const QCString &title,bool showInline=FALSE);
    void writeSimpleMemberDocumentation(OutputList &ol,MemberListType lt);
    void writePlainMemberDeclaration(OutputList &ol,MemberListType lt,bool inGroup,ClassDef *inheritedFrom,const char *inheritId);
409 410
    void writeBriefDescription(OutputList &ol,bool exampleFlag);
    void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag,
Dimitri van Heesch's avatar
Dimitri van Heesch committed
411
                                  const QCString &title,const QCString &anchor=QCString());
412
    void writeIncludeFiles(OutputList &ol);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
413
    //void writeAllMembersLink(OutputList &ol);
414 415
    void writeInheritanceGraph(OutputList &ol);
    void writeCollaborationGraph(OutputList &ol);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
416
    void writeMemberGroups(OutputList &ol,bool showInline=FALSE);
417
    void writeNestedClasses(OutputList &ol,const QCString &title);
418
    void writeInlineClasses(OutputList &ol);
419 420 421 422 423
    void startMemberDeclarations(OutputList &ol);
    void endMemberDeclarations(OutputList &ol);
    void startMemberDocumentation(OutputList &ol);
    void endMemberDocumentation(OutputList &ol);
    void writeAuthorSection(OutputList &ol);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
424 425
    void writeMoreLink(OutputList &ol,const QCString &anchor);
    void writeDetailedDocumentationBody(OutputList &ol);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
426
    
427 428
    int countAdditionalInheritedMembers();
    void writeAdditionalInheritedMembers(OutputList &ol);
429
    void addClassAttributes(OutputList &ol);
430 431 432 433 434 435 436
    int countMemberDeclarations(MemberListType lt,ClassDef *inheritedFrom,
                                int lt2,bool invert,bool showAlways,QPtrDict<void> *visitedClasses);
    int countInheritedDecMembers(MemberListType lt,
                                 ClassDef *inheritedFrom,bool invert,bool showAlways,
                                 QPtrDict<void> *visitedClasses);
    void getTitleForMemberListType(MemberListType type,
               QCString &title,QCString &subtitle);
437 438
    QCString includeStatement() const;

439
    
440 441
    ClassDefImpl *m_impl;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
442 443
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
444
/** Class that contains information about a usage relation. 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
445
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
446 447 448 449 450
struct UsesClassDef
{
  UsesClassDef(ClassDef *cd) : classDef(cd) 
  { 
    accessors = new QDict<void>(17); 
451
    containment = TRUE;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
452 453 454 455 456 457 458 459 460 461 462 463
  }
 ~UsesClassDef()
  {
    delete accessors;
  }
  void addAccessor(const char *s)
  {
    if (accessors->find(s)==0)
    {
      accessors->insert(s,(void *)666);
    }
  }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
464
  /** Class definition that this relation uses. */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
465
  ClassDef *classDef;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
466

Dimitri van Heesch's avatar
Dimitri van Heesch committed
467
  /** Dictionary of member variable names that form the edge labels of the
Dimitri van Heesch's avatar
Dimitri van Heesch committed
468 469
   *  usage relation.
   */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
470
  QDict<void> *accessors;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
471

Dimitri van Heesch's avatar
Dimitri van Heesch committed
472
  /** Template arguments used for the base class */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
473
  QCString templSpecifiers;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
474

475
  bool containment;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
476 477
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
478
/** Dictionary of usage relations. 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
479
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
480 481 482 483 484 485 486
class UsesClassDict : public QDict<UsesClassDef>
{
  public:
    UsesClassDict(int size) : QDict<UsesClassDef>(size) {}
   ~UsesClassDict() {}
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
487
/** Iterator class to iterate over a dictionary of usage relations. 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
488
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
489 490 491 492 493 494 495
class UsesClassDictIterator : public QDictIterator<UsesClassDef>
{
  public:
    UsesClassDictIterator(const QDict<UsesClassDef> &d) 
      : QDictIterator<UsesClassDef>(d) {}
   ~UsesClassDictIterator() {}
};
Dimitri van Heesch's avatar
Dimitri van Heesch committed
496

Dimitri van Heesch's avatar
Dimitri van Heesch committed
497
/** Class that contains information about an inheritance relation. 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
498
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
499 500
struct BaseClassDef
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
501 502 503 504
  BaseClassDef(ClassDef *cd,const char *n,Protection p,
               Specifier v,const char *t) : 
        classDef(cd), usedName(n), prot(p), virt(v), templSpecifiers(t) {}

Dimitri van Heesch's avatar
Dimitri van Heesch committed
505
  /** Class definition that this relation inherits from. */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
506
  ClassDef *classDef;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
507

Dimitri van Heesch's avatar
Dimitri van Heesch committed
508
  /** name used in the inheritance list 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
509 510 511 512
   * (may be a typedef name instead of the class name)
   */
  QCString   usedName; 
  
Dimitri van Heesch's avatar
Dimitri van Heesch committed
513
  /** Protection level of the inheritance relation: 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
514 515 516 517
   *  Public, Protected, or Private 
   */
  Protection prot;     

Dimitri van Heesch's avatar
Dimitri van Heesch committed
518
  /** Virtualness of the inheritance relation:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
519 520
   *  Normal, or Virtual
   */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
521
  Specifier  virt;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
522

Dimitri van Heesch's avatar
Dimitri van Heesch committed
523
  /** Template arguments used for the base class */
524
  QCString templSpecifiers;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
525 526
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
527
/** List of base classes.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
528 529 530
 *  
 *  The classes are alphabetically sorted on name if inSort() is used.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
531 532 533
class BaseClassList : public QList<BaseClassDef>
{
  public:
534
   ~BaseClassList() {}
535
    int compareValues(const BaseClassDef *item1,const BaseClassDef *item2) const
Dimitri van Heesch's avatar
Dimitri van Heesch committed
536
    {
537 538 539
      const ClassDef *c1=item1->classDef;
      const ClassDef *c2=item2->classDef;
      if (c1==0 || c2==0)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
540 541
        return FALSE;
      else
Dimitri van Heesch's avatar
Dimitri van Heesch committed
542
        return qstricmp(c1->name(),c2->name());
Dimitri van Heesch's avatar
Dimitri van Heesch committed
543 544 545
    }
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
546
/** Iterator for a list of base classes.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
547
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
548 549 550 551 552 553 554 555
class BaseClassListIterator : public QListIterator<BaseClassDef>
{
  public:
    BaseClassListIterator(const BaseClassList &bcl) : 
      QListIterator<BaseClassDef>(bcl) {}
};

#endif