Doxygen
Loading...
Searching...
No Matches
dotincldepgraph.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#include "dotincldepgraph.h"
17#include "dotnode.h"
18#include "util.h"
19#include "config.h"
20#include "textstream.h"
21
22void DotInclDepGraph::buildGraph(DotNode *n,const FileDef *fd,int distance)
23{
24 const IncludeInfoList &includeFiles = m_inverse ? fd->includedByFileList() : fd->includeFileList();
25 for (const auto &ii : includeFiles)
26 {
27 const FileDef *bfd = ii.fileDef;
28 DString in = ii.includeName;
29 //printf(">>>> in='%s' bfd=%p\n",qPrint(ii->includeName),bfd);
30 bool doc=true,src=false;
31 if (bfd)
32 {
33 in = bfd->absFilePath();
34 doc = bfd->isLinkable() && !bfd->isHidden();
35 src = bfd->generateSourceFile();
36 }
37 if (doc || src || !Config_getBool(HIDE_UNDOC_RELATIONS))
38 {
39 DString url="";
40 if (bfd) url=bfd->getOutputFileBase();
41 if (!doc && src)
42 {
43 url=bfd->getSourceFileBase();
44 }
45 auto it = m_usedNodes.find(in.str());
46 if (it!=m_usedNodes.end()) // file is already a node in the graph
47 {
48 DotNode *bn = it->second;
50 bn->addParent(n);
51 bn->setDistance(distance);
52 }
53 else
54 {
55 DString tmp_url;
56 DString tooltip;
57 if (bfd)
58 {
59 tmp_url=doc || src ? bfd->getReference()+"$"+url : DString();
60 tooltip = bfd->briefDescriptionAsTooltip();
61 }
62 DotNode *bn = new DotNode(this,
63 ii.includeName, // label
64 tooltip, // tip
65 tmp_url, // url
66 false, // rootNode
67 nullptr); // cd
69 bn->addParent(n);
70 m_usedNodes.emplace(in.str(),bn);
71 bn->setDistance(distance);
72
73 if (bfd) buildGraph(bn,bfd,distance+1);
74 }
75 }
76 }
77}
78
80{
81 while (!queue.empty() && maxNodes>0)
82 {
83 DotNode *n = queue.front();
84 queue.pop_front();
85 if (!n->isVisible() && n->distance()<=Config_getInt(MAX_DOT_GRAPH_DEPTH)) // not yet processed
86 {
87 n->markAsVisible();
88 maxNodes--;
89 // add direct children
90 for (const auto &dn : n->children())
91 {
92 queue.push_back(dn);
93 }
94 }
95 }
96}
97
99{
100 while (!queue.empty())
101 {
102 DotNode *n = queue.front();
103 queue.pop_front();
104 if (n->isVisible() && n->isTruncated()==DotNode::Unknown)
105 {
106 bool truncated = false;
107 for (const auto &dn : n->children())
108 {
109 if (!dn->isVisible())
110 {
111 truncated = true;
112 }
113 else
114 {
115 queue.push_back(dn);
116 }
117 }
118 n->markAsTruncated(truncated);
119 }
120 }
121}
122
124{
125 m_inverse = inverse;
126 ASSERT(fd!=nullptr);
129 DString tmp_url=fd->getReference()+"$"+fd->getOutputFileBase();
130 DString tooltip = fd->briefDescriptionAsTooltip();
131 m_startNode = new DotNode(this,
132 fd->docName(),
133 tooltip,
134 tmp_url,
135 true); // root node
137 m_usedNodes.emplace(fd->absFilePath().str(),m_startNode);
139
140 int maxNodes = Config_getInt(DOT_GRAPH_MAX_NODES);
141 DotNodeDeque openNodeQueue;
142 openNodeQueue.push_back(m_startNode);
143 determineVisibleNodes(openNodeQueue,maxNodes);
144 openNodeQueue.clear();
145 openNodeQueue.push_back(m_startNode);
146 determineTruncatedNodes(openNodeQueue);
147}
148
153
155{
156 if (m_inverse)
157 {
158 return m_inclByDepFileName;
159 }
160 else
161 {
162 return m_inclDepFileName;
163 }
164}
165
171
173{
174 if (m_inverse)
175 {
176 return escapeCharsInString(m_startNode->label(),false) + "dep";
177 }
178 else
179 {
180 return escapeCharsInString(m_startNode->label(),false);
181 }
182}
183
185 GraphOutputFormat graphFormat,
186 EmbeddedOutputFormat textFormat,
187 const DString &path,
188 const DString &fileName,
189 const DString &relPath,
190 bool generateImageMap,
191 int graphId)
192{
194
195 return DotGraph::writeGraph(out, graphFormat, textFormat, path, fileName, relPath, generateImageMap, graphId);
196}
197
199{
200 return m_startNode->children().empty();
201}
202
204{
205 return numNodes()>=Config_getInt(DOT_GRAPH_MAX_NODES);
206}
207
209{
210 return static_cast<int>(m_startNode->children().size());
211}
212
214{
215 for (const auto &[name,node] : m_usedNodes)
216 {
217 node->writeXML(t,false);
218 }
219}
220
222{
223 for (const auto &[name,node] : m_usedNodes)
224 {
225 node->writeDocbook(t,false);
226 }
227}
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:89
DString()=default
const std::string & str() const
Definition dstring.h:634
virtual bool isLinkable() const =0
virtual DString briefDescriptionAsTooltip() const =0
virtual bool isHidden() const =0
virtual DString getReference() const =0
virtual DString getSourceFileBase() const =0
virtual DString getOutputFileBase() const =0
static void computeGraph(DotNode *root, GraphType gt, GraphOutputFormat format, const DString &rank, bool renderParents, bool backArrows, const DString &title, DString &graphStr)
Definition dotgraph.cpp:298
DString m_theGraph
Definition dotgraph.h:95
GraphOutputFormat m_graphFormat
Definition dotgraph.h:85
bool m_doNotAddImageToIndex
Definition dotgraph.h:97
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
Definition dotgraph.cpp:113
friend class DotNode
Definition dotgraph.h:36
void computeTheGraph() override
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
void determineVisibleNodes(DotNodeDeque &queue, int &maxNodes)
void writeXML(TextStream &t)
DString m_inclDepFileName
DotNodeMap m_usedNodes
DString getMapLabel() const override
void determineTruncatedNodes(DotNodeDeque &queue)
void writeDocbook(TextStream &t)
DotInclDepGraph(const FileDef *fd, bool inverse)
bool isTooBig() const
DotNode * m_startNode
DString getBaseName() const override
DString m_inclByDepFileName
void buildGraph(DotNode *n, const FileDef *fd, int distance)
~DotInclDepGraph() override
bool isTrivial() const
int distance() const
Definition dotnode.h:107
void setDistance(int distance)
Definition dotnode.cpp:390
void markAsVisible(bool b=true)
Definition dotnode.h:121
static void deleteNodes(DotNode *node)
Definition dotnode.cpp:404
void addParent(DotNode *n)
Definition dotnode.cpp:355
bool isVisible() const
Definition dotnode.h:105
DotNode(DotGraph *graph, const DString &lab, const DString &tip, const DString &url, bool rootNode=false, const ClassDef *cd=nullptr)
Definition dotnode.cpp:326
void addChild(DotNode *n, EdgeInfo::Colors edgeColor=EdgeInfo::Purple, EdgeInfo::Styles edgeStyle=EdgeInfo::Solid, const DString &edgeLab=DString(), const DString &edgeURL=DString(), int edgeLabColor=-1)
Definition dotnode.cpp:338
@ Unknown
Definition dotnode.h:77
DotNode & markAsTruncated(bool b=true)
Definition dotnode.h:122
DString label() const
Definition dotnode.h:103
const DotNodeRefVector & children() const
Definition dotnode.h:123
TruncState isTruncated() const
Definition dotnode.h:106
@ Solid
Definition dotnode.h:36
A model of a file symbol.
Definition filedef.h:99
virtual bool generateSourceFile() const =0
virtual DString absFilePath() const =0
virtual const DString & docName() const =0
virtual DString includeDependencyGraphFileName() const =0
virtual const IncludeInfoList & includeFileList() const =0
virtual DString includedByDependencyGraphFileName() const =0
virtual const IncludeInfoList & includedByFileList() const =0
Text streaming class that buffers data.
Definition textstream.h:36
#define Config_getInt(name)
Definition config.h:34
#define Config_getBool(name)
Definition config.h:33
@ Dependency
Definition dotgraph.h:31
EmbeddedOutputFormat
Definition dotgraph.h:30
GraphOutputFormat
Definition dotgraph.h:29
#define ASSERT(x)
Definition dstring.h:29
DString escapeCharsInString(const DString &name, bool allowDots, bool allowUnderscore)
Definition util.cpp:2755
A bunch of utility functions.