Fix for UBSan build
[platform/upstream/doxygen.git] / src / index.h
1 /******************************************************************************
2  *
3  * $Id: index.h,v 1.28 2001/03/19 19:27:40 root Exp $
4  *
5  * Copyright (C) 1997-2012 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 #ifndef INDEX_H
19 #define INDEX_H
20
21 #include "qtbc.h"
22 #include <qfile.h>
23 #include <qlist.h>
24
25 class Definition;
26 class MemberDef;
27 class OutputList;
28 class FTextStream;
29
30 /** \brief Abstract interface for index generators. */
31 class IndexIntf
32 {
33   public:
34     virtual ~IndexIntf() {}
35     virtual void initialize() = 0;
36     virtual void finalize() = 0;
37     virtual void incContentsDepth() = 0;
38     virtual void decContentsDepth() = 0;
39     virtual void addContentsItem(bool isDir, const char *name, const char *ref, 
40                                  const char *file, const char *anchor, bool separateIndex,
41                                  bool addToNavIndex,Definition *def) = 0;
42     virtual void addIndexItem(Definition *context,MemberDef *md,const char *title) = 0;
43     virtual void addIndexFile(const char *name) = 0;
44     virtual void addImageFile(const char *name) = 0;
45     virtual void addStyleSheetFile(const char *name) = 0;
46 };
47
48 /** \brief A list of index interfaces.
49  *
50  *  This class itself implements all methods of IndexIntf and
51  *  just forwards the calls to all items in the list.
52  */
53 class IndexList : public IndexIntf
54 {
55   private:
56     QList<IndexIntf> m_intfs;
57
58     // --- foreach implementations for various number of arguments
59
60     void foreach(void (IndexIntf::*methodPtr)())
61     {
62       QListIterator<IndexIntf> li(m_intfs);
63       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)();
64     }
65
66     template<typename A1>
67     void foreach(void (IndexIntf::*methodPtr)(A1),A1 a1)
68     {
69       QListIterator<IndexIntf> li(m_intfs);
70       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1);
71     }
72
73     template<typename A1,typename A2,typename A3>
74     void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3),A1 a1,A2 a2,A3 a3)
75     {
76       QListIterator<IndexIntf> li(m_intfs);
77       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3);
78     }
79
80     template<typename A1,typename A2,typename A3,typename A4>
81     void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4),A1 a1,A2 a2,A3 a3,A4 a4)
82     {
83       QListIterator<IndexIntf> li(m_intfs);
84       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4);
85     }
86
87     template<typename A1,typename A2,typename A3,typename A4,typename A5>
88     void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)
89     {
90       QListIterator<IndexIntf> li(m_intfs);
91       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5);
92     }
93
94     template<typename A1,typename A2,typename A3,typename A4,typename A5,typename A6>
95     void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5,A6),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6)
96     {
97       QListIterator<IndexIntf> li(m_intfs);
98       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5,a6);
99     }
100
101     template<typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7,typename A8>
102     void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5,A6,A7,A8),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8)
103     {
104       QListIterator<IndexIntf> li(m_intfs);
105       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5,a6,a7,a8);
106     }
107
108     template<typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7,typename A8,typename A9>
109     void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5,A6,A7,A8,A9),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9)
110     {
111       QListIterator<IndexIntf> li(m_intfs);
112       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5,a6,a7,a8,a9);
113     }
114
115   public:
116     /** Creates a list of indexes */
117     IndexList() { m_intfs.setAutoDelete(TRUE); m_enabled=TRUE; }
118     /** Add an index generator to the list */
119     void addIndex(IndexIntf *intf) 
120     { m_intfs.append(intf); }
121     void disable()
122     { m_enabled = FALSE; }
123     void enable()
124     { m_enabled = TRUE; }
125     bool isEnabled() const
126     { return m_enabled; }
127
128     // IndexIntf implementation
129     void initialize() 
130     { foreach(&IndexIntf::initialize); }
131     void finalize() 
132     { foreach(&IndexIntf::finalize); }
133     void incContentsDepth()
134     { if (m_enabled) foreach(&IndexIntf::incContentsDepth); }
135     void decContentsDepth()
136     { if (m_enabled) foreach(&IndexIntf::decContentsDepth); }
137     void addContentsItem(bool isDir, const char *name, const char *ref, 
138                          const char *file, const char *anchor,bool separateIndex=FALSE,bool addToNavIndex=FALSE,
139                          Definition *def=0)
140     { if (m_enabled) foreach<bool,const char *,const char *,const char *,const char*,bool,bool,Definition *>
141              (&IndexIntf::addContentsItem,isDir,name,ref,file,anchor,separateIndex,addToNavIndex,def); }
142     void addIndexItem(Definition *context,MemberDef *md,const char *title=0)
143     { if (m_enabled) foreach<Definition *,MemberDef *>
144              (&IndexIntf::addIndexItem,context,md,title); }
145     void addIndexFile(const char *name) 
146     { if (m_enabled) foreach<const char *>(&IndexIntf::addIndexFile,name); }
147     void addImageFile(const char *name) 
148     { if (m_enabled) foreach<const char *>(&IndexIntf::addImageFile,name); }
149     void addStyleSheetFile(const char *name) 
150     { if (m_enabled) foreach<const char *>(&IndexIntf::addStyleSheetFile,name); }
151
152   private:
153     bool m_enabled;
154 };
155
156
157 enum IndexSections
158 {
159   isTitlePageStart,
160   isTitlePageAuthor,
161   isMainPage,
162   isModuleIndex,
163   isDirIndex,
164   isNamespaceIndex,
165   isClassHierarchyIndex,
166   isCompoundIndex,
167   isFileIndex,
168   isPageIndex,
169   isModuleDocumentation,
170   isDirDocumentation,
171   isNamespaceDocumentation,
172   isClassDocumentation,
173   isFileDocumentation,
174   isExampleDocumentation,
175   isPageDocumentation,
176   isPageDocumentation2,
177   isEndIndex
178 };
179
180 enum HighlightedItem
181 {
182   HLI_None=0,
183   HLI_Main,
184   HLI_Modules,
185   //HLI_Directories,
186   HLI_Namespaces,
187   HLI_Hierarchy,
188   HLI_Classes,
189   HLI_Annotated,
190   HLI_Files,
191   HLI_NamespaceMembers,
192   HLI_Functions,
193   HLI_Globals,
194   HLI_Pages,
195   HLI_Examples,
196   HLI_Search,
197   HLI_UserGroup,
198
199   HLI_ClassVisible,
200   HLI_NamespaceVisible,
201   HLI_FileVisible
202 };
203
204 enum ClassMemberHighlight
205 {
206   CMHL_All = 0,
207   CMHL_Functions,
208   CMHL_Variables,
209   CMHL_Typedefs,
210   CMHL_Enums,
211   CMHL_EnumValues,
212   CMHL_Properties,
213   CMHL_Events,
214   CMHL_Related,
215   CMHL_Total = CMHL_Related+1
216 };
217
218 enum FileMemberHighlight
219 {
220   FMHL_All = 0,
221   FMHL_Functions,
222   FMHL_Variables,
223   FMHL_Typedefs,
224   FMHL_Enums,
225   FMHL_EnumValues,
226   FMHL_Defines,
227   FMHL_Total = FMHL_Defines+1
228 };
229
230 enum NamespaceMemberHighlight
231 {
232   NMHL_All = 0,
233   NMHL_Functions,
234   NMHL_Variables,
235   NMHL_Typedefs,
236   NMHL_Enums,
237   NMHL_EnumValues,
238   NMHL_Total = NMHL_EnumValues+1
239 };
240
241 enum ClassHighlight
242 {
243   CHL_All = 0,
244   CHL_Classes,
245   CHL_Structs,
246   CHL_Unions,
247   CHL_Interfaces,
248   CHL_Protocols,
249   CHL_Categories,
250   CHL_Exceptions,
251   CHL_Total = CHL_Exceptions+1
252 };
253
254 void writeGraphInfo(OutputList &ol);
255 void writeIndexHierarchy(OutputList &ol);
256
257 void countDataStructures();
258
259 extern int annotatedClasses;
260 extern int hierarchyClasses;
261 extern int documentedFiles;
262 extern int documentedGroups;
263 extern int documentedNamespaces;
264 extern int indexedPages;
265 extern int documentedClassMembers[CMHL_Total];
266 extern int documentedFileMembers[FMHL_Total];
267 extern int documentedNamespaceMembers[NMHL_Total];
268 extern int documentedDirs;
269 extern int documentedHtmlFiles;
270 extern int documentedPages;
271
272 void startTitle(OutputList &ol,const char *fileName,Definition *def=0);
273 void endTitle(OutputList &ol,const char *fileName,const char *name);
274 void startFile(OutputList &ol,const char *name,const char *manName,
275                const char *title,HighlightedItem hli=HLI_None,
276                bool additionalIndices=FALSE,const char *altSidebarName=0);
277 void endFile(OutputList &ol,bool skipNavIndex=FALSE,bool skipEndContents=FALSE,
278              const QCString &navPath=QCString());
279 void endFileWithNavPath(Definition *d,OutputList &ol);
280
281 void initClassMemberIndices();
282 void initFileMemberIndices();
283 void initNamespaceMemberIndices();
284 void addClassMemberNameToIndex(MemberDef *md);
285 void addFileMemberNameToIndex(MemberDef *md);
286 void addNamespaceMemberNameToIndex(MemberDef *md);
287
288 #endif