doxmlintf.h 31.3 KB
Newer Older
1 2 3 4 5
/******************************************************************************
 *
 * $Id$
 *
 *
6
 * Copyright (C) 1997-2013 by Dimitri van Heesch.
7 8 9 10 11 12 13 14 15
 *
 * 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
16 17 18
#ifndef _DOXMLINTF_H
#define _DOXMLINTF_H

19 20 21 22
/*! \file
 *  \brief The interface to the object model provided by the XML parser 
 *         library.
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
23
 *  To start using this library one calls createObjectModel() and then
24 25 26 27 28
 *  uses the returned IDoxygen interface to read doxygen generated
 *  XML output and navigate through the information contained in it.
 *
 *  @see createObjectModel()
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
29 30 31

class IMember;
class IDocIterator;
32 33
class ICompound;
class ISection;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
34
class INode;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
35
class IDocInternal;
36
class IDocRoot;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
37

38 39
#define VIRTUAL_DESTRUCTOR(x) virtual ~x() {}

40 41
/*! \brief Read only interface to a string. 
 */
42 43 44
class IString
{
  public:
45
    VIRTUAL_DESTRUCTOR(IString)
46
    /*! Returns a latin1 character representation of the string. */
47
    virtual const char *latin1() const = 0;
48 49
    /*! Returns a utf8 character representation of the string. */
    virtual const char *utf8() const = 0;
50 51 52
    /*! Returns a 16-bit unicode character representation of the character at 
     *  position \a index in the string. The first character is at index 0.
     */
53
    virtual unsigned short unicodeCharAt(int index) const = 0;
54
    /*! Returns true if this string is empty or false otherwise */
55
    virtual bool isEmpty() const = 0;
56
    /*! Returns the number of characters in the string. */
57 58 59
    virtual int length() const = 0;
};

60 61 62 63 64
/*! \brief Base interface for hyperlinked text
 *
 *  Depending on the result of kind() the interface is extended by
 *  ILT_Text or ILT_Ref.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
65 66 67
class ILinkedText
{
  public:
68
    VIRTUAL_DESTRUCTOR(ILinkedText)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
69 70 71 72
    enum Kind { Kind_Text, Kind_Ref };
    virtual Kind kind() const = 0;
};

73 74
/*! \brief Plain text fragment.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
75 76 77
class ILT_Text : public ILinkedText
{
  public:
78
    VIRTUAL_DESTRUCTOR(ILT_Text)
79
    virtual const IString *text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
80 81
};

82 83
/*! \brief Reference to an object.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
84 85 86
class ILT_Ref : public ILinkedText
{
  public:
87
    VIRTUAL_DESTRUCTOR(ILT_Ref)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
88
    enum TargetKind { Member, Compound };
89
    virtual const IString *id() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
90
    virtual TargetKind targetKind() const = 0;
91 92
    virtual const IString *external() const = 0;
    virtual const IString *text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
93 94
};

95 96
/*! \brief Iterates over a list of ILinkedText fragments.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
97 98 99
class ILinkedTextIterator 
{
  public:
100
    VIRTUAL_DESTRUCTOR(ILinkedTextIterator)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
101 102 103 104 105 106 107 108
    virtual ILinkedText *toFirst() = 0;
    virtual ILinkedText *toLast() = 0;
    virtual ILinkedText *toNext() = 0;
    virtual ILinkedText *toPrev() = 0;
    virtual ILinkedText *current() const = 0;
    virtual void release() = 0;
};

109
/*! \brief Representation of a parameter of a function. */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
110 111 112
class IParam 
{
  public:
113
    VIRTUAL_DESTRUCTOR(IParam)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
114
    virtual ILinkedTextIterator *type() const = 0;
115 116 117 118
    virtual const IString * declarationName() const = 0;
    virtual const IString * definitionName() const = 0;
    virtual const IString * attrib() const = 0;
    virtual const IString * arraySpecifier() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
119
    virtual ILinkedTextIterator *defaultValue() const = 0;
120
    virtual IDocRoot *briefDescription() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
121 122 123 124 125
};

class IParamIterator
{
  public:
126
    VIRTUAL_DESTRUCTOR(IParamIterator)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
127 128 129 130 131 132 133 134 135 136 137
    virtual IParam *toFirst() = 0;
    virtual IParam *toLast() = 0;
    virtual IParam *toNext() = 0;
    virtual IParam *toPrev() = 0;
    virtual IParam *current() const = 0;
    virtual void release() = 0;
};

class IMemberReference 
{
  public:
138
    VIRTUAL_DESTRUCTOR(IMemberReference)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
139
    virtual IMember *member() const = 0;
140 141 142 143 144
    virtual const IString * name() const = 0;
    virtual const IString * scope() const = 0;
    virtual const IString * protection() const = 0;
    virtual const IString * virtualness() const = 0;
    virtual const IString * ambiguityScope() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
145 146 147 148 149
};

class IMemberReferenceIterator 
{
  public:
150
    VIRTUAL_DESTRUCTOR(IMemberReferenceIterator)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
151 152 153 154 155 156 157 158 159 160 161
    virtual IMemberReference *toFirst() = 0;
    virtual IMemberReference *toLast() = 0;
    virtual IMemberReference *toNext() = 0;
    virtual IMemberReference *toPrev() = 0;
    virtual IMemberReference *current() const = 0;
    virtual void release() = 0;
};

class IDoc
{
  public:
162
    VIRTUAL_DESTRUCTOR(IDoc)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
163 164
    enum Kind 
    { 
165
      Invalid = 0,        //  0
166 167
      Para,               //  1 -> IDocPara
      Text,               //  2 -> IDocText
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
      MarkupModifier,     //  3 -> IDocMarkupModifier
      ItemizedList,       //  4 -> IDocItemizedList
      OrderedList,        //  5 -> IDocOrderedList
      ListItem,           //  6 -> IDocListItem
      ParameterList,      //  7 -> IDocParameterList
      Parameter,          //  8 -> IDocParameter
      SimpleSect,         //  9 -> IDocSimpleSect
      Title,              // 10 -> IDocTitle
      Ref,                // 11 -> IDocRef
      VariableList,       // 12 -> IDocVariableList
      VariableListEntry,  // 13 -> IDocVariableListEntry
      HRuler,             // 14 -> IDocHRuler
      LineBreak,          // 15 -> IDocLineBreak
      ULink,              // 16 -> IDocULink
      EMail,              // 17 -> IDocEMail
      Link,               // 18 -> IDocLink
      ProgramListing,     // 19 -> IDocProgramListing
      CodeLine,           // 20 -> IDocCodeLine
      Highlight,          // 21 -> IDocHighlight
Dimitri van Heesch's avatar
Dimitri van Heesch committed
187 188 189 190 191 192 193 194
      Formula,            // 22 -> IDocFormula
      Image,              // 23 -> IDocImage
      DotFile,            // 24 -> IDocDotFile
      IndexEntry,         // 25 -> IDocIndexEntry
      Table,              // 26 -> IDocTable
      Row,                // 27 -> IDocRow
      Entry,              // 28 -> IDocEntry
      Section,            // 29 -> IDocSection
195 196 197 198 199 200
      Verbatim,           // 30 -> IDocVerbatim
      Copy,               // 31 -> IDocCopy
      TocList,            // 32 -> IDocTocList
      TocItem,            // 33 -> IDocTocItem
      Anchor,             // 34 -> IDocAnchor
      Symbol,             // 35 -> IDocSymbol
Dimitri van Heesch's avatar
Dimitri van Heesch committed
201
      Internal,           // 36 -> IDocInternal
202 203
      Root,               // 37 -> IDocRoot
      ParameterItem       // 38 -> IDocParameterItem
Dimitri van Heesch's avatar
Dimitri van Heesch committed
204 205 206 207 208 209 210 211 212
    };
    virtual Kind kind() const = 0;
};

class IDocMarkup : public IDoc
{
  public:
    enum Markup 
    { 
213 214 215 216 217 218 219 220 221 222
      Normal         = 0x000,
      Bold           = 0x001,
      Emphasis       = 0x002,
      ComputerOutput = 0x004,
      Subscript      = 0x008,
      Superscript    = 0x010,
      SmallFont      = 0x020,
      Center         = 0x040,
      Preformatted   = 0x080,
      Heading        = 0x100
Dimitri van Heesch's avatar
Dimitri van Heesch committed
223 224 225 226 227 228 229 230 231 232 233 234
    };
};

class IDocPara : public IDoc
{
  public:
    virtual IDocIterator *contents() const = 0; 
};

class IDocText : public IDocMarkup
{
  public:
235
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
236
    virtual int markup() const = 0;
237
    virtual int headingLevel() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
238 239 240 241
};

class IDocMarkupModifier : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
242 243 244
  public:
    virtual bool enabled() const = 0;
    virtual int markup() const = 0;
245
    virtual int headingLevel() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
246 247 248 249 250 251
};

class IDocItemizedList : public IDoc
{
  public:
    virtual IDocIterator *elements() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
252 253
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
254
class IDocOrderedList : public IDoc
Dimitri van Heesch's avatar
Dimitri van Heesch committed
255
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
256 257
  public:
    virtual IDocIterator *elements() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
258 259 260 261
};

class IDocListItem : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
262 263
  public:
    virtual IDocIterator *contents() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
264 265 266 267
};

class IDocParameterList : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
268 269
  public:
    enum Types { Param, RetVal, Exception };
270
    virtual Types sectType() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
271
    virtual IDocIterator *params() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
272 273
};

274 275 276 277 278 279 280
class IDocParameterItem : public IDoc
{
  public:
    virtual IDocIterator *paramNames() const = 0;
    virtual IDocPara *description() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
281 282
class IDocParameter : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
283
  public:
284
    virtual const IString * name() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
285 286
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
287
class IDocTitle : public IDoc
Dimitri van Heesch's avatar
Dimitri van Heesch committed
288
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
289 290
  public:
    virtual IDocIterator *title() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
291 292
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
293
class IDocSimpleSect : public IDoc
Dimitri van Heesch's avatar
Dimitri van Heesch committed
294 295
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
296 297 298 299 300 301 302 303
    enum Types { Invalid = 0,
                 See, Return, Author, Version, 
                 Since, Date, Bug, Note,
                 Warning, Par, Deprecated, Pre, 
                 Post, Invar, Remark, Attention,
                 Todo, Test, RCS, EnumValues, 
                 Examples
    };
Dimitri van Heesch's avatar
Dimitri van Heesch committed
304
    virtual Types type() const = 0;
305
    virtual const IString * typeString() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
306 307
    virtual IDocTitle *title() const = 0;
    virtual IDocPara *description() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
308 309 310 311
};

class IDocRef : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
312 313
  public:
    enum TargetKind { Member, Compound };
314
    virtual const IString * refId() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
315
    virtual TargetKind targetKind() const = 0;
316 317
    virtual const IString * external() const = 0;
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
318 319 320 321
};

class IDocVariableList : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
322 323
  public:
    virtual IDocIterator *entries() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
324 325 326 327
};

class IDocVariableListEntry : public IDoc
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
328
  public:
329
    virtual ILinkedTextIterator * term() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
330
    virtual IDocPara *description() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
331 332 333 334 335 336 337 338 339 340 341 342
};

class IDocHRuler : public IDoc
{
};

class IDocLineBreak : public IDoc
{
};

class IDocULink : public IDoc
{
343
  public:
344 345
    virtual const IString * url() const = 0;
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
346 347 348 349
};

class IDocEMail : public IDoc
{
350
  public:
351
    virtual const IString * address() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
352 353 354 355
};

class IDocLink : public IDoc
{
356
  public:
357 358
    virtual const IString * refId() const = 0;
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
359 360 361 362
};

class IDocProgramListing : public IDoc
{
363
  public:
364
    virtual IDocIterator *codeLines() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
365 366 367 368
};

class IDocCodeLine : public IDoc
{
369
  public:
370
    virtual int lineNumber() const = 0;
371
    virtual const IString * refId() const = 0;
372
    virtual IDocIterator *codeElements() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
373 374 375 376
};

class IDocHighlight : public IDoc
{
377 378 379 380 381 382 383
  public:
    enum HighlightKind 
    { Invalid=0,
      Comment, Keyword, 
      KeywordType, KeywordFlow, CharLiteral, 
      StringLiteral, Preprocessor
    };
384 385
    virtual HighlightKind highlightKind() const = 0;
    virtual IDocIterator *codeElements() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
386 387 388 389
};

class IDocFormula : public IDoc
{
390
  public:
391 392
    virtual const IString * id() const = 0;
    virtual const IString * text() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
393 394 395 396
};

class IDocImage : public IDoc
{
397
  public:
398 399
    virtual const IString * name() const = 0;
    virtual const IString * caption() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
400 401 402 403
};

class IDocDotFile : public IDoc
{
404
  public:
405 406
    virtual const IString * name() const = 0;
    virtual const IString * caption() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
407 408 409 410
};

class IDocIndexEntry : public IDoc
{
411
  public:
412 413
    virtual const IString * primary() const = 0;
    virtual const IString * secondary() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
414 415 416 417
};

class IDocTable : public IDoc
{
418
  public:
419 420
    virtual IDocIterator *rows() const = 0;
    virtual int numColumns() const = 0;
421
    virtual const IString * caption() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
422 423 424 425
};

class IDocRow : public IDoc
{
426
  public:
427
    virtual IDocIterator *entries() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
428 429 430 431
};

class IDocEntry : public IDoc
{
432
  public:
433
    virtual IDocIterator *contents() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
434 435 436 437 438
};

class IDocSection : public IDoc
{
  public:
439
    virtual const IString * id() const = 0; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
440
    virtual int level() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
441 442 443 444 445 446 447 448 449 450 451
    virtual IDocTitle *title() const = 0;
    virtual IDocIterator *paragraphs() const = 0;
    virtual IDocIterator *subSections() const = 0;
    virtual IDocInternal *internal() const = 0;
};

class IDocInternal : public IDoc
{
  public:
    virtual IDocIterator *paragraphs() const = 0;
    virtual IDocIterator *subSections() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
452 453
};

454 455 456 457 458 459 460 461 462 463 464 465 466 467
class IDocTocList : public IDoc
{
  public:
    virtual IDocIterator *elements() const = 0;
};

class IDocTocItem : public IDoc
{
  public:
    virtual const IString *id() const = 0; 
    virtual const IString *title() const = 0;
};

class IDocCopy : public IDoc
468 469 470 471 472
{
  public:
    virtual IDocIterator *contents() const = 0; 
};

473 474 475
class IDocVerbatim : public IDoc
{
  public:
476
    enum Types { Invalid = 0, HtmlOnly, LatexOnly, Verbatim };
477
    virtual const IString *text() const = 0; 
478 479 480 481 482 483 484
    virtual Types type() const = 0;
};

class IDocAnchor : public IDoc
{
  public:
    virtual const IString *id() const = 0; 
485 486
};

487 488 489 490 491 492 493 494 495 496 497 498
class IDocSymbol : public IDoc
{
  public:
    enum Types 
    { Invalid = 0,
      Umlaut, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Copy
    };
    virtual Types type() const = 0;
    virtual const IString * typeString() const = 0;
    virtual char letter() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
499 500 501 502
class IDocRoot : public IDoc
{
  public:
    virtual IDocIterator *contents() const = 0; 
503
    virtual IDocInternal *internal() const = 0; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
504 505 506 507 508
};

class IDocIterator 
{
  public:
509
    VIRTUAL_DESTRUCTOR(IDocIterator)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
510 511 512 513 514 515 516 517
    virtual IDoc *toFirst() = 0;
    virtual IDoc *toLast() = 0;
    virtual IDoc *toNext() = 0;
    virtual IDoc *toPrev() = 0;
    virtual IDoc *current() const = 0;
    virtual void release() = 0;
};

518 519 520
class IEdgeLabel
{
  public:
521
    VIRTUAL_DESTRUCTOR(IEdgeLabel)
522
    virtual const IString * label() const = 0;
523 524 525 526 527
};

class IEdgeLabelIterator 
{
  public:
528
    VIRTUAL_DESTRUCTOR(IEdgeLabelIterator)
529 530 531 532 533 534 535 536 537 538 539
    virtual IEdgeLabel *toFirst() = 0;
    virtual IEdgeLabel *toLast() = 0;
    virtual IEdgeLabel *toNext() = 0;
    virtual IEdgeLabel *toPrev() = 0;
    virtual IEdgeLabel *current() const = 0;
    virtual void release() = 0;
};

class IChildNode
{
  public:
540
    VIRTUAL_DESTRUCTOR(IChildNode)
541
    enum NodeRelation { PublicInheritance, ProtectedInheritance,
542
                        PrivateInheritance, Usage, TemplateInstance
543
                      };
Dimitri van Heesch's avatar
Dimitri van Heesch committed
544
    virtual INode * node() const = 0;
545
    virtual NodeRelation relation() const = 0;
546
    virtual const IString * relationString() const = 0;
547 548 549 550 551 552
    virtual IEdgeLabelIterator *edgeLabels() const = 0;
};

class IChildNodeIterator 
{
  public:
553
    VIRTUAL_DESTRUCTOR(IChildNodeIterator)
554 555 556 557 558 559 560 561 562 563 564
    virtual IChildNode *toFirst() = 0;
    virtual IChildNode *toLast() = 0;
    virtual IChildNode *toNext() = 0;
    virtual IChildNode *toPrev() = 0;
    virtual IChildNode *current() const = 0;
    virtual void release() = 0;
};

class INode
{
  public:
565
    VIRTUAL_DESTRUCTOR(INode)
566 567 568
    virtual const IString * id() const = 0;
    virtual const IString * label() const = 0;
    virtual const IString * linkId() const = 0;
569 570 571 572 573 574
    virtual IChildNodeIterator *children() const = 0;
};

class INodeIterator 
{
  public:
575
    VIRTUAL_DESTRUCTOR(INodeIterator)
576 577 578 579 580 581 582 583 584 585 586
    virtual INode *toFirst() = 0;
    virtual INode *toLast() = 0;
    virtual INode *toNext() = 0;
    virtual INode *toPrev() = 0;
    virtual INode *current() const = 0;
    virtual void release() = 0;
};

class IGraph
{
  public:
587
    VIRTUAL_DESTRUCTOR(IGraph)
588 589 590
    virtual INodeIterator *nodes() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
591 592 593
class IMember 
{
  public:
594
    VIRTUAL_DESTRUCTOR(IMember)
595 596
    enum MemberKind { Invalid=0,
                      Define, Property, Variable, Typedef, Enum,
597 598
                      Function, Signal, Prototype, Friend, DCOP, Slot, 
                      EnumValue
599 600 601 602
                    };
    virtual ICompound *compound() const = 0;
    virtual ISection *section() const = 0;
    virtual MemberKind kind() const = 0;
603 604 605 606
    virtual const IString * kindString() const = 0;
    virtual const IString * id() const = 0;
    virtual const IString * protection() const = 0;
    virtual const IString * virtualness() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
607
    virtual ILinkedTextIterator *type() const = 0;
608 609
    virtual const IString * typeString() const = 0;
    virtual const IString * name() const = 0;
610 611 612 613
    virtual const IString * readAccessor() const = 0;
    virtual const IString * writeAccessor() const = 0;
    virtual const IString * definition() const = 0;
    virtual const IString * argsstring() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
614 615
    virtual bool isConst() const = 0;
    virtual bool isVolatile() const = 0;
616 617 618 619 620 621
    virtual bool isStatic() const = 0;
    virtual bool isExplicit() const = 0;
    virtual bool isInline() const = 0;
    virtual bool isMutable() const = 0;
    virtual bool isReadable() const = 0;
    virtual bool isWritable() const = 0;
622 623
    virtual IParamIterator *parameters() const = 0;
    virtual IParamIterator *templateParameters() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
624 625 626 627
    virtual ILinkedTextIterator *initializer() const = 0;
    virtual ILinkedTextIterator *exceptions() const = 0;
    virtual IMemberReferenceIterator *references() const = 0; 
    virtual IMemberReferenceIterator *referencedBy() const = 0;
628
    virtual const IString *bodyFile() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
629 630
    virtual int bodyStart() const = 0;
    virtual int bodyEnd() const = 0;
631
    virtual const IString * definitionFile() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
632 633 634 635 636
    virtual int definitionLine() const = 0;
    virtual IMemberReference *reimplements() const = 0;
    virtual IMemberReferenceIterator *reimplementedBy() const = 0;
    virtual IDocRoot *briefDescription() const = 0;
    virtual IDocRoot *detailedDescription() const = 0;
637
    virtual IDocRoot *inbodyDescription() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
638 639
};

640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695
class IDefine : public IMember
{
  public:
};

class IProperty : public IMember
{
  public:
};

class IVariable : public IMember
{
  public:
};

class ITypedef : public IMember
{
  public:
};

class IFunction : public IMember
{
  public:
};

class ISignal : public IMember
{
  public:
};

class IPrototype : public IMember
{
  public:
};

class IFriend : public IMember
{
  public:
};

class IDCOP : public IMember
{
  public:
};

class ISlot : public IMember
{
  public:
};

class IEnumValue : public IMember
{
  public:
    virtual const IString * name() const = 0;
};

696 697 698
/*! \brief Include relation
 */
class IInclude 
699 700
{
  public:
701
    VIRTUAL_DESTRUCTOR(IInclude)
702 703 704
    virtual const IString * name() const = 0;
    virtual const IString * refId() const = 0;
    virtual bool isLocal() const = 0;
705 706
};

707 708 709
class IIncludeIterator
{
  public:
710
    VIRTUAL_DESTRUCTOR(IIncludeIterator)
711 712 713 714 715 716 717
    virtual IInclude *toFirst() = 0;
    virtual IInclude *toLast() = 0;
    virtual IInclude *toNext() = 0;
    virtual IInclude *toPrev() = 0;
    virtual IInclude *current() const = 0;
    virtual void release() = 0;
};
718

Dimitri van Heesch's avatar
Dimitri van Heesch committed
719 720 721
class IMemberIterator 
{
  public:
722
    VIRTUAL_DESTRUCTOR(IMemberIterator)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
723 724 725 726 727 728 729 730
    virtual IMember *toFirst() = 0;
    virtual IMember *toLast() = 0;
    virtual IMember *toNext() = 0;
    virtual IMember *toPrev() = 0;
    virtual IMember *current() const = 0;
    virtual void release() = 0;
};

731 732 733 734 735 736
class IEnum : public IMember
{
  public:
    virtual IMemberIterator *enumValues() const = 0;
};

737 738 739 740 741 742 743 744 745 746
/*! \brief The interface to a section in the object model. 
 *
 *  A compound can have a number of sections, where each
 *  section contains a set of members with the properties implied by
 *  the section kind. The kind() method returns the kind of the section.
 *  The members of the section can be accessed via members(). Apart
 *  from using kind(), some of the individual properties of the section can 
 *  also be inspected via isStatic(), isPublic(), isProtected() and 
 *  isPrivate().
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
747 748 749
class ISection 
{
  public:
750
    VIRTUAL_DESTRUCTOR(ISection)
751 752 753 754 755 756 757 758 759 760 761
    /*! Possible section types */
    enum SectionKind 
    { Invalid=0,
      UserDefined,         //!< A user defined member group 
      PubTypes,            //!< Public member typedefs
      PubFuncs,            //!< Public member functions
      PubAttribs,          //!< Public member attributes 
      PubSlots,            //!< Public Qt Slots
      Signals,             //!< Qt Signals
      DCOPFuncs,           //!< KDE-DCOP interface functions
      Properties,          //!< IDL properties
762
      Events,              //!< C# events
763 764 765 766 767 768 769 770
      PubStatFuncs,        //!< Public static member functions
      PubStatAttribs,      //!< Public static attributes
      ProTypes,            //!< Protected member typedefs
      ProFuncs,            //!< Protected member functions
      ProAttribs,          //!< Protected member attributes
      ProSlots,            //!< Protected slots
      ProStatFuncs,        //!< Protected static member functions
      ProStatAttribs,      //!< Protected static member attributes
771 772 773 774 775
      PacTypes,            //!< Package member typedefs
      PacFuncs,            //!< Package member functions
      PacAttribs,          //!< Package member attributes
      PacStatFuncs,        //!< Package static member functions
      PacStatAttribs,      //!< Package static member attributes
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792
      PriTypes,            //!< Private member typedefs
      PriFuncs,            //!< Private member functions
      PriAttribs,          //!< Private member attributes
      PriSlots,            //!< Private Qt slots
      PriStatFuncs,        //!< Private static member functions
      PriStatAttribs,      //!< Private static member attributes
      Friend,              //!< Friends
      Related,             //!< Function marked as related
      Defines,             //!< Preprocessor defines
      Prototypes,          //!< Global function prototypes
      Typedefs,            //!< Global typedefs
      Enums,               //!< Enumerations
      Functions,           //!< Global functions
      Variables            //!< Global variables
    };
    
    /*! Returns a string representation of the value returned by kind() */
793
    virtual const IString * kindString() const = 0;
794 795
    
    /*! Returns what kind of section this is */
796
    virtual SectionKind kind() const = 0;
797 798 799 800 801

    /*! Returns the description attached to this section (for user defined
     *  sections, also known as member groups).
     */
    virtual IDocRoot *description() const = 0;
802 803
    
    /*! Returns an iterator for the members of this section */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
804
    virtual IMemberIterator *members() const = 0;
805 806
    
    /*! Returns \c true if this section contains statics */
807
    virtual bool isStatic() const = 0;
808 809 810 811
    
    /*! Returns \c true if this section belongs to a 
     *  public section of a class 
     */
812
    virtual bool isPublic() const = 0;
813 814 815 816
    
    /*! Returns \c true if this section belongs to a 
     *  private section of a class 
     */
817
    virtual bool isPrivate() const = 0;
818 819 820 821
    
    /*! Returns \c true if this section belongs to a 
     *  protected section of a class 
     * */
822
    virtual bool isProtected() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
823 824
};

825 826 827 828 829 830
class IUserDefined : public ISection
{
  public:
    virtual const IString * header() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
831 832 833
class ISectionIterator 
{
  public:
834
    VIRTUAL_DESTRUCTOR(ISectionIterator)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
835 836 837 838 839 840 841 842
    virtual ISection *toFirst() = 0;
    virtual ISection *toLast() = 0;
    virtual ISection *toNext() = 0;
    virtual ISection *toPrev() = 0;
    virtual ISection *current() const = 0;
    virtual void release() = 0;
};

843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867
/*! \brief The interface to a compound in the object model. 
 *
 *  A compound has a name which can be obtained via the name() method 
 *  and a unique id, which is return via the id() method.
 *  A compound consists zero or more members which are grouped into sections. 
 *  The sections() method can be used to access the individual sections. 
 *  Alternatively, members can be obtained by name or id. There are 
 *  different types of compounds. The kind() method returns what kind of 
 *  compound this is. Depending on the return value one can dynamically 
 *  cast an interface pointer to an more specialised interface that provides 
 *  additional methods.
 *  Example:
 *  \code
 *  ICompound *comp=...;
 *  if (comp->kind()==ICompound::Class)
 *  {
 *    IClass *cls = dynamic_cast<IClass*>(comp);
 *    // use methods of IClass
 *  }
 *  \endcode
 *  The documentation that is provided by a compound is available via
 *  the briefDescription() and detailedDescription() methods.
 *  To avoid excessive memory usage, release() should be called (once) on each 
 *  compound interface pointer that is no longer needed.
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
868 869 870
class ICompound 
{
  public:
871
    VIRTUAL_DESTRUCTOR(ICompound)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
872
    /*! Represents the kind of compounds recognised by doxygen. */
873
    enum CompoundKind { Invalid=0,
874 875
                        Class, Struct, Union, Interface, Protocol, Category,
                        Exception, File, Namespace, Group, Page, Example, Dir
876
                      };
877

Dimitri van Heesch's avatar
Dimitri van Heesch committed
878
    /*! Returns the name of this compound */
879
    virtual const IString * name() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
880 881 882 883

    /*! Returns the id of this compound. The id is a
     *  unique string representing a specific compound object.
     */
884
    virtual const IString * id()   const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
885 886 887 888

    /*! Returns the kind of compound. See #CompoundKind for possible
     *  values.
     */
889
    virtual CompoundKind kind() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
890 891 892 893

    /*! Returns a string representation of the compound kind.
     *  @see kind()
     */
894
    virtual const IString * kindString() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
895 896 897 898

    /*! Returns an iterator for the different member sections in this
     *  compound.
     */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
899
    virtual ISectionIterator *sections() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
900 901 902 903

    /*! Returns a tree-structured representation of the brief
     *  description that is attached to this compound.
     */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
904
    virtual IDocRoot *briefDescription() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
905 906 907 908

    /*! Returns a tree-structured representation of the detailed
     *  description that is attached to this compound.
     */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
909
    virtual IDocRoot *detailedDescription() const = 0;
910 911 912 913

    /*! Returns an interface to a member given its id. 
     *  @param id The member id.
     */
914
    virtual IMember *memberById(const char * id) const = 0;
915 916

    /*! Returns a list of all members within the compound having a certain 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
917 918
     *  name. Member overloading is the reason why there can be more than 
     *  one member. 
919 920
     *  @param name The name of the member.
     */
921
    virtual IMemberIterator *memberByName(const char * name) const = 0;
922 923 924 925 926

    /*! Decreases the reference counter for this compound. If it reaches
     *  zero, the memory for the compound will be released.
     */
    virtual void release() = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
927 928 929 930 931
};

class ICompoundIterator 
{
  public:
932
    VIRTUAL_DESTRUCTOR(ICompoundIterator)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
933 934 935 936 937 938 939 940 941 942 943
    virtual void toFirst() = 0;
    virtual void toLast() = 0;
    virtual void toNext() = 0;
    virtual void toPrev() = 0;
    virtual ICompound *current() const = 0;
    virtual void release() = 0;
};

class IRelatedCompound
{
  public:
944
    VIRTUAL_DESTRUCTOR(IRelatedCompound)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
945 946 947 948 949
    enum Protection { Public, Protected, Private };
    enum Kind { Normal, Virtual };
    virtual ICompound *compound() const = 0;
    virtual Protection protection() const = 0;
    virtual Kind kind() const = 0;
950
    virtual const IString *name() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
951 952 953 954 955 956

};

class IRelatedCompoundIterator 
{
  public:
957
    VIRTUAL_DESTRUCTOR(IRelatedCompoundIterator)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
958 959 960 961 962 963 964 965
    virtual IRelatedCompound *toFirst() = 0;
    virtual IRelatedCompound *toLast() = 0;
    virtual IRelatedCompound *toNext() = 0;
    virtual IRelatedCompound *toPrev() = 0;
    virtual IRelatedCompound *current() const = 0;
    virtual void release() = 0;
};

966 967
/*! \brief The interface to a class in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
968 969 970 971 972
class IClass : public ICompound
{
  public:
    virtual IGraph *inheritanceGraph() const = 0;
    virtual IGraph *collaborationGraph() const = 0;
973 974 975
    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
    virtual ICompoundIterator *nestedCompounds() const = 0;
976 977 978
    virtual IParamIterator *templateParameters() const = 0;
    virtual const IString *locationFile() const = 0;
    virtual int locationLine() const = 0;
979
    virtual const IString *locationBodyFile() const = 0;
980 981
    virtual int locationBodyStartLine() const = 0;
    virtual int locationBodyEndLine() const = 0;
982 983 984 985

    // TODO:
    // class:
    //  listOfAllMembers()
986 987
    //  protection()
    //  isAbstract()
Dimitri van Heesch's avatar
Dimitri van Heesch committed
988 989
};

990 991
/*! \brief The interface to a struct in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
992 993
class IStruct : public ICompound
{
994 995 996 997
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
998 999 1000 1001
    virtual const IString *locationFile() const = 0;
    virtual int locationLine() const = 0;
    virtual int locationBodyStartLine() const = 0;
    virtual int locationBodyEndLine() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1002 1003
};

1004 1005
/*! \brief The interface to a union in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1006 1007
class IUnion : public ICompound
{
1008 1009
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1010 1011
};

1012 1013
/*! \brief The interface to a Java/IDL interface in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1014 1015
class IInterface : public ICompound
{
1016 1017 1018
  public:
    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1019 1020
};

1021

1022 1023
/*! \brief The interface to a Java/IDL exception in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1024 1025 1026 1027
class IException : public ICompound
{
};

1028 1029
/*! \brief The interface to a namespace in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1030 1031
class INamespace : public ICompound
{
1032 1033
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1034 1035
};

1036 1037
/*! \brief The interface to a file in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1038 1039
class IFile : public ICompound
{
1040 1041 1042
  public:
    virtual IGraph *includeDependencyGraph() const = 0;
    virtual IGraph *includedByDependencyGraph() const = 0;
1043
    virtual IDocProgramListing *source() const = 0;
1044
    virtual ICompoundIterator *nestedCompounds() const = 0;
1045

1046 1047 1048
    virtual IIncludeIterator *includes() const = 0;
    virtual IIncludeIterator *includedBy() const = 0;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1049 1050 1051 1052
    //  ICompound *innerNamespaces()
    //  ICompoundIterator *innerClasses()
};

1053 1054
/*! \brief The interface to a group in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1055 1056
class IGroup : public ICompound
{
1057 1058
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
1059 1060 1061 1062
    // group:
    //  Title()
    //  innerFile()
    //  innerPage()
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1063 1064
};

1065 1066
/*! \brief The interface to a page in the object model. 
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1067
class IPage : public ICompound
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1068
{
1069 1070
  public:
    virtual const IDocTitle *title() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1071 1072
};

1073 1074 1075 1076 1077 1078 1079
/** \brief Interface to a directory in the object model. */
class IDir : public ICompound
{
  public:
    virtual ICompoundIterator *nestedCompounds() const = 0;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1080 1081 1082 1083
/*! Root node of the object model. */
class IDoxygen 
{
  public:
1084
    VIRTUAL_DESTRUCTOR(IDoxygen)
1085

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1086 1087 1088 1089 1090 1091 1092 1093 1094
    /*! Returns an iterator that can be used to iterate over the list
     *  of compounds found in the project.
     */
    virtual ICompoundIterator *compounds() const = 0;

    /*! Returns a compound given its unique \a id. If you have a
     *  compound id this function is much more efficient than iterating
     *  over the compound list. Returns 0 if the id is not valid.
     */
1095
    virtual ICompound *compoundById(const char * id) const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1096 1097 1098 1099

    /*! Returns a compound given its name (including the scope). 
     *  Returns 0 if the name is not found in the project.
     */
1100
    virtual ICompound *compoundByName(const char * name) const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1101

1102 1103 1104
    /*! Returns an interface to a compound containing a member given it the
     *  member's id. Given the ICompound interface one can use the same id
     *  to obtain the IMember interface.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1105 1106
     *  @param id The member id.
     */
1107
    virtual ICompound *memberById(const char * id) const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1108

1109 1110 1111
    /*! Returns a list of all compounds containing at least one members 
     *  with a certain name. Each compound can be asked to return the
     *  list of members with that name.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1112 1113
     *  @param name The name of the member.
     */
1114
    virtual ICompoundIterator *memberByName(const char * name) const = 0;
1115

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1116 1117 1118 1119 1120
    /*! Releases the memory for the object hierarchy obtained by 
     *  createdObjecModelFromXML(). First release all iterators before calling
     *  this function.
     */
    virtual void release() = 0;
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132

    /*! Sets the debug level.
     *  - 0 all debugging messages are disabled (the default).
     *  - 1 display important messages only
     *  - 2 display any messages.
     */
    virtual void setDebugLevel(int level) = 0;

    /*! Reads an XML directory produced by doxygen and builds up a data 
     *  structure representing the contents of the XML files in the directory. 
     */
    virtual bool readXMLDir(const char *xmlDirName) = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1133 1134
};

1135 1136 1137
/*! Factory method that creates an empty object model for a doxygen generated XML file.
 *  Use the readXMLDir() method to build the model from an XML output 
 *  directory containing doxygen output.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1138
 */
1139
IDoxygen *createObjectModel();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1140 1141

#endif