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  const std::string separator_ = ".";
38  const std::string bracket_left_ = "{";
39  const std::string bracket_right_ = "}";
40 
41 
42  protected:
43  /**
44  * @brief Initialize emitter
45  */
46  void initEmitter() const
47  {
48  *output_stream_ << std::setprecision(std::numeric_limits<double>::digits10);
49  }
50 
51 
52  public:
53  template <class... t_Args>
54  explicit Writer(t_Args &&...args) : FileVisitorImplementation(std::forward<t_Args>(args)...)
55  {
56  initEmitter();
57  }
58 
59  template <typename t_Scalar>
60  void writeComplex(const std::complex<t_Scalar> &element)
61  {
62  if (back().isMatrix())
63  {
64  *output_stream_ << element.real() << " + " << element.imag() << "i";
65  }
66  else
67  {
68  *output_stream_ << back().node_;
69  if (back().isArray())
70  {
71  *output_stream_ << "{" << back().index_ + 1 << "}";
72  }
73  *output_stream_ << " = " << element.real() << " + " << element.imag() << "i"
74  << ";\n";
75  }
76  }
77  };
78  } // namespace impl
79  } // namespace ns_octave
80 } // namespace ariles2
81 
82 namespace ariles2
83 {
84  namespace ns_octave
85  {
86  Writer::Writer(const std::string &file_name)
87  {
88  makeImplPtr(file_name);
89  }
90 
91 
92  Writer::Writer(std::ostream &output_stream)
93  {
94  makeImplPtr(output_stream);
95  }
96 
97 
99  {
100  impl_->output_stream_->flush();
101  }
102 
103 
104 
105  void Writer::startMapEntry(const std::string &map_name)
106  {
107  if (impl_->empty())
108  {
109  impl_->emplace(map_name);
110  }
111  else
112  {
113  if (impl_->back().isArray())
114  {
115  impl_->concatWithNodeAndEmplace(
116  impl_->bracket_left_,
117  boost::lexical_cast<std::string>(impl_->back().index_ + 1),
118  impl_->bracket_right_,
119  impl_->separator_,
120  map_name);
121  }
122  else
123  {
124  impl_->concatWithNodeAndEmplace(impl_->separator_, map_name);
125  }
126  }
127  }
128 
130  {
131  impl_->pop();
132  }
133 
134 
135  void Writer::startArray(const std::size_t size, const bool /*compact*/)
136  {
137  if (impl_->back().isArray())
138  {
139  impl_->emplace(
140  impl_->concatWithNode(
141  impl_->bracket_left_,
142  boost::lexical_cast<std::string>(impl_->back().index_ + 1),
143  impl_->bracket_right_),
144  0,
145  size);
146  }
147  else
148  {
149  impl_->emplace(impl_->back().node_, 0, size);
150  }
151  }
152 
154  {
155  impl_->shiftArray();
156  }
157 
159  {
160  impl_->pop();
161  }
162 
163 
164  void Writer::startVector(const std::size_t /*size*/)
165  {
166  impl_->emplace(impl_->back().node_ + " = [", NodeWrapper::Type::MATRIX);
167  *impl_->output_stream_ << impl_->back().node_;
168  }
169 
171  {
172  }
173 
175  {
176  *impl_->output_stream_ << "; ";
177  }
178 
180  {
181  *impl_->output_stream_ << "];\n";
182  impl_->pop();
183  }
184 
185 
187  const bool /*dynamic*/,
188  const std::size_t /*cols*/,
189  const std::size_t /*rows*/,
190  const Parameters & /*param*/)
191  {
192  impl_->emplace(impl_->back().node_ + " = [...\n", NodeWrapper::Type::MATRIX);
193  *impl_->output_stream_ << impl_->back().node_;
194  }
195 
196  void Writer::startMatrixRow(const std::size_t /*cols*/, const Parameters & /*param*/)
197  {
198  impl_->back().index_ = 0;
199  }
200 
202  {
203  if (0 != impl_->back().index_)
204  {
205  *impl_->output_stream_ << ", ";
206  }
207  }
208 
210  {
211  ++impl_->back().index_;
212  }
213 
214  void Writer::endMatrixRow(const Parameters & /*param*/)
215  {
216  *impl_->output_stream_ << "; ...\n";
217  }
218 
219  void Writer::endMatrix(const bool /*dynamic*/, const Parameters & /*param*/)
220  {
221  *impl_->output_stream_ << "];\n";
222  impl_->pop();
223  }
224 
225 
226 #define ARILES2_BASIC_TYPE(type) \
227  void Writer::writeElement(const type &element, const Parameters &) \
228  { \
229  if (impl_->back().isMatrix()) \
230  { \
231  *impl_->output_stream_ << element; \
232  } \
233  else \
234  { \
235  *impl_->output_stream_ << impl_->back().node_; \
236  if (impl_->back().isArray()) \
237  { \
238  *impl_->output_stream_ << "{" << impl_->back().index_ + 1 << "}"; \
239  } \
240  *impl_->output_stream_ << " = " << element << ";\n"; \
241  } \
242  }
243 
245 
246 #undef ARILES2_BASIC_TYPE
247 
248 
249  void Writer::writeElement(const std::string &element, const Parameters &)
250  {
251  *impl_->output_stream_ << impl_->back().node_;
252  if (impl_->back().isArray())
253  {
254  *impl_->output_stream_ << "{" << impl_->back().index_ + 1 << "}";
255  }
256  *impl_->output_stream_ << " = '" << element << "';\n";
257  }
258 
259  void Writer::writeElement(const std::complex<float> &element, const Parameters &)
260  {
261  impl_->writeComplex(element);
262  }
263 
264  void Writer::writeElement(const std::complex<double> &element, const Parameters &)
265  {
266  impl_->writeComplex(element);
267  }
268  } // namespace ns_octave
269 } // namespace ariles2
void startMatrix(const bool dynamic, const std::size_t cols, const std::size_t rows, const Parameters &param)
Definition: writer.cpp:186
void startMatrixRow(const std::size_t, const Parameters &)
Definition: writer.cpp:196
void flush()
Flush the configuration to the output.
Definition: writer.cpp:98
void startArray(const std::size_t size, const bool compact=false)
Definition: writer.cpp:135
void startVector(const std::size_t size)
Definition: writer.cpp:164
void startMapEntry(const std::string &map_name)
Starts a nested map in the configuration file.
Definition: writer.cpp:105
void endMatrixRow(const Parameters &)
Definition: writer.cpp:214
Writer(const std::string &file_name)
Definition: writer.cpp:86
void endMatrix(const bool dynamic, const Parameters &)
Definition: writer.cpp:219
void writeComplex(const std::complex< t_Scalar > &element)
Definition: writer.cpp:60
Writer(t_Args &&...args)
Definition: writer.cpp:54
const std::string bracket_right_
Definition: writer.cpp:39
void initEmitter() const
Initialize emitter.
Definition: writer.cpp:46
const std::string separator_
Definition: writer.cpp:37
const std::string bracket_left_
Definition: writer.cpp:38
std::ostream * output_stream_
output stream
Definition: write.h:380
FileVisitorImplementation(const std::string &file_name)
Definition: write.h:384
void writeElement(const std::complex< t_Scalar > &entry, const Parameters &param)
Definition: write.h:264
#define ARILES2_BASIC_NUMERIC_TYPES_LIST
Definition: helpers.h:63
visitor::Parameters Parameters
Definition: count.h:26
CPPUT_MACRO_SUBSTITUTE(ARILES2_BASIC_NUMERIC_TYPES_LIST) void Writer
Definition: writer.cpp:244
Definition: basic.h:17