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// own header
17#include "dotincldepgraph.h"
18
19// other includes
20#include "config.h"
21#include "dotnode.h"
22#include "filedef.h"
23#include "textstream.h"
24#include "util.h"
25
26void DotInclDepGraph::buildGraph(DotNode *n,const FileDef *fd,int distance)
27{
28 const IncludeInfoList &includeFiles = m_inverse ? fd->includedByFileList() : fd->includeFileList();
29 for (const auto &ii : includeFiles)
30 {
31 const FileDef *bfd = ii.fileDef;
32 DString in = ii.includeName;
33 //printf(">>>> in='%s' bfd=%p\n",qPrint(ii->includeName),bfd);
34 bool doc=true,src=false;
35 if (bfd)
36 {
37 in = bfd->absFilePath();
38 doc = bfd->isLinkable() && !bfd->isHidden();
39 src = bfd->generateSourceFile();
40 }
41 if (doc || src || !Config_getBool(HIDE_UNDOC_RELATIONS))
42 {
43 DString url="";
44 if (bfd) url=bfd->getOutputFileBase();
45 if (!doc && src)
46 {
47 url=bfd->getSourceFileBase();
48 }
49 auto it = m_usedNodes.find(in.str());
50 if (it!=m_usedNodes.end()) // file is already a node in the graph
51 {
52 DotNode *bn = it->second;
54 bn->addParent(n);
55 bn->setDistance(distance);
56 }
57 else
58 {
59 DString tmp_url;
60 DString tooltip;
61 if (bfd)
62 {
63 tmp_url=doc || src ? bfd->getReference()+"$"+url : DString();
64 tooltip = bfd->briefDescriptionAsTooltip();
65 }
66 DotNode *bn = new DotNode(this,
67 ii.includeName, // label
68 tooltip, // tip
69 tmp_url, // url
70 false, // rootNode
71 nullptr); // cd
73 bn->addParent(n);
74 m_usedNodes.emplace(in.str(),bn);
75 bn->setDistance(distance);
76
77 if (bfd) buildGraph(bn,bfd,distance+1);
78 }
79 }
80 }
81}
82
84{
85 while (!queue.empty() && maxNodes>0)
86 {
87 DotNode *n = queue.front();
88 queue.pop_front();
89 if (!n->isVisible() && n->distance()<=Config_getInt(MAX_DOT_GRAPH_DEPTH)) // not yet processed
90 {
91 n->markAsVisible();
92 maxNodes--;
93 // add direct children
94 for (const auto &dn : n->children())
95 {
96 queue.push_back(dn);
97 }
98 }
99 }
100}
101
103{
104 while (!queue.empty())
105 {
106 DotNode *n = queue.front();
107 queue.pop_front();
108 if (n->isVisible() && n->isTruncated()==DotNode::Unknown)
109 {
110 bool truncated = false;
111 for (const auto &dn : n->children())
112 {
113 if (!dn->isVisible())
114 {
115 truncated = true;
116 }
117 else
118 {
119 queue.push_back(dn);
120 }
121 }
122 n->markAsTruncated(truncated);
123 }
124 }
125}
126
128{
129 m_inverse = inverse;
130 ASSERT(fd!=nullptr);
133 DString tmp_url=fd->getReference()+"$"+fd->getOutputFileBase();
134 DString tooltip = fd->briefDescriptionAsTooltip();
135 m_startNode = new DotNode(this,
136 fd->docName(),
137 tooltip,
138 tmp_url,
139 true); // root node
141 m_usedNodes.emplace(fd->absFilePath().str(),m_startNode);
143
144 int maxNodes = Config_getInt(DOT_GRAPH_MAX_NODES);
145 DotNodeDeque openNodeQueue;
146 openNodeQueue.push_back(m_startNode);
147 determineVisibleNodes(openNodeQueue,maxNodes);
148 openNodeQueue.clear();
149 openNodeQueue.push_back(m_startNode);
150 determineTruncatedNodes(openNodeQueue);
151}
152
157
159{
160 if (m_inverse)
161 {
162 return m_inclByDepFileName;
163 }
164 else
165 {
166 return m_inclDepFileName;
167 }
168}
169
175
177{
178 if (m_inverse)
179 {
180 return escapeCharsInString(m_startNode->label(),false) + "dep";
181 }
182 else
183 {
184 return escapeCharsInString(m_startNode->label(),false);
185 }
186}
187
189 GraphOutputFormat graphFormat,
190 EmbeddedOutputFormat textFormat,
191 const DString &path,
192 const DString &fileName,
193 const DString &relPath,
194 bool generateImageMap,
195 int graphId)
196{
198
199 return DotGraph::writeGraph(out, graphFormat, textFormat, path, fileName, relPath, generateImageMap, graphId);
200}
201
203{
204 return m_startNode->children().empty();
205}
206
208{
209 return numNodes()>=Config_getInt(DOT_GRAPH_MAX_NODES);
210}
211
213{
214 return static_cast<int>(m_startNode->children().size());
215}
216
218{
219 for (const auto &[name,node] : m_usedNodes)
220 {
221 node->writeXML(t,false);
222 }
223}
224
226{
227 for (const auto &[name,node] : m_usedNodes)
228 {
229 node->writeDocbook(t,false);
230 }
231}
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
const std::string & str() const
Definition dstring.h:645
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:300
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:115
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:106
void setDistance(int distance)
Definition dotnode.cpp:392
void markAsVisible(bool b=true)
Definition dotnode.h:120
static void deleteNodes(DotNode *node)
Definition dotnode.cpp:406
void addParent(DotNode *n)
Definition dotnode.cpp:357
bool isVisible() const
Definition dotnode.h:104
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:340
@ Unknown
Definition dotnode.h:76
DotNode & markAsTruncated(bool b=true)
Definition dotnode.h:121
DString label() const
Definition dotnode.h:102
const DotNodeRefVector & children() const
Definition dotnode.h:122
TruncState isTruncated() const
Definition dotnode.h:105
@ Solid
Definition dotnode.h:35
A model of a file symbol.
Definition filedef.h:97
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 message.h:142
DString escapeCharsInString(const DString &name, bool allowDots, bool allowUnderscore)
Definition util.cpp:2688
A bunch of utility functions.