18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
extern const char* base09;
extern const char* base0A;
extern const char* base0B;
extern const char* base0C;
extern const char* base0D;
extern const char* base0E;
extern const char* base0F;
}
// Helper class to dump data structures into a graphiz dot file.
class GraphVizBuilder
{
public:
GraphVizBuilder( ostream& output, bool vertical = false );
~GraphVizBuilder();
ostream& indent() const;
ostream& newLine() const;
ostream& output() const { return m_output; }
static const char* BGColor;
static const char* TextColor;
static const char* GetNodeColor( uint32_t id );
uint32_t getNodeId( const void* pNodeAddress );
uint32_t currentNodeId() const { return m_currentNode; }
bool wasNodeGenerated( const void* pNodeAddress ) const;
template< typename F > void queueWork( F&& func )
{
m_workQueue.push( forward< F >( func ) );
}
void addEdge( uint32_t fromId, uint32_t toId );
class Indention
{
public:
Indention( GraphVizBuilder& builder );
~Indention();
private:
GraphVizBuilder& m_builder;
};
class Table
{
public:
Table( GraphVizBuilder& builder, const char* pColor = TextColor );
~Table();
private:
GraphVizBuilder& m_builder;
};
class Row
{
public:
Row( GraphVizBuilder& builder );
~Row();
private:
GraphVizBuilder& m_builder;
};
class Cell
{
public:
Cell( GraphVizBuilder& builder );
~Cell();
private:
GraphVizBuilder& m_builder;
};
class Color
{
public:
Color( GraphVizBuilder& builder, const char* pColor = TextColor );
~Color();
private:
GraphVizBuilder& m_builder;
};
class Node
{
public:
Node( GraphVizBuilder& builder, const void* pAddress, const char* pTitle = nullptr );
~Node();
private:
GraphVizBuilder& m_builder;
};
private:
ostream& m_output;
unordered_map< const void*, uint32_t > m_nodesDict;
unordered_set< const void* > m_generatedNodes;
queue< function< void() > > m_workQueue;
uint32_t m_indention = 1;
uint32_t m_nodeCount = 0;
uint32_t m_currentNode = 0;
uint32_t m_portCount = 0;
};
}
#endif
|
|
|
|
|
|
|
>
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
extern const char* base09;
extern const char* base0A;
extern const char* base0B;
extern const char* base0C;
extern const char* base0D;
extern const char* base0E;
extern const char* base0F;
} // namespace colors
// Helper class to dump data structures into a graphiz dot file.
class GraphVizBuilder
{
public:
GraphVizBuilder( ostream& output, bool vertical = false );
~GraphVizBuilder();
ostream& indent() const;
ostream& newLine() const;
ostream& output() const { return m_output; }
static const char* BGColor;
static const char* TextColor;
static const char* GetNodeColor( uint32_t id );
uint32_t getNodeId( const void* pNodeAddress );
uint32_t currentNodeId() const { return m_currentNode; }
bool wasNodeGenerated( const void* pNodeAddress ) const;
template< typename F > void queueWork( F&& func )
{
m_workQueue.push( forward< F >( func ) );
}
void addEdge( uint32_t fromId, uint32_t toId );
class Indention
{
public:
Indention( GraphVizBuilder& builder );
~Indention();
private:
GraphVizBuilder& m_builder;
};
class Table
{
public:
Table( GraphVizBuilder& builder, const char* pColor = TextColor );
~Table();
private:
GraphVizBuilder& m_builder;
};
class Row
{
public:
Row( GraphVizBuilder& builder );
~Row();
private:
GraphVizBuilder& m_builder;
};
class Cell
{
public:
Cell( GraphVizBuilder& builder );
~Cell();
private:
GraphVizBuilder& m_builder;
};
class Color
{
public:
Color( GraphVizBuilder& builder, const char* pColor = TextColor );
~Color();
private:
GraphVizBuilder& m_builder;
};
class Node
{
public:
Node( GraphVizBuilder& builder, const void* pAddress, const char* pTitle = nullptr );
~Node();
private:
GraphVizBuilder& m_builder;
};
private:
ostream& m_output;
unordered_map< const void*, uint32_t > m_nodesDict;
unordered_set< const void* > m_generatedNodes;
queue< function< void() > > m_workQueue;
uint32_t m_indention = 1;
uint32_t m_nodeCount = 0;
uint32_t m_currentNode = 0;
uint32_t m_portCount = 0;
};
} // namespace goose::util
#endif
|