Ariles
writer.cpp
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2018-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 
12 
13 #include <limits>
14 #include <iomanip>
15 #include <vector>
16 #include <boost/lexical_cast.hpp>
17 
18 
19 namespace ariles2
20 {
21  namespace ns_octave
22  {
24  } // namespace ns_octave
25 } // namespace ariles2
26 
27 
28 namespace ariles2
29 {
30  namespace ns_octave
31  {
32  namespace impl
33  {
35  {
36  public:
37  std::vector<NodeWrapper> node_stack_;
38 
39  /// output file stream
40  std::ofstream config_ofs_;
41 
42  /// output stream
43  std::ostream *output_stream_;
44 
45 
46  protected:
47  /**
48  * @brief Initialize emitter
49  */
50  void initEmitter() const
51  {
52  *output_stream_ << std::setprecision(std::numeric_limits<double>::digits10);
53  }
54 
55 
56  public:
57  explicit Writer(const std::string &file_name)
58  {
59  ariles2::write::Visitor::openFile(config_ofs_, file_name);
60  output_stream_ = &config_ofs_;
61  initEmitter();
62  }
63 
64  explicit Writer(std::ostream &output_stream)
65  {
66  output_stream_ = &output_stream;
67  initEmitter();
68  }
69 
70  template <typename t_Scalar>
71  void writeComplex(const std::complex<t_Scalar> &element)
72  {
73  if (true == node_stack_.back().isMatrix())
74  {
75  *output_stream_ << element.real() << " + " << element.imag() << "i";
76  }
77  else
78  {
79  *output_stream_ << node_stack_.back().node_;
80  if (true == node_stack_.back().isArray())
81  {
82  *output_stream_ << "{" << node_stack_.back().index_ + 1 << "}";
83  }
84  *output_stream_ << " = " << element.real() << " + " << element.imag() << "i"
85  << ";\n";
86  }
87  }
88  };
89  } // namespace impl
90  } // namespace ns_octave
91 } // namespace ariles2
92 
93 namespace ariles2
94 {
95  namespace ns_octave
96  {
97  Writer::Writer(const std::string &file_name)
98  {
99  impl_ = ImplPtr(new Impl(file_name));
100  }
101 
102 
103  Writer::Writer(std::ostream &output_stream)
104  {
105  impl_ = ImplPtr(new Impl(output_stream));
106  }
107 
108 
110  {
111  impl_->output_stream_->flush();
112  }
113 
114 
115 
116  void Writer::startMapEntry(const std::string &map_name)
117  {
118  if (impl_->node_stack_.empty())
119  {
120  impl_->node_stack_.push_back(NodeWrapper(map_name));
121  }
122  else
123  {
124  if (true == impl_->node_stack_.back().isArray())
125  {
126  std::string node = impl_->node_stack_.back().node_;
127  node += "{";
128  node += boost::lexical_cast<std::string>(impl_->node_stack_.back().index_ + 1);
129  node += "}.";
130  node += map_name;
131  impl_->node_stack_.push_back(NodeWrapper(node));
132  }
133  else
134  {
135  impl_->node_stack_.push_back(NodeWrapper(impl_->node_stack_.back().node_ + "." + map_name));
136  }
137  }
138  }
139 
141  {
142  impl_->node_stack_.pop_back();
143  }
144 
145 
146  void Writer::startArray(const std::size_t size, const bool /*compact*/)
147  {
148  if (true == impl_->node_stack_.back().isArray())
149  {
150  std::string node = impl_->node_stack_.back().node_;
151  node += "{";
152  node += boost::lexical_cast<std::string>(impl_->node_stack_.back().index_ + 1);
153  node += "}";
154  impl_->node_stack_.push_back(NodeWrapper(node, 0, size));
155  }
156  else
157  {
158  impl_->node_stack_.push_back(NodeWrapper(impl_->node_stack_.back().node_, 0, size));
159  }
160  }
161 
163  {
164  ARILES2_ASSERT(true == impl_->node_stack_.back().isArray(), "Internal error: array expected.");
165  ++impl_->node_stack_.back().index_;
166  }
167 
169  {
170  impl_->node_stack_.pop_back();
171  }
172 
173 
174  void Writer::startVector(const std::size_t /*size*/)
175  {
176  impl_->node_stack_.push_back(NodeWrapper(impl_->node_stack_.back().node_ + " = [", NodeWrapper::MATRIX));
177  *impl_->output_stream_ << impl_->node_stack_.back().node_;
178  }
179 
181  {
182  }
183 
185  {
186  *impl_->output_stream_ << "; ";
187  }
188 
190  {
191  *impl_->output_stream_ << "];\n";
192  impl_->node_stack_.pop_back();
193  }
194 
195 
197  const bool /*dynamic*/,
198  const std::size_t /*cols*/,
199  const std::size_t /*rows*/,
200  const Parameters & /*param*/)
201  {
202  impl_->node_stack_.push_back(
203  NodeWrapper(impl_->node_stack_.back().node_ + " = [...\n", NodeWrapper::MATRIX));
204  *impl_->output_stream_ << impl_->node_stack_.back().node_;
205  }
206 
207  void Writer::startMatrixRow(const std::size_t /*cols*/, const Parameters & /*param*/)
208  {
209  impl_->node_stack_.back().index_ = 0;
210  }
211 
213  {
214  if (0 != impl_->node_stack_.back().index_)
215  {
216  *impl_->output_stream_ << ", ";
217  }
218  }
219 
221  {
222  ++impl_->node_stack_.back().index_;
223  }
224 
225  void Writer::endMatrixRow(const Parameters & /*param*/)
226  {
227  *impl_->output_stream_ << "; ...\n";
228  }
229 
230  void Writer::endMatrix(const bool /*dynamic*/, const Parameters & /*param*/)
231  {
232  *impl_->output_stream_ << "];\n";
233  impl_->node_stack_.pop_back();
234  }
235 
236 
237 #define ARILES2_BASIC_TYPE(type) \
238  void Writer::writeElement(const type &element, const Parameters &) \
239  { \
240  if (true == impl_->node_stack_.back().isMatrix()) \
241  { \
242  *impl_->output_stream_ << element; \
243  } \
244  else \
245  { \
246  *impl_->output_stream_ << impl_->node_stack_.back().node_; \
247  if (true == impl_->node_stack_.back().isArray()) \
248  { \
249  *impl_->output_stream_ << "{" << impl_->node_stack_.back().index_ + 1 << "}"; \
250  } \
251  *impl_->output_stream_ << " = " << element << ";\n"; \
252  } \
253  }
254 
256 
257 #undef ARILES2_BASIC_TYPE
258 
259 
260  void Writer::writeElement(const std::string &element, const Parameters &)
261  {
262  *impl_->output_stream_ << impl_->node_stack_.back().node_;
263  if (true == impl_->node_stack_.back().isArray())
264  {
265  *impl_->output_stream_ << "{" << impl_->node_stack_.back().index_ + 1 << "}";
266  }
267  *impl_->output_stream_ << " = '" << element << "';\n";
268  }
269 
270  void Writer::writeElement(const std::complex<float> &element, const Parameters &)
271  {
272  impl_->writeComplex(element);
273  }
274 
275  void Writer::writeElement(const std::complex<double> &element, const Parameters &)
276  {
277  impl_->writeComplex(element);
278  }
279  } // namespace ns_octave
280 } // namespace ariles2
ariles2
Definition: basic.h:16
ariles2::ns_octave::Writer::flush
void flush()
Flush the configuration to the output.
Definition: writer.cpp:109
ariles2::serialization::Node< std::string >::MATRIX
@ MATRIX
Definition: serialization.h:57
ariles2::ns_octave::Writer::endMapEntry
void endMapEntry()
Definition: writer.cpp:140
ariles2::ns_octave::impl::Writer::Writer
Writer(const std::string &file_name)
Definition: writer.cpp:57
ariles2::ns_octave::Writer::endMatrix
void endMatrix(const bool dynamic, const Parameters &)
Definition: writer.cpp:230
ariles2::ns_octave::Writer::startMatrix
void startMatrix(const bool dynamic, const std::size_t cols, const std::size_t rows, const Parameters &param)
Definition: writer.cpp:196
ariles2::ns_octave::Writer::startMapEntry
void startMapEntry(const std::string &map_name)
Starts a nested map in the configuration file.
Definition: writer.cpp:116
ariles2::ns_octave::ARILES2_MACRO_SUBSTITUTE
ARILES2_MACRO_SUBSTITUTE(ARILES2_BASIC_NUMERIC_TYPES_LIST) void Writer
Definition: writer.cpp:255
ariles2::ns_octave::impl::Writer::initEmitter
void initEmitter() const
Initialize emitter.
Definition: writer.cpp:50
ariles2::ns_octave::Writer::endArrayElement
void endArrayElement()
Definition: writer.cpp:162
ariles2::ns_octave::Writer::startVectorElement
void startVectorElement()
Definition: writer.cpp:180
ariles2::ns_octave::impl::Writer::config_ofs_
std::ofstream config_ofs_
output file stream
Definition: writer.cpp:40
ariles2::ns_octave::Writer::Impl
impl::Writer Impl
Definition: octave.h:48
ariles2::ns_octave::Writer::ImplPtr
ARILES2_SHARED_PTR< impl::Writer > ImplPtr
Definition: octave.h:49
ariles2::ns_octave::NodeWrapper
serialization::Node< std::string > NodeWrapper
Definition: writer.cpp:23
ariles2::ns_octave::Writer::impl_
ImplPtr impl_
Definition: octave.h:52
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::ns_octave::Writer::endMatrixElement
void endMatrixElement()
Definition: writer.cpp:220
ariles2::ns_octave::Writer::startArray
void startArray(const std::size_t size, const bool compact=false)
Definition: writer.cpp:146
ariles2::ns_octave::impl::Writer
Definition: writer.cpp:34
ariles2::ns_octave::Writer::endArray
void endArray()
Definition: writer.cpp:168
ariles2::ns_octave::Writer::endVector
void endVector()
Definition: writer.cpp:189
ariles2::ns_octave::impl::Writer::node_stack_
std::vector< NodeWrapper > node_stack_
Definition: writer.cpp:37
ariles2::ns_octave::impl::Writer::Writer
Writer(std::ostream &output_stream)
Definition: writer.cpp:64
ariles2::write::VisitorBase< Visitor, Parameters >::openFile
static void openFile(std::ofstream &config_ofs, const std::string &file_name)
open configuration file
Definition: write.h:58
ariles2::write::VisitorBase< Visitor, Parameters >::writeElement
void writeElement(const std::complex< t_Scalar > &entry, const Parameters &param)
Definition: write.h:285
ariles2::ns_octave::impl::Writer::writeComplex
void writeComplex(const std::complex< t_Scalar > &element)
Definition: writer.cpp:71
ariles2::ns_octave::Writer::endMatrixRow
void endMatrixRow(const Parameters &)
Definition: writer.cpp:225
ariles2::ns_octave::Writer::startMatrixRow
void startMatrixRow(const std::size_t, const Parameters &)
Definition: writer.cpp:207
ariles2::serialization::Node< std::string >
ariles2::ns_octave::Writer::startMatrixElement
void startMatrixElement()
Definition: writer.cpp:212
octave.h
ARILES2_BASIC_NUMERIC_TYPES_LIST
#define ARILES2_BASIC_NUMERIC_TYPES_LIST
Definition: helpers.h:122
ariles2::ns_octave::Writer::startVector
void startVector(const std::size_t size)
Definition: writer.cpp:174
ariles2::ns_octave::impl::Writer::output_stream_
std::ostream * output_stream_
output stream
Definition: writer.cpp:43
ariles2::ns_octave::Writer::endVectorElement
void endVectorElement()
Definition: writer.cpp:184
ariles2::ns_octave::Writer::Writer
Writer(const std::string &file_name)
Definition: writer.cpp:97