Doxygen
Loading...
Searching...
No Matches
stlsupport.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2019 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// own header
17#include "stlsupport.h"
18
19// other includes
20#include "entry.h"
21#include "config.h"
22
23/** A struct contained the data for an STL class */
24struct STLInfo
25{
26 const char *className;
27 const char *baseClass1;
28 const char *baseClass2;
29 const char *templType1;
30 const char *templName1;
31 const char *templType2;
32 const char *templName2;
35};
36
38{
39 // className baseClass1 baseClass2 templType1 templName1 templType2 templName2 virtInheritance // iterators
40 { "allocator", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, false },
41 { "auto_ptr", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // deprecated
42 { "smart_ptr", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++11
43 { "unique_ptr", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++11
44 { "shared_ptr", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++14
45 { "weak_ptr", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++11
46 { "atomic", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++11
47 { "atomic_ref", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++20
48 { "lock_guard", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++11
49 { "unique_lock", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++11
50 { "shared_lock", nullptr, nullptr, "T", "ptr", nullptr, nullptr, false, false }, // C++14
51 { "ios_base", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
52 { "error_code", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
53 { "error_category", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
54 { "system_error", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
55 { "error_condition", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
56 { "thread", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
57 { "jthread", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
58 { "mutex", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
59 { "timed_mutex", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
60 { "recursive_mutex", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
61 { "recursive_timed_mutex",nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++11
62 { "shared_mutex", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++17
63 { "shared_timed_mutex", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }, // C++14
64 { "basic_ios", "ios_base", nullptr, "Char", nullptr, nullptr, nullptr, false, false },
65 { "basic_istream", "basic_ios<Char>", nullptr, "Char", nullptr, nullptr, nullptr, true, false },
66 { "basic_ostream", "basic_ios<Char>", nullptr, "Char", nullptr, nullptr, nullptr, true, false },
67 { "basic_iostream", "basic_istream<Char>", "basic_ostream<Char>", "Char", nullptr, nullptr, nullptr, false, false },
68 { "basic_ifstream", "basic_istream<Char>", nullptr, "Char", nullptr, nullptr, nullptr, false, false },
69 { "basic_ofstream", "basic_ostream<Char>", nullptr, "Char", nullptr, nullptr, nullptr, false, false },
70 { "basic_fstream", "basic_iostream<Char>", nullptr, "Char", nullptr, nullptr, nullptr, false, false },
71 { "basic_istringstream", "basic_istream<Char>", nullptr, "Char", nullptr, nullptr, nullptr, false, false },
72 { "basic_ostringstream", "basic_ostream<Char>", nullptr, "Char", nullptr, nullptr, nullptr, false, false },
73 { "basic_stringstream", "basic_iostream<Char>", nullptr, "Char", nullptr, nullptr, nullptr, false, false },
74 { "ios", "basic_ios<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
75 { "wios", "basic_ios<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
76 { "istream", "basic_istream<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
77 { "wistream", "basic_istream<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
78 { "ostream", "basic_ostream<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
79 { "wostream", "basic_ostream<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
80 { "ifstream", "basic_ifstream<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
81 { "wifstream", "basic_ifstream<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
82 { "ofstream", "basic_ofstream<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
83 { "wofstream", "basic_ofstream<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
84 { "fstream", "basic_fstream<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
85 { "wfstream", "basic_fstream<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
86 { "istringstream", "basic_istringstream<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
87 { "wistringstream", "basic_istringstream<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
88 { "ostringstream", "basic_ostringstream<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
89 { "wostringstream", "basic_ostringstream<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
90 { "stringstream", "basic_stringstream<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
91 { "wstringstream", "basic_stringstream<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
92 { "basic_string", nullptr, nullptr, "Char", nullptr, nullptr, nullptr, false, true },
93 { "string", "basic_string<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true },
94 { "wstring", "basic_string<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true },
95 { "u8string", "basic_string<char8_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true }, // C++20
96 { "u16string", "basic_string<char16_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true }, // C++11
97 { "u32string", "basic_string<char32_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true }, // C++11
98 { "basic_string_view", nullptr, nullptr, "Char", nullptr, nullptr, nullptr, false, true },
99 { "string_view", "basic_string_view<char>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true }, // C++17
100 { "wstring_view", "basic_string_view<wchar_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true }, // C++17
101 { "u8string_view", "basic_string_view<char8_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true }, // C++20
102 { "u16string_view", "basic_string_view<char16_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true }, // C++17
103 { "u32string_view", "basic_string_view<char32_t>", nullptr, nullptr, nullptr, nullptr, nullptr, false, true }, // C++17
104 { "complex", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
105 { "bitset", nullptr, nullptr, "Bits", nullptr, nullptr, nullptr, false, false },
106 { "deque", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, true },
107 { "list", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, true },
108 { "forward_list", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, true }, // C++11
109 { "pair", nullptr, nullptr, "T1", "first_type", "T2", "second_type", false, false },
110 { "map", nullptr, nullptr, "K", "keys", "T", "elements", false, true },
111 { "unordered_map", nullptr, nullptr, "K", "keys", "T", "elements", false, true }, // C++11
112 { "multimap", nullptr, nullptr, "K", "keys", "T", "elements", false, true },
113 { "unordered_multimap", nullptr, nullptr, "K", "keys", "T", "elements", false, true }, // C++11
114 { "set", nullptr, nullptr, "K", "keys", nullptr, nullptr, false, true },
115 { "unordered_set", nullptr, nullptr, "K", "keys", nullptr, nullptr, false, true }, // C++11
116 { "multiset", nullptr, nullptr, "K", "keys", nullptr, nullptr, false, true },
117 { "unordered_multiset", nullptr, nullptr, "K", "keys", nullptr, nullptr, false, true }, // C++11
118 { "array", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, true }, // C++11
119 { "vector", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, true },
120 { "span", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, true }, // C++20
121 { "queue", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, false },
122 { "priority_queue", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, false },
123 { "stack", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, false },
124 { "valarray", nullptr, nullptr, "T", "elements", nullptr, nullptr, false, false },
125 { "exception", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
126 { "bad_alloc", "exception", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
127 { "bad_cast", "exception", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
128 { "bad_typeid", "exception", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
129 { "logic_error", "exception", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
130 { "ios_base::failure", "exception", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
131 { "runtime_error", "exception", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
132 { "bad_exception", "exception", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
133 { "domain_error", "logic_error", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
134 { "invalid_argument", "logic_error", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
135 { "length_error", "logic_error", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
136 { "out_of_range", "logic_error", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
137 { "range_error", "runtime_error", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
138 { "overflow_error", "runtime_error", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
139 { "underflow_error", "runtime_error", nullptr, nullptr, nullptr, nullptr, nullptr, false, false },
140 { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, false }
141};
142
143static void addSTLMember(const std::shared_ptr<Entry> &root,const char *type,const char *name)
144{
145 std::shared_ptr<Entry> memEntry = std::make_shared<Entry>();
146 memEntry->name = name;
147 memEntry->type = type;
148 memEntry->protection = Protection::Public;
149 memEntry->section = EntryType::makeVariable();
150 memEntry->brief = "STL member";
151 memEntry->hidden = false;
152 memEntry->artificial = true;
153 root->moveToSubEntryAndKeep(memEntry);
154}
155
156static void addSTLIterator(const std::shared_ptr<Entry> &classEntry,const DString &name)
157{
158 std::shared_ptr<Entry> iteratorClassEntry = std::make_shared<Entry>();
159 iteratorClassEntry->fileName = "[STL]";
160 iteratorClassEntry->startLine = 1;
161 iteratorClassEntry->name = name;
162 iteratorClassEntry->section = EntryType::makeClass();
163 iteratorClassEntry->brief = "STL iterator class";
164 iteratorClassEntry->hidden = false;
165 iteratorClassEntry->artificial= true;
166 classEntry->moveToSubEntryAndKeep(iteratorClassEntry);
167}
168
169static void addSTLClass(const std::shared_ptr<Entry> &root,const STLInfo *info)
170{
171 //printf("Adding STL class %s\n",info->className);
172 DString fullName = info->className;
173 fullName.prepend("std::");
174
175 // add fake Entry for the class
176 std::shared_ptr<Entry> classEntry = std::make_shared<Entry>();
177 classEntry->fileName = "[STL]";
178 classEntry->startLine = 1;
179 classEntry->name = fullName;
180 classEntry->section = EntryType::makeClass();
181 classEntry->brief = "STL class";
182 classEntry->hidden = false;
183 classEntry->artificial= true;
184
185 // add template arguments to class
186 if (info->templType1 != nullptr)
187 {
188 ArgumentList al;
189 Argument a;
190 a.type="typename";
191 a.name=info->templType1;
192 al.push_back(a);
193 if (info->templType2 != nullptr) // another template argument
194 {
195 a.type="typename";
196 a.name=info->templType2;
197 al.push_back(a);
198 }
199 classEntry->tArgLists.push_back(al);
200 }
201 // add member variables
202 if (info->templName1 != nullptr)
203 {
204 addSTLMember(classEntry,info->templType1,info->templName1);
205 }
206 if (info->templName2 != nullptr)
207 {
208 addSTLMember(classEntry,info->templType2,info->templName2);
209 }
210 if (fullName=="std::auto_ptr" ||
211 fullName=="std::smart_ptr" ||
212 fullName=="std::shared_ptr" ||
213 fullName=="std::weak_ptr" ||
214 fullName=="std::unique_ptr")
215 {
216 std::shared_ptr<Entry> memEntry = std::make_shared<Entry>();
217 memEntry->name = "operator->";
218 memEntry->args = "()";
219 memEntry->type = "T*";
220 memEntry->protection = Protection::Public;
221 memEntry->section = EntryType::makeFunction();
222 memEntry->brief = "STL member";
223 memEntry->hidden = false;
224 memEntry->artificial = false;
225 classEntry->moveToSubEntryAndKeep(memEntry);
226 }
227 Specifier virt = info->virtualInheritance ? Specifier::Virtual : Specifier::Normal;
228 if (info->baseClass1 != nullptr)
229 {
230 classEntry->extends.emplace_back(info->baseClass1, Protection::Public, virt);
231 }
232 if (info->baseClass2 != nullptr)
233 {
234 classEntry->extends.emplace_back(info->baseClass2, Protection::Public, virt);
235 }
236 if (info->iterators)
237 {
238 // add iterator class
239 addSTLIterator(classEntry,fullName+"::iterator");
240 addSTLIterator(classEntry,fullName+"::const_iterator");
241 addSTLIterator(classEntry,fullName+"::reverse_iterator");
242 addSTLIterator(classEntry,fullName+"::const_reverse_iterator");
243 }
244 root->moveToSubEntryAndKeep(classEntry);
245}
246
247
248static void addSTLClasses(const std::shared_ptr<Entry> &root)
249{
250 std::shared_ptr<Entry> namespaceEntry = std::make_shared<Entry>();
251 namespaceEntry->fileName = "[STL]";
252 namespaceEntry->startLine = 1;
253 namespaceEntry->name = "std";
254 namespaceEntry->section = EntryType::makeNamespace();
255 namespaceEntry->brief = "STL namespace";
256 namespaceEntry->hidden = false;
257 namespaceEntry->artificial= true;
258
259 STLInfo *info = g_stlinfo;
260 while (info->className != nullptr)
261 {
262 addSTLClass(namespaceEntry,info);
263 info++;
264 }
265
266 root->moveToSubEntryAndKeep(namespaceEntry);
267}
268
269void addSTLSupport(std::shared_ptr<Entry> &root)
270{
271 if (Config_getBool(BUILTIN_STL_SUPPORT))
272 {
273 addSTLClasses(root);
274 }
275}
This class contains the information about the argument of a function or template.
Definition arguments.h:27
DString name
Definition arguments.h:45
DString type
Definition arguments.h:43
This class represents an function or template argument list.
Definition arguments.h:66
void push_back(const Argument &a)
Definition arguments.h:103
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
DString & prepend(const char *s)
Definition dstring.h:515
#define Config_getBool(name)
Definition config.h:33
static void addSTLMember(const std::shared_ptr< Entry > &root, const char *type, const char *name)
static STLInfo g_stlinfo[]
static void addSTLClass(const std::shared_ptr< Entry > &root, const STLInfo *info)
static void addSTLIterator(const std::shared_ptr< Entry > &classEntry, const DString &name)
static void addSTLClasses(const std::shared_ptr< Entry > &root)
void addSTLSupport(std::shared_ptr< Entry > &root)
Add stub entries for the most used classes in the standard template library.
A struct contained the data for an STL class.
const char * templType2
const char * templName2
const char * baseClass2
const char * templType1
const char * baseClass1
bool iterators
const char * templName1
bool virtualInheritance
const char * className
Specifier
Definition types.h:80