Ariles
graphviz.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2020 Alexander Sherikov, Licensed under the Apache License, Version 2.0.
6  (see @ref LICENSE or http://www.apache.org/licenses/LICENSE-2.0)
7 
8  @brief
9 */
10 
11 /**
12 @defgroup graphviz Graphviz
13 
14 @brief Generates diagrams ('.dot' files) representing class contents.
15 
16 The following example is generated using classes defined in @ref ariles_diagram.h
17 @image html graphviz_example.svg
18 */
19 
20 
21 #pragma once
22 
23 #define ARILES2_VISITOR_INCLUDED_graphviz
24 
26 #include <ariles2/visitors/write.h>
27 
28 #include <string>
29 
30 
31 namespace ariles2
32 {
33  namespace ns_graphviz
34  {
35  namespace impl
36  {
38  }
39 
40 
42  {
43  public:
45  {
46  public:
47  std::string id_;
48  std::string label_;
49  std::string options_;
50 
51  public:
53  {
54  id_ = "";
55  label_ = "";
56  options_ = "";
57  }
58 
59  NodeOptions(const std::string &id)
60  {
61  id_ = id;
62  label_ = id_;
63  options_ = "";
64  }
65 
66  NodeOptions(const std::string &id, const std::string &label)
67  {
68  id_ = id;
69  label_ = label;
70  options_ = "";
71  }
72 
73  NodeOptions(const std::string &id, const std::string &label, const std::string &options)
74  {
75  id_ = id;
76  label_ = label;
77  options_ = options;
78  }
79  };
80 
81 
82  public:
83  std::string graph_options_;
84  std::string node_options_;
85 
86  public:
87  Parameters(const bool override_parameters = false) : write::Parameters(override_parameters)
88  {
89  graph_options_ = "rankdir=\"LR\"\n";
90  node_options_ = "";
91  sloppy_maps_ = true;
92  sloppy_pairs_ = true;
93  compact_arrays_ = true;
94  }
95 
96  virtual NodeOptions getDefaultNodeOptions(const std::string &id, const std::string &label) const
97  {
98  return (NodeOptions(id, label, node_options_));
99  }
100  virtual NodeOptions getArilesNodeOptions(const std::string &id, const std::string &label) const
101  {
102  return (NodeOptions(id, label, node_options_));
103  }
104  };
105 
106 
108  : public serialization::PIMPLVisitor<write::VisitorBase<Visitor, Parameters>, impl::Visitor>
109  {
110  protected:
111  void startMap(const Parameters &, const Parameters::NodeOptions &);
112  std::string getDefaultNodeId() const;
113  std::string getDefaultNodeLabel() const;
114 
115 
116  public:
117  explicit Visitor(const std::string &file_name);
118  explicit Visitor(std::ostream &output_stream);
119 
120 
121  void flush();
122 
123  void startRoot(const std::string &name, const Parameters &);
124  void endRoot(const std::string &name);
125 
126  void startMap(const Parameters &, const std::size_t num_entries);
127  void startMapEntry(const std::string &map_name);
128  void endMapEntry();
129 
130  void startArray(const std::size_t size, const bool compact = false);
131  void endArrayElement();
132  void endArray();
133 
134 
135  template <class t_Ariles>
136  const Parameters getParameters(const t_Ariles &ariles_class) const
137  {
138  return (ariles_class.arilesGetParameters(*this));
139  }
140 
141  template <class t_Entry>
142  void startMap(t_Entry &, const Parameters &parameters)
143  {
144  startMap(parameters, parameters.getArilesNodeOptions(getDefaultNodeId(), getDefaultNodeLabel()));
145  }
146 
148 
149 
150 #define ARILES2_BASIC_TYPE(type) void writeElement(const type &element, const Parameters &param);
151 
154 
155 #undef ARILES2_BASIC_TYPE
156  };
157 
158 
160  {
161  };
162 
163 
164 #define ARILES2_NAMED_ENTRY_graphviz(v, entry, name) visitor.visitMapEntry(entry, #name, parameters);
165 #define ARILES2_PARENT_graphviz(v, entry)
166 #define ARILES2_VISIT_graphviz \
167  template <class t_Visitor> \
168  void arilesVisit( \
169  t_Visitor &visitor, \
170  const typename t_Visitor::Parameters &parameters, \
171  ARILES2_IS_BASE_ENABLER(ariles2::graphviz::Visitor, t_Visitor)) const \
172  { \
173  ARILES2_TRACE_FUNCTION; \
174  ARILES2_UNUSED_ARG(visitor); \
175  ARILES2_UNUSED_ARG(parameters); \
176  arilesVisitParents(visitor, parameters); \
177  ARILES2_ENTRIES(graphviz) \
178  }
179 
180 #define ARILES2_METHODS_graphviz ARILES2_METHODS(graphviz, ARILES2_EMPTY_MACRO, const)
181 #define ARILES2_BASE_METHODS_graphviz ARILES2_BASE_METHODS(graphviz)
182  } // namespace ns_graphviz
183 } // namespace ariles2
184 
185 
186 namespace ariles2
187 {
188  /**
189  * @brief Graphviz visitor.
190  * @ingroup graphviz
191  */
193  {
198  };
199 
200  /// @ingroup graphviz
202 } // namespace ariles2
ariles2::ns_graphviz::Parameters::NodeOptions::NodeOptions
NodeOptions(const std::string &id, const std::string &label, const std::string &options)
Definition: graphviz.h:73
ariles2
Definition: basic.h:16
ariles2::ns_graphviz::Parameters::NodeOptions::NodeOptions
NodeOptions()
Definition: graphviz.h:52
ariles2::ns_graphviz::impl::Visitor
Definition: writer.cpp:73
ariles2::ns_graphviz::Parameters::node_options_
std::string node_options_
Definition: graphviz.h:84
ARILES2_BASIC_TYPES_LIST
#define ARILES2_BASIC_TYPES_LIST
Definition: helpers.h:131
ariles2::ns_graphviz::Visitor::getParameters
const Parameters getParameters(const t_Ariles &ariles_class) const
Definition: graphviz.h:136
ariles2::ns_graphviz::Parameters::Parameters
Parameters(const bool override_parameters=false)
Definition: graphviz.h:87
ariles2::ns_graphviz::Parameters
Definition: graphviz.h:41
ariles2::ns_graphviz::Parameters::NodeOptions::id_
std::string id_
Definition: graphviz.h:47
ariles2::ns_graphviz::impl::Visitor
class ARILES2_VISIBILITY_ATTRIBUTE Visitor
Definition: graphviz.h:37
ariles2::ns_graphviz::Visitor
Definition: graphviz.h:107
ariles2::ns_octave::ARILES2_MACRO_SUBSTITUTE
ARILES2_MACRO_SUBSTITUTE(ARILES2_BASIC_NUMERIC_TYPES_LIST) void Writer
Definition: writer.cpp:255
ariles2::ns_graphviz::Parameters::graph_options_
std::string graph_options_
Definition: graphviz.h:83
ariles2::serialization::PIMPLVisitor
Definition: serialization.h:121
ariles2::write::Parameters
Definition: write.h:28
ariles2::graphviz::Writer
ns_graphviz::Visitor Writer
Definition: graphviz.h:196
ARILES2_COMPLEX_NUMBER_TYPES_LIST
#define ARILES2_COMPLEX_NUMBER_TYPES_LIST
Definition: helpers.h:127
ariles2::ns_graphviz::Parameters::getArilesNodeOptions
virtual NodeOptions getArilesNodeOptions(const std::string &id, const std::string &label) const
Definition: graphviz.h:100
ariles2::ns_graphviz::Parameters::getDefaultNodeOptions
virtual NodeOptions getDefaultNodeOptions(const std::string &id, const std::string &label) const
Definition: graphviz.h:96
ariles2::graphviz::Parameters
ns_graphviz::Parameters Parameters
Definition: graphviz.h:194
ariles2::graphviz
Graphviz visitor.
Definition: graphviz.h:192
ariles2::write::VisitorBase
Definition: write.h:44
helpers.h
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::ns_graphviz::Parameters::NodeOptions::options_
std::string options_
Definition: graphviz.h:49
ariles2::graphviz::Visitor
ns_graphviz::Visitor Visitor
Definition: graphviz.h:195
ariles2::graphviz::Base
ns_graphviz::Base Base
Definition: graphviz.h:197
ariles2::entry::ConstBase
Definition: common.h:100
ariles2::ns_graphviz::Parameters::NodeOptions::label_
std::string label_
Definition: graphviz.h:48
ariles2::Graphviz
graphviz::Visitor Graphviz
Definition: graphviz.h:201
ariles2::ns_graphviz::Parameters::NodeOptions::NodeOptions
NodeOptions(const std::string &id, const std::string &label)
Definition: graphviz.h:66
ariles2::ns_graphviz::Base
Definition: graphviz.h:159
ariles2::ns_graphviz::Visitor::startMap
void startMap(t_Entry &, const Parameters &parameters)
Definition: graphviz.h:142
ariles2::ns_graphviz::Parameters::NodeOptions
Definition: graphviz.h:44
ariles2::ns_graphviz::Parameters::NodeOptions::NodeOptions
NodeOptions(const std::string &id)
Definition: graphviz.h:59
write.h