Ariles
write.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2017-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 #pragma once
12 
13 #include "serialization.h"
14 #include "count.h"
15 
16 /**
17 @defgroup write Write
18 @ingroup serialization
19 
20 @brief Base for serialization.
21 */
22 
23 namespace ariles2
24 {
25  /// @ingroup write
26  namespace write
27  {
29  {
30  public:
32 
33 
34  public:
35  Parameters(const bool override_parameters = true) : serialization::Parameters(override_parameters)
36  {
37  compact_arrays_ = false;
38  }
39  };
40 
41 
42 
43  template <class t_Derived, class t_Parameters>
44  class ARILES2_VISIBILITY_ATTRIBUTE VisitorBase : public serialization::Base<t_Derived, t_Parameters>
45  {
46  protected:
49 
50 
51  public:
52  /**
53  * @brief open configuration file
54  *
55  * @param[out] config_ofs
56  * @param[in] file_name
57  */
58  static void openFile(std::ofstream &config_ofs, const std::string &file_name)
59  {
60  config_ofs.open(file_name.c_str());
61 
62  ARILES2_PERSISTENT_ASSERT(
63  true == config_ofs.good(),
64  std::string("Could not open configuration file for writing: ") + file_name.c_str());
65  }
66 
67 
68  public:
69  virtual void startRoot(const std::string &name, const t_Parameters & /*param*/)
70  {
71  ARILES2_TRACE_FUNCTION;
72  if (false == name.empty())
73  {
74  startMapEntry(name);
75  }
76  }
77  virtual void endRoot(const std::string &name)
78  {
79  ARILES2_TRACE_FUNCTION;
80  if (false == name.empty())
81  {
82  endMapEntry();
83  }
84  }
85  /**
86  * @brief Flush the configuration to the output
87  */
88  virtual void flush() = 0;
89 
90 
91  /**
92  * @brief Starts a nested map in the configuration file
93  *
94  * @param[in] instance_id instance id
95  * @param[in] num_entries number of child entries
96  */
97  virtual void startMap(const t_Parameters & /*param*/, const std::size_t /*num_entries*/)
98  {
99  }
100  /**
101  * @brief Starts a nested map in the configuration file
102  *
103  * @param[in] map_name name of the map
104  */
105  virtual void startMapEntry(const std::string &map_name)
106  {
107  ARILES2_UNUSED_ARG(map_name)
108  }
109  virtual void endMapEntry()
110  {
111  }
112  /**
113  * @brief Ends a nested map in the configuration file
114  */
115  virtual void endMap()
116  {
117  }
118 
119 
120  virtual bool startIteratedMap(const std::size_t num_entries, const t_Parameters &param)
121  {
122  startMap(param, num_entries);
123  return (true);
124  }
125  virtual void startIteratedMapElement(const std::string &map_name)
126  {
127  startMapEntry(map_name);
128  }
129  virtual void endIteratedMapElement()
130  {
131  endMapEntry();
132  }
133  virtual void endIteratedMap()
134  {
135  endMap();
136  }
137 
138 
139  virtual void startArray(const std::size_t size, const bool compact = false) = 0;
140  virtual void startArrayElement()
141  {
142  ARILES2_TRACE_FUNCTION;
143  }
144  virtual void endArrayElement()
145  {
146  ARILES2_TRACE_FUNCTION;
147  }
148  virtual void endArray()
149  {
150  ARILES2_TRACE_FUNCTION;
151  }
152 
153 
154  virtual void startVector(const std::size_t size)
155  {
156  ARILES2_TRACE_FUNCTION;
157  this->startArray(size, /*compact*/ true);
158  }
159  virtual void startVectorElement()
160  {
161  ARILES2_TRACE_FUNCTION;
162  this->startArrayElement();
163  }
164  virtual void endVectorElement()
165  {
166  ARILES2_TRACE_FUNCTION;
167  this->endArrayElement();
168  }
169  virtual void endVector()
170  {
171  ARILES2_TRACE_FUNCTION;
172  this->endArray();
173  }
174 
175 
176  virtual void startMatrix(
177  const bool dynamic,
178  const std::size_t cols,
179  const std::size_t rows,
180  const t_Parameters &param)
181  {
182  ARILES2_TRACE_FUNCTION;
183  if (param.flat_matrices_)
184  {
185  if (dynamic or param.explicit_matrix_size_)
186  {
187  this->startMap(param, 3);
188 
189  this->startMapEntry("cols");
190  this->writeElement(cols, param);
191  this->endMapEntry();
192 
193  this->startMapEntry("rows");
194  this->writeElement(rows, param);
195  this->endMapEntry();
196 
197  this->startMapEntry("data");
198  }
199 
200  this->startVector(cols * rows);
201  }
202  else
203  {
204  this->startArray(rows, /*compact=*/true);
205  }
206  }
207  virtual void startMatrixRow(const std::size_t cols, const t_Parameters &param)
208  {
209  ARILES2_TRACE_FUNCTION;
210  if (not param.flat_matrices_)
211  {
212  this->startArrayElement();
213  this->startVector(cols);
214  }
215  }
216  virtual void startMatrixElement()
217  {
218  ARILES2_TRACE_FUNCTION;
219  this->startVectorElement();
220  }
221  virtual void endMatrixElement()
222  {
223  ARILES2_TRACE_FUNCTION;
224  this->endVectorElement();
225  }
226  virtual void endMatrixRow(const t_Parameters &param)
227  {
228  ARILES2_TRACE_FUNCTION;
229  if (not param.flat_matrices_)
230  {
231  this->endVector();
232  this->endArrayElement();
233  }
234  }
235  virtual void endMatrix(const bool dynamic, const t_Parameters &param)
236  {
237  ARILES2_TRACE_FUNCTION;
238  if (param.flat_matrices_)
239  {
240  this->endVector();
241 
242  if (dynamic or param.explicit_matrix_size_)
243  {
244  this->endMapEntry();
245  this->endMap();
246  }
247  }
248  else
249  {
250  this->endArray();
251  }
252  }
253 
254 
255 
256  void startPointer(const bool is_null, const t_Parameters &param)
257  {
258  if (true == is_null)
259  {
260  this->startMap(param, 1);
261  this->startMapEntry("is_null");
262  this->writeElement(is_null, param);
263  this->endMapEntry();
264  }
265  else
266  {
267  this->startMap(param, 2);
268  this->startMapEntry("is_null");
269  this->writeElement(is_null, param);
270  this->endMapEntry();
271  this->startMapEntry("value");
272  }
273  }
274  void endPointer(const bool is_null)
275  {
276  if (false == is_null)
277  {
278  this->endMapEntry();
279  }
280  this->endMap();
281  }
282 
283 
284  template <class t_Scalar>
285  void writeElement(const std::complex<t_Scalar> &entry, const t_Parameters &param)
286  {
287  this->startArray(2, /*compact=*/true);
288  this->startArrayElement();
289  this->writeElement(entry.real(), param);
290  this->endArrayElement();
291  this->startArrayElement();
292  this->writeElement(entry.imag(), param);
293  this->endArrayElement();
294  this->endArray();
295  }
296  virtual void writeElement(const std::complex<float> &entry, const t_Parameters &param)
297  {
298  writeElement<float>(entry, param);
299  }
300  virtual void writeElement(const std::complex<double> &entry, const t_Parameters &param)
301  {
302  writeElement<double>(entry, param);
303  }
304 
305 
306 #define ARILES2_BASIC_TYPE(type) virtual void writeElement(const type &entry, const t_Parameters &param) = 0;
307 
309 
310 #undef ARILES2_BASIC_TYPE
311 
312  template <typename t_Entry>
313  void visit(const t_Entry &entry, const std::string &entry_name, const t_Parameters &param)
314  {
315  ARILES2_TRACE_FUNCTION;
316  this->startRoot(entry_name, param);
317  apply_write(static_cast<t_Derived &>(*this), entry, param);
318  this->endRoot(entry_name);
319  this->flush();
320  }
321 
322  template <typename t_Entry>
323  void visitMapEntry(const t_Entry &entry, const std::string &entry_name, const t_Parameters &param)
324  {
325  ARILES2_TRACE_FUNCTION;
326  ARILES2_TRACE_VALUE(entry_name);
327  ARILES2_TRACE_TYPE(entry);
328 
329  this->startMapEntry(entry_name);
330  apply_write(static_cast<t_Derived &>(*this), entry, param);
331  this->endMapEntry();
332  }
333 
334  template <typename t_Element>
335  void visitArrayElement(const t_Element &element, const t_Parameters &param)
336  {
337  ARILES2_TRACE_FUNCTION;
338  ARILES2_TRACE_TYPE(element);
339 
340  this->startArrayElement();
341  apply_write(static_cast<t_Derived &>(*this), element, param);
342  this->endArrayElement();
343  }
344 
345  template <typename t_Element>
346  void visitVectorElement(const t_Element &element, const t_Parameters &param)
347  {
348  ARILES2_TRACE_FUNCTION;
349 
350  this->startVectorElement();
351  this->writeElement(element, param);
352  this->endVectorElement();
353  }
354 
355  template <typename t_Element>
356  void visitMatrixElement(const t_Element &element, const t_Parameters &param)
357  {
358  ARILES2_TRACE_FUNCTION;
359 
360  this->startMatrixElement();
361  this->writeElement(element, param);
362  this->endMatrixElement();
363  }
364  };
365 
366 
367  class ARILES2_VISIBILITY_ATTRIBUTE Visitor : public VisitorBase<Visitor, Parameters>
368  {
369  protected:
371  {
372  }
374  {
375  }
376 
377  public:
378  template <class t_Entry>
379  void startMap(t_Entry &entry, const Parameters &parameters)
380  {
381  startMap(parameters, ariles2::apply<ariles2::Count>(entry));
382  }
383 
385  };
386 
387 
388  class ARILES2_VISIBILITY_ATTRIBUTE Base : public entry::ConstBase<write::Visitor>
389  {
390  };
391 
392 
393 #define ARILES2_NAMED_ENTRY_write(v, entry, name) visitor.visitMapEntry(entry, #name, parameters);
394 #define ARILES2_PARENT_write(v, entry)
395 #define ARILES2_VISIT_write \
396  template <class t_Visitor> \
397  void arilesVisit( \
398  t_Visitor &visitor, \
399  const typename t_Visitor::Parameters &parameters, \
400  ARILES2_IS_BASE_ENABLER(ariles2::write::Visitor, t_Visitor)) const \
401  { \
402  ARILES2_TRACE_FUNCTION; \
403  ARILES2_UNUSED_ARG(visitor); \
404  ARILES2_UNUSED_ARG(parameters); \
405  arilesVisitParents(visitor, parameters); \
406  ARILES2_ENTRIES(write) \
407  }
408 
409 #define ARILES2_METHODS_write ARILES2_METHODS(write, ARILES2_EMPTY_MACRO, const)
410 #define ARILES2_BASE_METHODS_write ARILES2_BASE_METHODS(write)
411  } // namespace write
412 
413 
414  /// @ingroup write
416 } // namespace ariles2
ariles2::write::VisitorBase::endPointer
void endPointer(const bool is_null)
Definition: write.h:274
ariles2::serialization::Base
Definition: serialization.h:141
ariles2
Definition: basic.h:16
ariles2::write::VisitorBase::endMap
virtual void endMap()
Ends a nested map in the configuration file.
Definition: write.h:115
ariles2::Write
write::Visitor Write
Definition: write.h:415
ariles2::write::VisitorBase::endVector
virtual void endVector()
Definition: write.h:169
ariles2::write::VisitorBase::startIteratedMap
virtual bool startIteratedMap(const std::size_t num_entries, const t_Parameters &param)
Definition: write.h:120
ariles2::write::Visitor
Definition: write.h:367
ariles2::write::apply_write
void ARILES2_VISIBILITY_ATTRIBUTE apply_write(t_Visitor &writer, const t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES2_IS_BASE_ENABLER(ariles2::write::Base, t_Entry))
Definition: basic.h:85
ariles2::write::VisitorBase::startVectorElement
virtual void startVectorElement()
Definition: write.h:159
ariles2::write::VisitorBase::endVectorElement
virtual void endVectorElement()
Definition: write.h:164
ARILES2_BASIC_TYPES_LIST
#define ARILES2_BASIC_TYPES_LIST
Definition: helpers.h:131
ariles2::serialization::Parameters
Definition: serialization.h:26
t_Parameters
ariles2::write::VisitorBase::writeElement
virtual void writeElement(const std::complex< float > &entry, const t_Parameters &param)
Definition: write.h:296
ariles2::write::VisitorBase::endMapEntry
virtual void endMapEntry()
Definition: write.h:109
ariles2::write::VisitorBase::endMatrix
virtual void endMatrix(const bool dynamic, const t_Parameters &param)
Definition: write.h:235
ariles2::write::VisitorBase::startMapEntry
virtual void startMapEntry(const std::string &map_name)
Starts a nested map in the configuration file.
Definition: write.h:105
ariles2::write::VisitorBase::endMatrixElement
virtual void endMatrixElement()
Definition: write.h:221
ariles2::write::VisitorBase::visitVectorElement
void visitVectorElement(const t_Element &element, const t_Parameters &param)
Definition: write.h:346
ariles2::write::VisitorBase::endIteratedMap
virtual void endIteratedMap()
Definition: write.h:133
ariles2::write::VisitorBase::writeElement
virtual void writeElement(const std::complex< double > &entry, const t_Parameters &param)
Definition: write.h:300
ariles2::write::VisitorBase::startMap
virtual void startMap(const t_Parameters &, const std::size_t)
Starts a nested map in the configuration file.
Definition: write.h:97
ariles2::write::VisitorBase::startIteratedMapElement
virtual void startIteratedMapElement(const std::string &map_name)
Definition: write.h:125
ariles2::write::VisitorBase::endIteratedMapElement
virtual void endIteratedMapElement()
Definition: write.h:129
ariles2::write::VisitorBase::endMatrixRow
virtual void endMatrixRow(const t_Parameters &param)
Definition: write.h:226
ariles2::serialization::Base< Visitor, Parameters >::Parameters
Parameters Parameters
Definition: serialization.h:144
ariles2::write::Parameters
Definition: write.h:28
ariles2::write::VisitorBase::startRoot
virtual void startRoot(const std::string &name, const t_Parameters &)
Definition: write.h:69
ariles2::write::VisitorBase::startVector
virtual void startVector(const std::size_t size)
Definition: write.h:154
ariles2::write::VisitorBase::startPointer
void startPointer(const bool is_null, const t_Parameters &param)
Definition: write.h:256
ariles2::write::VisitorBase::VisitorBase
VisitorBase()
Definition: write.h:47
count.h
ariles2::write::Visitor::startMap
void startMap(t_Entry &entry, const Parameters &parameters)
Definition: write.h:379
ariles2::write::VisitorBase
Definition: write.h:44
ariles2::write::Visitor::Visitor
Visitor()
Definition: write.h:370
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::write::VisitorBase::endRoot
virtual void endRoot(const std::string &name)
Definition: write.h:77
ariles2::entry::ConstBase
Definition: common.h:100
ariles2::write::VisitorBase::startMatrixRow
virtual void startMatrixRow(const std::size_t cols, const t_Parameters &param)
Definition: write.h:207
ariles2::write::Parameters::compact_arrays_
bool compact_arrays_
Definition: write.h:31
ariles2::write::VisitorBase::visitMapEntry
void visitMapEntry(const t_Entry &entry, const std::string &entry_name, const t_Parameters &param)
Definition: write.h:323
ariles2::write::Base
Definition: write.h:388
ariles2::write::VisitorBase::visitMatrixElement
void visitMatrixElement(const t_Element &element, const t_Parameters &param)
Definition: write.h:356
ariles2::write::Parameters::Parameters
Parameters(const bool override_parameters=true)
Definition: write.h:35
ariles2::write::VisitorBase::visit
ARILES2_BASIC_TYPES_LIST void visit(const t_Entry &entry, const std::string &entry_name, const t_Parameters &param)
Definition: write.h:313
ariles2::write::VisitorBase::visitArrayElement
void visitArrayElement(const t_Element &element, const t_Parameters &param)
Definition: write.h:335
ariles2::write::Visitor::~Visitor
~Visitor()
Definition: write.h:373
serialization.h
ariles2::write::VisitorBase::openFile
static void openFile(std::ofstream &config_ofs, const std::string &file_name)
open configuration file
Definition: write.h:58
ariles2::write::VisitorBase::writeElement
void writeElement(const std::complex< t_Scalar > &entry, const t_Parameters &param)
Definition: write.h:285
ariles2::write::VisitorBase::startMatrix
virtual void startMatrix(const bool dynamic, const std::size_t cols, const std::size_t rows, const t_Parameters &param)
Definition: write.h:176
ariles2::write::VisitorBase::endArray
virtual void endArray()
Definition: write.h:148
ariles2::write::VisitorBase::startArrayElement
virtual void startArrayElement()
Definition: write.h:140
ariles2::write::VisitorBase::startMatrixElement
virtual void startMatrixElement()
Definition: write.h:216
ariles2::write::VisitorBase::~VisitorBase
~VisitorBase()
Definition: write.h:48
ariles2::write::VisitorBase::endArrayElement
virtual void endArrayElement()
Definition: write.h:144