1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 2 // -*- mode: C++ -*- 3 // 4 // Copyright (C) 2013-2020 Red Hat, Inc. 5 6 /// @file 7 8 #ifndef __ABG_VIZ_DOT_H__ 9 #define __ABG_VIZ_DOT_H__ 10 11 #include <abg-viz-common.h> 12 13 namespace abigail 14 { 15 16 /// Base class for graph nodes. 17 struct node_base 18 { 19 /// Possible derived types. 20 enum type { child, parent }; 21 22 std::string _M_id; 23 static units_type _M_count_total; // Start at zero. 24 units_type _M_count; 25 type _M_type; 26 float _M_x_space; // Column spacing. 27 float _M_y_space; // Row spacing. 28 const style& _M_style; 29 30 explicit node_basenode_base31 node_base(const std::string& __id, type __t, const style& __sty) 32 : _M_id(__id), _M_count(++_M_count_total), 33 _M_type(__t), _M_x_space(0.4), _M_y_space(0.2), _M_style(__sty) 34 { } 35 }; 36 37 /// Useful constants. 38 extern const style parent_sty; 39 extern const style child_sty; 40 41 42 /** 43 Parent node. 44 45 Some characteristics: 46 - name (text anchor = start ie left). 47 - background box x and y size 48 - style info 49 - (optional) template parameters 50 51 */ 52 struct parent_node : public node_base 53 { parent_nodeparent_node54 parent_node(const std::string& __id) 55 : node_base(__id, node_base::parent, parent_sty) 56 { } 57 }; 58 59 60 /** 61 Child node. 62 63 Some characteristics: 64 - horizontal name (text anchor = start ie left). 65 - background box 66 - (optional) template parameters 67 68 */ 69 struct child_node : public node_base 70 { child_nodechild_node71 child_node(const std::string& __id) 72 : node_base(__id, node_base::child, child_sty) 73 { } 74 }; 75 76 77 /** 78 DOT "graph" style notation for class inheritance. 79 80 This is a compact DOT representation of a single class inheritance. 81 82 It is composed of the following data points for each parent 83 84 - parent classes 85 - child classes 86 - name 87 88 Including typographic information to compute line length, and C++ 89 niceities like grouping and overload sets. 90 91 It's constructed by creating a digraph, starting from the base node. 92 */ 93 struct dot 94 { 95 96 private: 97 98 const std::string _M_title; 99 100 std::ostringstream _M_sstream; 101 102 public: 103 dotdot104 dot(const std::string &__title) 105 : _M_title(__title) 106 { } 107 108 // Empty when the output buffer is. 109 bool emptydot110 empty() { return _M_sstream.str().empty(); } 111 112 void 113 start_element(); 114 115 void 116 finish_element(); 117 118 void 119 add_title(); 120 121 void 122 add_node(const node_base&); 123 124 void 125 add_edge(const node_base&, const node_base&); 126 127 void 128 add_parent(const parent_node&); 129 130 void 131 add_child_to_node(const child_node&, const node_base&); 132 133 void 134 write(); 135 136 void startdot137 start() 138 { 139 this->start_element(); 140 } 141 142 void finishdot143 finish() 144 { 145 this->finish_element(); 146 this->write(); 147 } 148 }; 149 150 // XXX connect external xml file to input. 151 // parse input, pick apart elements, attributes. 152 153 }// end namespace abigail 154 155 #endif //__ABG_VIZ_DOT_H__ 156