summaryrefslogtreecommitdiffstats
path: root/src/stlsupport.cpp
diff options
context:
space:
mode:
authorDimitri van Heesch <doxygen@gmail.com>2019-12-19 13:16:37 (GMT)
committerDimitri van Heesch <doxygen@gmail.com>2019-12-19 13:16:37 (GMT)
commit742927e23a728fffe53e7bfd1d220f7df4c6f552 (patch)
treeb6ebd4ed848f3d8475cff9a0b5bfae8c0b91b5b4 /src/stlsupport.cpp
parentb9b3e00db89df02a0a6c03ebc5e9d4a0a3e926a7 (diff)
downloadDoxygen-742927e23a728fffe53e7bfd1d220f7df4c6f552.zip
Doxygen-742927e23a728fffe53e7bfd1d220f7df4c6f552.tar.gz
Doxygen-742927e23a728fffe53e7bfd1d220f7df4c6f552.tar.bz2
Extend built-in STL support with more classes
Diffstat (limited to 'src/stlsupport.cpp')
-rw-r--r--src/stlsupport.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/stlsupport.cpp b/src/stlsupport.cpp
new file mode 100644
index 0000000..096291a
--- /dev/null
+++ b/src/stlsupport.cpp
@@ -0,0 +1,270 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2019 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "stlsupport.h"
+#include "entry.h"
+#include "config.h"
+
+/** A struct contained the data for an STL class */
+struct STLInfo
+{
+ const char *className;
+ const char *baseClass1;
+ const char *baseClass2;
+ const char *templType1;
+ const char *templName1;
+ const char *templType2;
+ const char *templName2;
+ bool virtualInheritance;
+ bool iterators;
+};
+
+static STLInfo g_stlinfo[] =
+{
+ // className baseClass1 baseClass2 templType1 templName1 templType2 templName2 virtInheritance // iterators
+ { "allocator", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "auto_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // deprecated
+ { "smart_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
+ { "unique_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
+ { "shared_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++14
+ { "weak_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
+ { "atomic", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
+ { "atomic_ref", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++20
+ { "lock_guard", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
+ { "unique_lock", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++11
+ { "shared_lock", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE }, // C++14
+ { "ios_base", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "error_code", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "error_category", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "system_error", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "error_condition", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "thread", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "jthread", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "mutex", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "timed_mutex", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "recursive_mutex", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "recursive_timed_mutex",0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++11
+ { "shared_mutex", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++17
+ { "shared_timed_mutex", 0, 0, 0, 0, 0, 0, FALSE, FALSE }, // C++14
+ { "basic_ios", "ios_base", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_istream", "basic_ios<Char>", 0, "Char", 0, 0, 0, TRUE, FALSE },
+ { "basic_ostream", "basic_ios<Char>", 0, "Char", 0, 0, 0, TRUE, FALSE },
+ { "basic_iostream", "basic_istream<Char>", "basic_ostream<Char>", "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_ifstream", "basic_istream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_ofstream", "basic_ostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_fstream", "basic_iostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_istringstream", "basic_istream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_ostringstream", "basic_ostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_stringstream", "basic_iostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "ios", "basic_ios<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wios", "basic_ios<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "istream", "basic_istream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wistream", "basic_istream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ostream", "basic_ostream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wostream", "basic_ostream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ifstream", "basic_ifstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wifstream", "basic_ifstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ofstream", "basic_ofstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wofstream", "basic_ofstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "fstream", "basic_fstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wfstream", "basic_fstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "istringstream", "basic_istringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wistringstream", "basic_istringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ostringstream", "basic_ostringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wostringstream", "basic_ostringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "stringstream", "basic_stringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wstringstream", "basic_stringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "basic_string", 0, 0, "Char", 0, 0, 0, FALSE, TRUE },
+ { "string", "basic_string<char>", 0, 0, 0, 0, 0, FALSE, TRUE },
+ { "wstring", "basic_string<wchar_t>", 0, 0, 0, 0, 0, FALSE, TRUE },
+ { "u8string", "basic_string<char8_t>", 0, 0, 0, 0, 0, FALSE, TRUE }, // C++20
+ { "u16string", "basic_string<char16_t>", 0, 0, 0, 0, 0, FALSE, TRUE }, // C++11
+ { "u32string", "basic_string<char32_t>", 0, 0, 0, 0, 0, FALSE, TRUE }, // C++11
+ { "basic_string_view", 0, 0, "Char", 0, 0, 0, FALSE, TRUE },
+ { "string_view", "basic_string_view<char>", 0, 0, 0, 0, 0, FALSE, TRUE }, // C++17
+ { "wstring_view", "basic_string_view<wchar_t>", 0, 0, 0, 0, 0, FALSE, TRUE }, // C++17
+ { "u8string_view", "basic_string_view<char8_t>", 0, 0, 0, 0, 0, FALSE, TRUE }, // C++20
+ { "u16string_view", "basic_string_view<char16_t>", 0, 0, 0, 0, 0, FALSE, TRUE }, // C++17
+ { "u32string_view", "basic_string_view<char32_t>", 0, 0, 0, 0, 0, FALSE, TRUE }, // C++17
+ { "complex", 0, 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bitset", 0, 0, "Bits", 0, 0, 0, FALSE, FALSE },
+ { "deque", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
+ { "list", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
+ { "forward_list", 0, 0, "T", "elements", 0, 0, FALSE, TRUE }, // C++11
+ { "map", 0, 0, "K", "keys", "T", "elements", FALSE, TRUE },
+ { "unordered_map", 0, 0, "K", "keys", "T", "elements", FALSE, TRUE }, // C++11
+ { "multimap", 0, 0, "K", "keys", "T", "elements", FALSE, TRUE },
+ { "unordered_multimap", 0, 0, "K", "keys", "T", "elements", FALSE, TRUE }, // C++11
+ { "set", 0, 0, "K", "keys", 0, 0, FALSE, TRUE },
+ { "unordered_set", 0, 0, "K", "keys", 0, 0, FALSE, TRUE }, // C++11
+ { "multiset", 0, 0, "K", "keys", 0, 0, FALSE, TRUE },
+ { "unordered_multiset", 0, 0, "K", "keys", 0, 0, FALSE, TRUE }, // C++11
+ { "array", 0, 0, "T", "elements", 0, 0, FALSE, TRUE }, // C++11
+ { "vector", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
+ { "span", 0, 0, "T", "elements", 0, 0, FALSE, TRUE }, // C++20
+ { "queue", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "priority_queue", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "stack", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "valarray", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "exception", 0, 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bad_alloc", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bad_cast", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bad_typeid", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "logic_error", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ios_base::failure", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "runtime_error", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bad_exception", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "domain_error", "logic_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "invalid_argument", "logic_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "length_error", "logic_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "out_of_range", "logic_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "range_error", "runtime_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "overflow_error", "runtime_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "underflow_error", "runtime_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { 0, 0, 0, 0, 0, 0, 0, FALSE, FALSE }
+};
+
+static void addSTLMember(const std::shared_ptr<Entry> &root,const char *type,const char *name)
+{
+ std::shared_ptr<Entry> memEntry = std::make_shared<Entry>();
+ memEntry->name = name;
+ memEntry->type = type;
+ memEntry->protection = Public;
+ memEntry->section = Entry::VARIABLE_SEC;
+ memEntry->brief = "STL member";
+ memEntry->hidden = FALSE;
+ memEntry->artificial = TRUE;
+ root->moveToSubEntryAndKeep(memEntry);
+}
+
+static void addSTLIterator(const std::shared_ptr<Entry> &classEntry,const char *name)
+{
+ std::shared_ptr<Entry> iteratorClassEntry = std::make_shared<Entry>();
+ iteratorClassEntry->fileName = "[STL]";
+ iteratorClassEntry->startLine = 1;
+ iteratorClassEntry->name = name;
+ iteratorClassEntry->section = Entry::CLASS_SEC;
+ iteratorClassEntry->brief = "STL iterator class";
+ iteratorClassEntry->hidden = FALSE;
+ iteratorClassEntry->artificial= TRUE;
+ classEntry->moveToSubEntryAndKeep(iteratorClassEntry);
+}
+
+static void addSTLClass(const std::shared_ptr<Entry> &root,const STLInfo *info)
+{
+ //printf("Adding STL class %s\n",info->className);
+ QCString fullName = info->className;
+ fullName.prepend("std::");
+
+ // add fake Entry for the class
+ std::shared_ptr<Entry> classEntry = std::make_shared<Entry>();
+ classEntry->fileName = "[STL]";
+ classEntry->startLine = 1;
+ classEntry->name = fullName;
+ classEntry->section = Entry::CLASS_SEC;
+ classEntry->brief = "STL class";
+ classEntry->hidden = FALSE;
+ classEntry->artificial= TRUE;
+
+ // add template arguments to class
+ if (info->templType1)
+ {
+ ArgumentList al;
+ Argument a;
+ a.type="typename";
+ a.name=info->templType1;
+ al.push_back(a);
+ if (info->templType2) // another template argument
+ {
+ a.type="typename";
+ a.name=info->templType2;
+ al.push_back(a);
+ }
+ classEntry->tArgLists.push_back(al);
+ }
+ // add member variables
+ if (info->templName1)
+ {
+ addSTLMember(classEntry,info->templType1,info->templName1);
+ }
+ if (info->templName2)
+ {
+ addSTLMember(classEntry,info->templType2,info->templName2);
+ }
+ if (fullName=="std::auto_ptr" ||
+ fullName=="std::smart_ptr" ||
+ fullName=="std::shared_ptr" ||
+ fullName=="std::weak_ptr" ||
+ fullName=="std::unique_ptr")
+ {
+ std::shared_ptr<Entry> memEntry = std::make_shared<Entry>();
+ memEntry->name = "operator->";
+ memEntry->args = "()";
+ memEntry->type = "T*";
+ memEntry->protection = Public;
+ memEntry->section = Entry::FUNCTION_SEC;
+ memEntry->brief = "STL member";
+ memEntry->hidden = FALSE;
+ memEntry->artificial = FALSE;
+ classEntry->moveToSubEntryAndKeep(memEntry);
+ }
+ if (info->baseClass1)
+ {
+ classEntry->extends.push_back(BaseInfo(info->baseClass1,Public,info->virtualInheritance?Virtual:Normal));
+ }
+ if (info->baseClass2)
+ {
+ classEntry->extends.push_back(BaseInfo(info->baseClass2,Public,info->virtualInheritance?Virtual:Normal));
+ }
+ if (info->iterators)
+ {
+ // add iterator class
+ addSTLIterator(classEntry,fullName+"::iterator");
+ addSTLIterator(classEntry,fullName+"::const_iterator");
+ addSTLIterator(classEntry,fullName+"::reverse_iterator");
+ addSTLIterator(classEntry,fullName+"::const_reverse_iterator");
+ }
+ root->moveToSubEntryAndKeep(classEntry);
+}
+
+
+static void addSTLClasses(const std::shared_ptr<Entry> &root)
+{
+ std::shared_ptr<Entry> namespaceEntry = std::make_shared<Entry>();
+ namespaceEntry->fileName = "[STL]";
+ namespaceEntry->startLine = 1;
+ namespaceEntry->name = "std";
+ namespaceEntry->section = Entry::NAMESPACE_SEC;
+ namespaceEntry->brief = "STL namespace";
+ namespaceEntry->hidden = FALSE;
+ namespaceEntry->artificial= TRUE;
+
+ STLInfo *info = g_stlinfo;
+ while (info->className)
+ {
+ addSTLClass(namespaceEntry,info);
+ info++;
+ }
+
+ root->moveToSubEntryAndKeep(namespaceEntry);
+}
+
+void addSTLSupport(std::shared_ptr<Entry> &root)
+{
+ if (Config_getBool(BUILTIN_STL_SUPPORT))
+ {
+ addSTLClasses(root);
+ }
+}