Ariles
Loading...
Searching...
No Matches
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
19namespace ariles2
20{
21 namespace ns_octave
22 {
24 } // namespace ns_octave
25} // namespace ariles2
26
27
28namespace 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 {
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
82namespace 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
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
#define CPPUT_MACRO_SUBSTITUTE(macro)
Definition misc.h:21