Doxygen
Loading...
Searching...
No Matches
indexlist.h
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2021 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16#ifndef INDEXLIST_H
17#define INDEXLIST_H
18
19#include <memory>
20#include <mutex>
21#include <utility>
22#include <vector>
23
24#include "construct.h"
25#include "dstring.h"
26
27class DString;
28class Definition;
29class MemberDef;
30class OutputList;
31
32/** Abstract interface for index generators. */
34{
35 public:
37
38 virtual void initialize() = 0;
39 virtual void finalize() = 0;
40 virtual void incContentsDepth() = 0;
41 virtual void decContentsDepth() = 0;
42 virtual void addContentsItem(bool isDir,
43 const DString &name,
44 const DString &ref,
45 const DString &file,
46 const DString &anchor,
47 bool separateIndex,
48 bool addToNavIndex,
49 const Definition *def,
50 const DString &nameAsHtml
51 ) = 0;
52 virtual void addIndexItem(const Definition *context,const MemberDef *md,
53 const DString &sectionAnchor,const DString &title) = 0;
54 virtual void addIndexFile(const DString &name) = 0;
55 virtual void addImageFile(const DString &) = 0;
56 virtual void addStyleSheetFile(const DString &) = 0;
57};
58
59/** \brief A list of index interfaces.
60 *
61 * This class itself implements all methods of IndexIntf and
62 * just forwards the calls to all items in the list (composite design pattern).
63 */
65{
66 using IndexPtr = std::unique_ptr<IndexIntf>;
67
68 template<class... Ts,class... As>
69 void foreach(void (IndexIntf::*methodPtr)(Ts...),As&&... args)
70 {
71 for (const auto &intf : m_indices)
72 {
73 (intf.get()->*methodPtr)(std::forward<As>(args)...);
74 }
75 }
76
77 template<class... Ts,class... As>
78 void foreach_locked(void (IndexIntf::*methodPtr)(Ts...),As&&... args)
79 {
80 std::lock_guard<std::mutex> lock(m_mutex);
81 for (const auto &intf : m_indices)
82 {
83 (intf.get()->*methodPtr)(std::forward<As>(args)...);
84 }
85 }
86
87 public:
88 /** disable the indices */
89 void disable()
90 { m_enabled = false; }
91
92 /** enable the indices */
93 void enable()
94 { m_enabled = true; }
95
96 /** Add an index generator to the list, using a syntax similar to std::make_unique<T>() */
97 template<class T,class... As>
98 void addIndex(As&&... args)
99 { m_indices.push_back(std::make_unique<T>(std::forward<As>(args)...)); }
100
102 { foreach(&IndexIntf::initialize); }
103
104 void finalize()
105 { foreach(&IndexIntf::finalize); }
106
109
112
113 void addContentsItem(bool isDir, const DString &name, const DString &ref,
114 const DString &file, const DString &anchor,bool separateIndex=false,bool addToNavIndex=false,
115 const Definition *def=nullptr, const DString &nameAsHtml = DString())
116 { if (m_enabled) foreach_locked(&IndexIntf::addContentsItem,isDir,name,ref,file,anchor,separateIndex,addToNavIndex,def,nameAsHtml); }
117
118 void addIndexItem(const Definition *context,const MemberDef *md,const DString &sectionAnchor=DString(),const DString &title=DString())
119 { if (m_enabled) foreach_locked(&IndexIntf::addIndexItem,context,md,sectionAnchor,title); }
120
123
126
129
130 private:
131 bool m_enabled = true;
132 std::mutex m_mutex;
133 std::vector<IndexPtr> m_indices;
134};
135
136#endif // INDEXLIST_H
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:88
The common base class of all entity definitions found in the sources.
Definition definition.h:77
Abstract interface for index generators.
Definition indexlist.h:34
virtual void initialize()=0
virtual void addStyleSheetFile(const DString &)=0
virtual void decContentsDepth()=0
virtual void addIndexItem(const Definition *context, const MemberDef *md, const DString &sectionAnchor, const DString &title)=0
virtual void finalize()=0
virtual void incContentsDepth()=0
virtual void addContentsItem(bool isDir, const DString &name, const DString &ref, const DString &file, const DString &anchor, bool separateIndex, bool addToNavIndex, const Definition *def, const DString &nameAsHtml)=0
virtual void addImageFile(const DString &)=0
virtual void addIndexFile(const DString &name)=0
A list of index interfaces.
Definition indexlist.h:65
void initialize()
Definition indexlist.h:101
bool m_enabled
Definition indexlist.h:131
std::unique_ptr< IndexIntf > IndexPtr
Definition indexlist.h:66
void addIndexFile(const DString &name)
Definition indexlist.h:121
void addIndexItem(const Definition *context, const MemberDef *md, const DString &sectionAnchor=DString(), const DString &title=DString())
Definition indexlist.h:118
std::vector< IndexPtr > m_indices
Definition indexlist.h:133
void decContentsDepth()
Definition indexlist.h:110
void addIndex(As &&... args)
Add an index generator to the list, using a syntax similar to std::make_unique<T>().
Definition indexlist.h:98
void addContentsItem(bool isDir, const DString &name, const DString &ref, const DString &file, const DString &anchor, bool separateIndex=false, bool addToNavIndex=false, const Definition *def=nullptr, const DString &nameAsHtml=DString())
Definition indexlist.h:113
std::mutex m_mutex
Definition indexlist.h:132
void enable()
enable the indices
Definition indexlist.h:93
void foreach_locked(void(IndexIntf::*methodPtr)(Ts...), As &&... args)
Definition indexlist.h:78
void incContentsDepth()
Definition indexlist.h:107
void addImageFile(const DString &name)
Definition indexlist.h:124
void addStyleSheetFile(const DString &name)
Definition indexlist.h:127
void disable()
disable the indices
Definition indexlist.h:89
void finalize()
Definition indexlist.h:104
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:311
#define ABSTRACT_BASE_CLASS(cls)
Macro to implement rule of 5 for an abstract base class.
Definition construct.h:20