Doxygen
Loading...
Searching...
No Matches
memberlist.h
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2020 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 MEMBERLIST_H
17#define MEMBERLIST_H
18
19#include <algorithm>
20#include <utility>
21#include <vector>
22
23#include "construct.h"
24#include "linkedmap.h"
25#include "memberdef.h"
26#include "membergroup.h"
27#include "message.h"
28#include "types.h"
29
30class GroupDef;
31
32int genericCompareMembers(const MemberDef *c1,const MemberDef *c2);
33
34/** A vector of MemberDef object */
36{
37 public:
38 using T = MemberDef*;
39 using Vec = std::vector<T>;
40 using value_type = Vec::value_type;
41 using allocator_type = Vec::allocator_type;
42 using size_type = Vec::size_type;
43 using difference_type = Vec::difference_type;
44 using reference = Vec::reference;
45 using const_reference = Vec::const_reference;
46 using iterator = Vec::iterator;
47 using const_iterator = Vec::const_iterator;
48
49 void push_back( const T& value ) { m_members.push_back(value); }
50 void push_back( T&& value ) { m_members.push_back(std::move(value)); }
51
52 iterator erase( iterator pos ) { return m_members.erase(pos); }
53 iterator erase( const_iterator pos ) { return m_members.erase(pos); }
54
55 iterator begin() noexcept { return m_members.begin(); }
56 const_iterator begin() const noexcept { return m_members.begin(); }
57 iterator end() noexcept { return m_members.end(); }
58 const_iterator end() const noexcept { return m_members.end(); }
59
60 size_type size() const noexcept { return m_members.size(); }
61 bool empty() const noexcept { return m_members.empty(); }
62
63 reference front() { return m_members.front(); }
64 const_reference front() const { return m_members.front(); }
65
66 reference back() { return m_members.back(); }
67 const_reference back() const { return m_members.back(); }
68
69 reference operator[]( size_type pos ) { return m_members.operator[](pos); }
70 const_reference operator[]( size_type pos ) const { return m_members.operator[](pos); }
71
72
73 static bool lessThan(const MemberDef *md1,const MemberDef *md2)
74 {
75 return genericCompareMembers(md1,md2)<0;
76 }
77 void sort()
78 {
79 std::stable_sort(m_members.begin(),m_members.end(),lessThan);
80 }
81 void inSort(MemberDef *md)
82 {
83 m_members.insert( std::upper_bound( m_members.begin(), m_members.end(), md, lessThan), md);
84 }
85 void remove(const MemberDef *md)
86 {
87 auto it = std::find(m_members.begin(),m_members.end(),md);
88 if (it!=m_members.end()) erase(it);
89 }
90 bool contains(const MemberDef *md) const
91 {
92 return std::find(m_members.begin(),m_members.end(),md)!=m_members.end();
93 }
94 const MemberDef *find(const DString &name) const
95 {
96 auto it = std::find_if(m_members.begin(),m_members.end(),[name=name](auto &el) { return el->name()==name; });
97 if (it != m_members.end())
98 {
99 return *it;
100 }
101 return nullptr;
102 }
103 MemberDef *find(const DString &name)
104 {
105 return const_cast<MemberDef *>(static_cast<const MemberVector *>(this)->find(name));
106 }
107 const MemberDef *findRev(const DString &name) const
108 {
109 auto it = std::find_if(m_members.rbegin(),m_members.rend(),[name=name](auto &el) { return el->name()==name; });
110 if (it != m_members.rend())
111 {
112 return *it;
113 }
114 return nullptr;
115 }
117 {
118 return const_cast<MemberDef *>(static_cast<const MemberVector *>(this)->findRev(name));
119 }
120 protected:
122};
123
124/** A list of MemberDef objects as shown in documentation sections. */
125class MemberList final : public MemberVector
126{
127 public:
129 ~MemberList();
133
134 int numDecMembers(const ClassDef *inheritedFrom) const
135 { return countDecMembers(inheritedFrom).first; }
136 int numDecMembers() const
137 { ASSERT(m_numDecMembers!=-1); return m_numDecMembers; }
138 int numDecEnumValues() const { return m_numDecEnumValues; }
140 int numDocEnumValues() const { return m_numDocEnumValues; }
141 bool needsSorting() const { return m_needsSorting; }
142 void countDecMembers() const;
143 std::pair<int,int> countDecMembers(const ClassDef *inheritedFrom) const;
144 void countDocMembers();
145 int countInheritableMembers(const ClassDef *inheritedFrom) const;
146 void writePlainDeclarations(OutputList &ol,bool inGroup,
147 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd, const GroupDef *gd,const ModuleDef *mod,
148 int indentLevel,const ClassDef *inheritedFrom,const DString &inheritId) const;
150 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
151 const DString &title,const DString &subtitle,
152 bool showEnumValues=false,bool showInline=false,
153 const ClassDef *inheritedFrom=nullptr,MemberListType lt=MemberListType::PubMethods(),bool showSectionTitle=true) const;
154 void writeDocumentation(OutputList &ol,const DString &scopeName,
155 const Definition *container,const DString &title, const DString &anchor,
156 bool showEnumValues=false,bool showInline=false) const;
159 const DString &scopeName, const DefinitionMutable *container, int hierarchyLevel=0) const;
160 void writeTagFile(TextStream &,bool useQualifiedName=false,bool showNamespaceMembers=true);
161 bool declVisible() const;
162 void addMemberGroup(MemberGroup *mg);
163 void addListReferences(const Definition *def);
164 void addRequirementReferences(const Definition *def);
166 void setNeedsSorting(bool b);
169 void setAnchors();
170
171 private:
172 int countEnumValues(const MemberDef *md) const;
173 mutable int m_numDecMembers; // number of members in the brief part of the memberlist
175 int m_numDocMembers; // number of members in the detailed part of the memberlist
181};
182
183class MemberLinkedRefMap final : public LinkedRefMap<const MemberDef>
184{
185};
186
187class MemberLists final : public std::vector< std::unique_ptr<MemberList> >
188{
189 public:
190 MemberLists() = default;
191 ~MemberLists() = default;
192 const std::unique_ptr<MemberList> &get(MemberListType lt,MemberListContainer con)
193 {
194 // find the list with the given type
195 auto it = std::find_if(begin(),end(),[&lt](const auto &ml) { return ml->listType()==lt; });
196 if (it!=end()) return *it;
197 // or create a new list if it is not found
198 emplace_back(std::make_unique<MemberList>(lt,con));
199 return back();
200 }
201
202 private:
204};
205
206
207#endif
A abstract class representing of a compound symbol.
Definition classdef.h:100
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
The common base class of all entity definitions found in the sources.
Definition definition.h:77
A model of a file symbol.
Definition filedef.h:97
A model of a group of symbols.
Definition groupdef.h:48
Container class representing a vector of objects with keys.
Definition linkedmap.h:232
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
A class representing a group of members.
Definition membergroup.h:42
bool needsSorting() const
Definition memberlist.h:141
void addListReferences(const Definition *def)
int numDecEnumValues() const
Definition memberlist.h:138
int m_numDecEnumValues
Definition memberlist.h:174
int numDocMembers() const
Definition memberlist.h:139
int numDocEnumValues() const
Definition memberlist.h:140
int countEnumValues(const MemberDef *md) const
void writeTagFile(TextStream &, bool useQualifiedName=false, bool showNamespaceMembers=true)
int m_numDocMembers
Definition memberlist.h:175
int m_numDecMembers
Definition memberlist.h:173
MemberListContainer container() const
Definition memberlist.h:132
MemberList(MemberListType lt, MemberListContainer container)
int numDecMembers() const
Definition memberlist.h:136
MemberGroupRefList m_memberGroupRefList
Definition memberlist.h:177
bool m_needsSorting
Definition memberlist.h:180
void writeDocumentationPage(OutputList &ol, const DString &scopeName, const DefinitionMutable *container, int hierarchyLevel=0) const
void setAnonymousEnumType()
int countInheritableMembers(const ClassDef *inheritedFrom) const
int m_numDocEnumValues
Definition memberlist.h:176
MemberListContainer m_container
Definition memberlist.h:178
void setNeedsSorting(bool b)
void writeSimpleDocumentation(OutputList &ol, const Definition *container) const
void writeDeclarations(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, const DString &title, const DString &subtitle, bool showEnumValues=false, bool showInline=false, const ClassDef *inheritedFrom=nullptr, MemberListType lt=MemberListType::PubMethods(), bool showSectionTitle=true) const
Writes the list of members to the output.
void writeDocumentation(OutputList &ol, const DString &scopeName, const Definition *container, const DString &title, const DString &anchor, bool showEnumValues=false, bool showInline=false) const
MemberListType listType() const
Definition memberlist.h:131
void addRequirementReferences(const Definition *def)
void countDecMembers() const
void countDocMembers()
MemberListType m_listType
Definition memberlist.h:179
void writePlainDeclarations(OutputList &ol, bool inGroup, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, int indentLevel, const ClassDef *inheritedFrom, const DString &inheritId) const
void findSectionsInDocumentation(const Definition *d)
void addMemberGroup(MemberGroup *mg)
void setAnchors()
int numDecMembers(const ClassDef *inheritedFrom) const
Definition memberlist.h:134
bool declVisible() const
const MemberGroupRefList & getMemberGroupList() const
Definition memberlist.h:167
Wrapper class for the MemberListType type.
Definition types.h:346
MemberLists()=default
const std::unique_ptr< MemberList > & get(MemberListType lt, MemberListContainer con)
Definition memberlist.h:192
~MemberLists()=default
A vector of MemberDef object.
Definition memberlist.h:36
const_reference operator[](size_type pos) const
Definition memberlist.h:70
Vec::difference_type difference_type
Definition memberlist.h:43
iterator erase(const_iterator pos)
Definition memberlist.h:53
std::vector< T > Vec
Definition memberlist.h:39
reference back()
Definition memberlist.h:66
reference operator[](size_type pos)
Definition memberlist.h:69
void remove(const MemberDef *md)
Definition memberlist.h:85
void sort()
Definition memberlist.h:77
Vec::size_type size_type
Definition memberlist.h:42
static bool lessThan(const MemberDef *md1, const MemberDef *md2)
Definition memberlist.h:73
reference front()
Definition memberlist.h:63
const_reference back() const
Definition memberlist.h:67
const_iterator end() const noexcept
Definition memberlist.h:58
bool empty() const noexcept
Definition memberlist.h:61
Vec::allocator_type allocator_type
Definition memberlist.h:41
const MemberDef * findRev(const DString &name) const
Definition memberlist.h:107
MemberDef * T
Definition memberlist.h:38
void push_back(T &&value)
Definition memberlist.h:50
const_iterator begin() const noexcept
Definition memberlist.h:56
const MemberDef * find(const DString &name) const
Definition memberlist.h:94
iterator end() noexcept
Definition memberlist.h:57
iterator erase(iterator pos)
Definition memberlist.h:52
bool contains(const MemberDef *md) const
Definition memberlist.h:90
MemberDef * findRev(const DString &name)
Definition memberlist.h:116
void inSort(MemberDef *md)
Definition memberlist.h:81
Vec::value_type value_type
Definition memberlist.h:40
size_type size() const noexcept
Definition memberlist.h:60
const_reference front() const
Definition memberlist.h:64
iterator begin() noexcept
Definition memberlist.h:55
void push_back(const T &value)
Definition memberlist.h:49
Vec::const_iterator const_iterator
Definition memberlist.h:47
Vec::iterator iterator
Definition memberlist.h:46
MemberDef * find(const DString &name)
Definition memberlist.h:103
Vec::reference reference
Definition memberlist.h:44
Vec::const_reference const_reference
Definition memberlist.h:45
An abstract interface of a namespace symbol.
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:311
Text streaming class that buffers data.
Definition textstream.h:36
#define NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
#define ONLY_DEFAULT_MOVABLE(cls)
Macro to help implementing the rule of 5 for a class that can be moved but not copied.
Definition construct.h:44
DirIterator begin(DirIterator it) noexcept
Definition dir.cpp:176
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:181
int genericCompareMembers(const MemberDef *c1, const MemberDef *c2)
#define ASSERT(x)
Definition message.h:142
This file contains a number of basic enums and types.
MemberListContainer
Definition types.h:472