17 #include <boost/lexical_cast.hpp>
43 const std::string &node,
44 const std::string &label,
53 const std::string &node,
54 const std::string &label,
55 const std::size_t index,
56 const std::size_t size)
57 :
Base(node, index, size)
88 explicit Visitor(
const std::string &file_name)
91 output_stream_ = &config_ofs_;
94 explicit Visitor(std::ostream &output_stream)
96 output_stream_ = &output_stream;
109 ARILES2_TRACE_FUNCTION;
111 const std::size_t stack_size = node_stack_.size();
113 ARILES2_ASSERT(0 < stack_size,
"Internal error: stack must contain at least 2 entries.");
116 node_stack_.back().actual_id_ = node_options.
id_;
118 if (
true == all_ids_.insert(node_stack_.back().actual_id_).second)
120 *output_stream_ << node_options.
id_;
121 *output_stream_ <<
"[";
122 if (
false == node_options.
label_.empty())
124 *output_stream_ <<
"label=\"" << node_options.
label_ <<
"\"";
126 if (
false == node_options.
options_.empty())
128 *output_stream_ <<
"," << node_options.
options_;
130 *output_stream_ <<
"];\n";
137 << node_stack_[stack_size - 2].actual_id_
139 << node_stack_.back().actual_id_ <<
";\n";
150 namespace ns_graphviz
166 impl_->output_stream_->flush();
172 ARILES2_TRACE_FUNCTION;
174 impl_->parameters_ = ¶meters;
175 if (
true == name.empty())
183 *
impl_->output_stream_
184 <<
"digraph graph_" <<
impl_->node_stack_.back().node_
192 ARILES2_TRACE_FUNCTION;
193 *
impl_->output_stream_ <<
"}\n";
198 if (
true ==
impl_->node_stack_.back().isArray())
200 return (
impl_->node_stack_.back().node_ +
"_"
201 + boost::lexical_cast<std::string>(
impl_->node_stack_.back().index_));
203 return (
impl_->node_stack_.back().node_);
208 if (
true ==
impl_->node_stack_.back().isArray())
210 return (
impl_->node_stack_.back().label_ +
"_"
211 + boost::lexical_cast<std::string>(
impl_->node_stack_.back().index_));
213 return (
impl_->node_stack_.back().label_);
218 ARILES2_TRACE_FUNCTION;
219 if (
false ==
impl_->parameters_->override_parameters_)
221 impl_->parameters_ = ¶meters;
223 impl_->writeNodeAndConnection(node_options);
228 ARILES2_TRACE_FUNCTION;
229 if (
false ==
impl_->parameters_->override_parameters_)
231 impl_->parameters_ = ¶meters;
233 impl_->writeNodeAndConnection(
239 ARILES2_TRACE_FUNCTION;
240 if (
true ==
impl_->node_stack_.back().isArray())
242 std::string node =
impl_->node_stack_.back().node_;
244 node += boost::lexical_cast<std::string>(
impl_->node_stack_.back().index_);
257 ARILES2_TRACE_FUNCTION;
258 impl_->node_stack_.pop_back();
264 ARILES2_TRACE_FUNCTION;
265 ARILES2_ASSERT(
false ==
impl_->node_stack_.empty(),
"Internal error: empty stack.");
267 if (size > 0 ||
false == compact)
269 impl_->writeNodeAndConnection(
273 if (
true ==
impl_->node_stack_.back().isArray())
275 std::string node =
impl_->node_stack_.back().node_;
276 std::string label =
impl_->node_stack_.back().label_;
278 node += boost::lexical_cast<std::string>(
impl_->node_stack_.back().index_);
280 label += boost::lexical_cast<std::string>(
impl_->node_stack_.back().index_);
285 impl_->node_stack_.push_back(
292 ARILES2_ASSERT(
true ==
impl_->node_stack_.back().isArray(),
"Internal error: array expected.");
293 ++
impl_->node_stack_.back().index_;
298 ARILES2_TRACE_FUNCTION;
299 impl_->node_stack_.pop_back();
303 #define ARILES2_BASIC_TYPE(type) \
304 void Visitor::writeElement(const type &, const Parameters &) \
306 impl_->writeNodeAndConnection( \
307 impl_->parameters_->getDefaultNodeOptions(getDefaultNodeId(), getDefaultNodeLabel())); \
313 #undef ARILES2_BASIC_TYPE