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 <vector>
20 #include <algorithm>
21 
22 #include "memberdef.h"
23 #include "linkedmap.h"
24 #include "types.h"
25 #include "membergroup.h"
26 
27 class GroupDef;
28 
29 int genericCompareMembers(const MemberDef *c1,const MemberDef *c2);
30 
31 /** A vector of MemberDef object */
32 class MemberVector
33 {
34   public:
35     /* --- standard vector interface ---- */
36     using Ptr = const MemberDef *;
37     using Vec = std::vector<Ptr>;
38     using iterator = typename Vec::iterator;
39     using const_iterator = typename Vec::const_iterator;
40     using value_type = const MemberDef *;
41     using const_reference = const value_type&;
push_back(const MemberDef * md)42     void push_back(const MemberDef *md)     { m_members.push_back(md); }
begin()43     iterator begin()                        { return m_members.begin();   }
end()44     iterator end()                          { return m_members.end();     }
begin()45     const_iterator begin() const            { return m_members.cbegin();  }
end()46     const_iterator end() const              { return m_members.cend();    }
empty()47     bool empty() const                      { return m_members.empty();   }
size()48     size_t size() const                     { return m_members.size();    }
front()49     const_reference front() const           { return m_members.front();   }
back()50     const_reference back() const            { return m_members.back();    }
51     const_reference operator[](int index) const { return m_members[index];    }
52     const_reference operator[](size_t index) const { return m_members[index];    }
53 
lessThan(const MemberDef * md1,const MemberDef * md2)54     static bool lessThan(const MemberDef *md1,const MemberDef *md2)
55     {
56       return genericCompareMembers(md1,md2)<0;
57     }
sort()58     void sort()
59     {
60       std::sort(m_members.begin(),m_members.end(),lessThan);
61     }
inSort(const MemberDef * md)62     void inSort(const MemberDef *md)
63     {
64       m_members.insert( std::upper_bound( m_members.begin(), m_members.end(), md, lessThan), md);
65     }
remove(const MemberDef * md)66     void remove(const MemberDef *md)
67     {
68       auto it = std::find(m_members.begin(),m_members.end(),md);
69       if (it!=m_members.end()) m_members.erase(it);
70     }
contains(const MemberDef * md)71     bool contains(const MemberDef *md)
72     {
73       auto it = std::find(m_members.begin(),m_members.end(),md);
74       return it!=m_members.end();
75     }
76   protected:
77     Vec m_members;
78 };
79 
80 /** A list of MemberDef objects as shown in documentation sections. */
81 class MemberList : public MemberVector
82 {
83   public:
84     MemberList(MemberListType lt,MemberListContainer container);
85    ~MemberList();
listType()86     MemberListType listType() const { return m_listType; }
87     static QCString listTypeAsString(MemberListType type);
container()88     MemberListContainer container() const { return m_container; }
89 
numDecMembers()90     int numDecMembers() const    { ASSERT(m_numDecMembers!=-1); return m_numDecMembers; }
numDecEnumValues()91     int numDecEnumValues() const { return m_numDecEnumValues; }
numDocMembers()92     int numDocMembers() const    { ASSERT(m_numDocMembers!=-1); return m_numDocMembers; }
numDocEnumValues()93     int numDocEnumValues() const { return m_numDocEnumValues; }
needsSorting()94     bool needsSorting() const    { return m_needsSorting; }
95     void countDecMembers();
96     void countDocMembers();
97     int countInheritableMembers(const ClassDef *inheritedFrom) const;
98     void writePlainDeclarations(OutputList &ol,bool inGroup,
99                const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd, const GroupDef *gd,
100                int indentLevel,const ClassDef *inheritedFrom,const QCString &inheritId) const;
101     void writeDeclarations(OutputList &ol,
102                const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
103                const QCString &title,const QCString &subtitle,
104                bool showEnumValues=FALSE,bool showInline=FALSE,
105                const ClassDef *inheritedFrom=0,MemberListType lt=MemberListType_pubMethods) const;
106     void writeDocumentation(OutputList &ol,const QCString &scopeName,
107                const Definition *container,const QCString &title,
108                bool showEnumValues=FALSE,bool showInline=FALSE) const;
109     void writeSimpleDocumentation(OutputList &ol,const Definition *container) const;
110     void writeDocumentationPage(OutputList &ol,
111                const QCString &scopeName, const DefinitionMutable *container) const;
112     void writeTagFile(TextStream &);
113     bool declVisible() const;
114     void addMemberGroup(MemberGroup *mg);
115     void addListReferences(Definition *def);
116     void findSectionsInDocumentation(const Definition *d);
117     void setNeedsSorting(bool b);
getMemberGroupList()118     const MemberGroupRefList &getMemberGroupList() const { return m_memberGroupRefList; }
119     void setAnonymousEnumType();
120     void setAnchors();
121 
122   private:
123     int countEnumValues(const MemberDef *md) const;
124     int m_numDecMembers; // number of members in the brief part of the memberlist
125     int m_numDecEnumValues;
126     int m_numDocMembers; // number of members in the detailed part of the memberlist
127     int m_numDocEnumValues;
128     MemberGroupRefList m_memberGroupRefList;
129     MemberListContainer m_container;
130     MemberListType m_listType;
131     bool m_needsSorting;
132 };
133 
134 class MemberLinkedRefMap : public LinkedRefMap<const MemberDef>
135 {
136 };
137 
138 class MemberLists : public std::vector< std::unique_ptr<MemberList> >
139 {
140   public:
141     MemberLists() = default;
get(MemberListType lt,MemberListContainer con)142     const std::unique_ptr<MemberList> &get(MemberListType lt,MemberListContainer con)
143     {
144       // find the list with the given type
145       auto it = std::find_if(begin(),end(),[&lt](const auto &ml) { return ml->listType()==lt; });
146       if (it!=end()) return *it;
147       // or create a new list if it is not found
148       emplace_back(std::make_unique<MemberList>(lt,con));
149       return back();
150     }
151 
152   private:
153     MemberLists(const MemberLists &) = delete;
154     MemberLists &operator=(const MemberLists &) = delete;
155 };
156 
157 
158 #endif
159