|
@@ -59,6 +59,7 @@ class GraphWriter {
|
|
|
typedef typename GTraits::NodeType NodeType;
|
|
|
typedef typename GTraits::nodes_iterator node_iterator;
|
|
|
typedef typename GTraits::ChildIteratorType child_iterator;
|
|
|
+ DOTTraits DTraits;
|
|
|
|
|
|
// Writes the edge labels of the node to O and returns true if there are any
|
|
|
// edge labels not equal to the empty string "".
|
|
@@ -68,7 +69,7 @@ class GraphWriter {
|
|
|
bool hasEdgeSourceLabels = false;
|
|
|
|
|
|
for (unsigned i = 0; EI != EE && i != 64; ++EI, ++i) {
|
|
|
- std::string label = DOTTraits::getEdgeSourceLabel(Node, EI);
|
|
|
+ std::string label = DTraits.getEdgeSourceLabel(Node, EI);
|
|
|
|
|
|
if (label == "")
|
|
|
continue;
|
|
@@ -78,7 +79,7 @@ class GraphWriter {
|
|
|
if (i)
|
|
|
O << "|";
|
|
|
|
|
|
- O << "<s" << i << ">" << DOTTraits::getEdgeSourceLabel(Node, EI);
|
|
|
+ O << "<s" << i << ">" << DTraits.getEdgeSourceLabel(Node, EI);
|
|
|
}
|
|
|
|
|
|
if (EI != EE && hasEdgeSourceLabels)
|
|
@@ -89,10 +90,12 @@ class GraphWriter {
|
|
|
|
|
|
public:
|
|
|
GraphWriter(raw_ostream &o, const GraphType &g, bool SN) :
|
|
|
- O(o), G(g), ShortNames(SN) {}
|
|
|
+ O(o), G(g), ShortNames(SN) {
|
|
|
+ DTraits = DOTTraits(SN);
|
|
|
+}
|
|
|
|
|
|
void writeHeader(const std::string &Name) {
|
|
|
- std::string GraphName = DOTTraits::getGraphName(G);
|
|
|
+ std::string GraphName = DTraits.getGraphName(G);
|
|
|
|
|
|
if (!Name.empty())
|
|
|
O << "digraph \"" << DOT::EscapeString(Name) << "\" {\n";
|
|
@@ -101,14 +104,14 @@ public:
|
|
|
else
|
|
|
O << "digraph unnamed {\n";
|
|
|
|
|
|
- if (DOTTraits::renderGraphFromBottomUp())
|
|
|
+ if (DTraits.renderGraphFromBottomUp())
|
|
|
O << "\trankdir=\"BT\";\n";
|
|
|
|
|
|
if (!Name.empty())
|
|
|
O << "\tlabel=\"" << DOT::EscapeString(Name) << "\";\n";
|
|
|
else if (!GraphName.empty())
|
|
|
O << "\tlabel=\"" << DOT::EscapeString(GraphName) << "\";\n";
|
|
|
- O << DOTTraits::getGraphProperties(G);
|
|
|
+ O << DTraits.getGraphProperties(G);
|
|
|
O << "\n";
|
|
|
}
|
|
|
|
|
@@ -133,17 +136,17 @@ public:
|
|
|
}
|
|
|
|
|
|
void writeNode(NodeType *Node) {
|
|
|
- std::string NodeAttributes = DOTTraits::getNodeAttributes(Node, G);
|
|
|
+ std::string NodeAttributes = DTraits.getNodeAttributes(Node, G);
|
|
|
|
|
|
O << "\tNode" << static_cast<const void*>(Node) << " [shape=record,";
|
|
|
if (!NodeAttributes.empty()) O << NodeAttributes << ",";
|
|
|
O << "label=\"{";
|
|
|
|
|
|
- if (!DOTTraits::renderGraphFromBottomUp()) {
|
|
|
- O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G, ShortNames));
|
|
|
+ if (!DTraits.renderGraphFromBottomUp()) {
|
|
|
+ O << DOT::EscapeString(DTraits.getNodeLabel(Node, G, ShortNames));
|
|
|
|
|
|
// If we should include the address of the node in the label, do so now.
|
|
|
- if (DOTTraits::hasNodeAddressLabel(Node, G))
|
|
|
+ if (DTraits.hasNodeAddressLabel(Node, G))
|
|
|
O << "|" << (void*)Node;
|
|
|
}
|
|
|
|
|
@@ -152,28 +155,28 @@ public:
|
|
|
bool hasEdgeSourceLabels = getEdgeSourceLabels(EdgeSourceLabels, Node);
|
|
|
|
|
|
if (hasEdgeSourceLabels) {
|
|
|
- if (!DOTTraits::renderGraphFromBottomUp()) O << "|";
|
|
|
+ if (!DTraits.renderGraphFromBottomUp()) O << "|";
|
|
|
|
|
|
O << "{" << EdgeSourceLabels.str() << "}";
|
|
|
|
|
|
- if (DOTTraits::renderGraphFromBottomUp()) O << "|";
|
|
|
+ if (DTraits.renderGraphFromBottomUp()) O << "|";
|
|
|
}
|
|
|
|
|
|
- if (DOTTraits::renderGraphFromBottomUp()) {
|
|
|
- O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G, ShortNames));
|
|
|
+ if (DTraits.renderGraphFromBottomUp()) {
|
|
|
+ O << DOT::EscapeString(DTraits.getNodeLabel(Node, G, ShortNames));
|
|
|
|
|
|
// If we should include the address of the node in the label, do so now.
|
|
|
- if (DOTTraits::hasNodeAddressLabel(Node, G))
|
|
|
+ if (DTraits.hasNodeAddressLabel(Node, G))
|
|
|
O << "|" << (void*)Node;
|
|
|
}
|
|
|
|
|
|
- if (DOTTraits::hasEdgeDestLabels()) {
|
|
|
+ if (DTraits.hasEdgeDestLabels()) {
|
|
|
O << "|{";
|
|
|
|
|
|
- unsigned i = 0, e = DOTTraits::numEdgeDestLabels(Node);
|
|
|
+ unsigned i = 0, e = DTraits.numEdgeDestLabels(Node);
|
|
|
for (; i != e && i != 64; ++i) {
|
|
|
if (i) O << "|";
|
|
|
- O << "<d" << i << ">" << DOTTraits::getEdgeDestLabel(Node, i);
|
|
|
+ O << "<d" << i << ">" << DTraits.getEdgeDestLabel(Node, i);
|
|
|
}
|
|
|
|
|
|
if (i != e)
|
|
@@ -195,8 +198,8 @@ public:
|
|
|
void writeEdge(NodeType *Node, unsigned edgeidx, child_iterator EI) {
|
|
|
if (NodeType *TargetNode = *EI) {
|
|
|
int DestPort = -1;
|
|
|
- if (DOTTraits::edgeTargetsEdgeSource(Node, EI)) {
|
|
|
- child_iterator TargetIt = DOTTraits::getEdgeTarget(Node, EI);
|
|
|
+ if (DTraits.edgeTargetsEdgeSource(Node, EI)) {
|
|
|
+ child_iterator TargetIt = DTraits.getEdgeTarget(Node, EI);
|
|
|
|
|
|
// Figure out which edge this targets...
|
|
|
unsigned Offset =
|
|
@@ -204,12 +207,12 @@ public:
|
|
|
DestPort = static_cast<int>(Offset);
|
|
|
}
|
|
|
|
|
|
- if (DOTTraits::getEdgeSourceLabel(Node, EI) == "")
|
|
|
+ if (DTraits.getEdgeSourceLabel(Node, EI) == "")
|
|
|
edgeidx = -1;
|
|
|
|
|
|
emitEdge(static_cast<const void*>(Node), edgeidx,
|
|
|
static_cast<const void*>(TargetNode), DestPort,
|
|
|
- DOTTraits::getEdgeAttributes(Node, EI));
|
|
|
+ DTraits.getEdgeAttributes(Node, EI));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -247,7 +250,7 @@ public:
|
|
|
if (SrcNodePort >= 0)
|
|
|
O << ":s" << SrcNodePort;
|
|
|
O << " -> Node" << DestNodeID;
|
|
|
- if (DestNodePort >= 0 && DOTTraits::hasEdgeDestLabels())
|
|
|
+ if (DestNodePort >= 0 && DTraits.hasEdgeDestLabels())
|
|
|
O << ":d" << DestNodePort;
|
|
|
|
|
|
if (!Attrs.empty())
|