Ariles
basic.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2017-2018 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 "../internal/helpers.h"
14 #include "../visitors/count.h"
15 
16 namespace ariles2
17 {
18  namespace read
19  {
20  template <class t_Visitor, class t_Entry>
22  t_Visitor &visitor,
23  t_Entry &entry,
24  const typename t_Visitor::Parameters &parameters,
26  {
27  ARILES2_TRACE_FUNCTION;
28 
29  if (true == parameters.override_parameters_)
30  {
31  visitor.startMap(entry, parameters);
32  entry.arilesVirtualVisit(visitor, parameters);
33  }
34  else
35  {
36  visitor.startMap(entry, entry.arilesGetParameters(visitor));
37  entry.arilesVirtualVisit(visitor, entry.arilesGetParameters(visitor));
38  }
39  visitor.endMap();
40  }
41 
42 
43  /**
44  * @brief Read configuration entry (an enum)
45  * This function is necessary since an explicit casting to integer is needed.
46  */
47  template <class t_Visitor, typename t_Enumeration>
49  t_Visitor &visitor,
50  t_Enumeration &entry,
51  const typename t_Visitor::Parameters & /*param*/,
52  // ENABLE this function for enums
53  ARILES2_IS_ENUM_ENABLER(t_Enumeration))
54  {
55  ARILES2_TRACE_FUNCTION;
56  int tmp_value = 0;
57  visitor.readElement(tmp_value);
58  entry = static_cast<t_Enumeration>(tmp_value);
59  }
60 
61 
62 #define ARILES2_BASIC_TYPE(type) \
63  template <class t_Visitor> \
64  void ARILES2_VISIBILITY_ATTRIBUTE apply_read( \
65  t_Visitor &visitor, type &entry, const typename t_Visitor::Parameters &param) \
66  { \
67  ARILES2_TRACE_FUNCTION; \
68  ARILES2_UNUSED_ARG(param); \
69  visitor.readElement(entry); \
70  }
71 
74 
75 #undef ARILES2_BASIC_TYPE
76  } // namespace read
77 } // namespace ariles2
78 
79 
80 namespace ariles2
81 {
82  namespace write
83  {
84  template <class t_Visitor, class t_Entry>
86  t_Visitor &writer,
87  const t_Entry &entry,
88  const typename t_Visitor::Parameters &parameters,
90  {
91  ARILES2_TRACE_FUNCTION;
92 
93  if (true == parameters.override_parameters_)
94  {
95  writer.startMap(entry, parameters);
96  entry.arilesVirtualVisit(writer, parameters);
97  }
98  else
99  {
100  writer.startMap(entry, entry.arilesGetParameters(writer));
101  entry.arilesVirtualVisit(writer, entry.arilesGetParameters(writer));
102  }
103  writer.endMap();
104  }
105 
106 
107 
108  template <class t_Visitor, typename t_Enumeration>
110  t_Visitor &writer,
111  const t_Enumeration entry,
112  const typename t_Visitor::Parameters &param,
113  ARILES2_IS_ENUM_ENABLER(t_Enumeration))
114  {
115  ARILES2_TRACE_FUNCTION;
116  int tmp_value = entry;
117  writer.writeElement(tmp_value, param);
118  }
119 
120 
121 #define ARILES2_BASIC_TYPE(type) \
122  template <class t_Visitor> \
123  void ARILES2_VISIBILITY_ATTRIBUTE apply_write( \
124  t_Visitor &writer, const type &entry, const typename t_Visitor::Parameters &param) \
125  { \
126  ARILES2_TRACE_FUNCTION; \
127  writer.writeElement(entry, param); \
128  }
129 
130  /**
131  * @brief Generate apply methods for basic types.
132  */
135 
136 #undef ARILES2_BASIC_TYPE
137  } // namespace write
138 } // namespace ariles2
139 
140 
141 namespace ariles2
142 {
143  namespace compare
144  {
145  template <class t_Visitor, class t_Left, class t_Right>
147  t_Visitor &visitor,
148  const t_Left &left,
149  const t_Right &right,
150  const typename t_Visitor::Parameters &param,
152  {
153  ARILES2_TRACE_FUNCTION;
154  if (true == param.compare_number_of_entries_)
155  {
156  visitor.equal_ &= (ariles2::apply<ariles2::Count>(left) == ariles2::apply<ariles2::Count>(right));
157  }
158  left.arilesVisit(visitor, right, param);
159  }
160 
161 
162  template <class t_Visitor, typename t_Enumeration>
164  t_Visitor &visitor,
165  const t_Enumeration &left,
166  const t_Enumeration &right,
167  const typename t_Visitor::Parameters & /*param*/,
168  ARILES2_IS_ENUM_ENABLER(t_Enumeration))
169  {
170  visitor.equal_ &= (left == right);
171  }
172 
173 
174 #define ARILES2_BASIC_TYPE(type) \
175  template <class t_Visitor> \
176  inline void ARILES2_VISIBILITY_ATTRIBUTE apply_compare( \
177  t_Visitor &visitor, const type &left, const type &right, const typename t_Visitor::Parameters &) \
178  { \
179  visitor.equal_ &= (left == right); \
180  }
181 
182 /**
183  * @brief Generate compare methods for basic types.
184  */
185 #define ARILES2_COMPARE_TYPES_LIST \
186  ARILES2_BASIC_INTEGER_TYPES_LIST \
187  ARILES2_BASIC_TYPE(bool) \
188  ARILES2_BASIC_TYPE(std::string)
189 
191 
192 #undef ARILES2_BASIC_TYPE
193 
194 
195 
196  template <class t_Visitor, class t_Scalar>
198  t_Visitor &visitor,
199  const std::complex<t_Scalar> &left,
200  const std::complex<t_Scalar> &right,
201  const typename t_Visitor::Parameters &param)
202  {
203  apply_compare(visitor, left.real(), right.real(), param);
204  apply_compare(visitor, left.imag(), right.imag(), param);
205  }
206 
207 
208  template <class t_Visitor>
210  t_Visitor &visitor,
211  const float &left,
212  const float &right,
213  const typename t_Visitor::Parameters &param)
214  {
215  visitor.equal_ &= (visitor.compareFloats(left, right, param));
216  }
217 
218 
219  template <class t_Visitor>
221  t_Visitor &visitor,
222  const double &left,
223  const double &right,
224  const typename t_Visitor::Parameters &param)
225  {
226  visitor.equal_ &= visitor.compareFloats(left, right, param);
227  }
228  } // namespace compare
229 } // namespace ariles2
230 
231 
232 namespace ariles2
233 {
234  namespace defaults
235  {
236  template <class t_Visitor, class t_Entry>
238  const t_Visitor &visitor,
239  t_Entry &entry,
240  const typename t_Visitor::Parameters &param,
242  {
243  ARILES2_TRACE_FUNCTION;
244  entry.arilesVirtualVisit(visitor, param);
245  }
246 
247 
248  template <class t_Visitor, typename t_Enumeration>
250  const t_Visitor & /*visitor*/,
251  t_Enumeration & /*entry*/,
252  const typename t_Visitor::Parameters & /*param*/,
253  ARILES2_IS_ENUM_ENABLER(t_Enumeration))
254  {
255  ARILES2_TRACE_FUNCTION;
256  }
257 
258 
259  template <class t_Visitor, typename t_Scalar>
261  const t_Visitor & /*visitor*/,
262  std::complex<t_Scalar> &entry,
263  const typename t_Visitor::Parameters &param)
264  {
265  ARILES2_TRACE_FUNCTION;
266  entry.real(param.template getDefault<t_Scalar>());
267  entry.imag(param.template getDefault<t_Scalar>());
268  }
269 
270 
271 #define ARILES2_BASIC_TYPE(type) \
272  template <class t_Visitor> \
273  void ARILES2_VISIBILITY_ATTRIBUTE apply_defaults( \
274  const t_Visitor &, type &entry, const typename t_Visitor::Parameters &param) \
275  { \
276  ARILES2_TRACE_FUNCTION; \
277  entry = param.template getDefault<type>(); \
278  }
279 
281 
282 #undef ARILES2_BASIC_TYPE
283  } // namespace defaults
284 } // namespace ariles2
285 
286 
287 
288 namespace ariles2
289 {
290  namespace process
291  {
292  template <class t_Visitor, class t_Entry>
294  const t_Visitor &visitor,
295  t_Entry &entry,
296  const typename t_Visitor::Parameters &param,
298  {
299  ARILES2_TRACE_FUNCTION;
300  entry.arilesVirtualVisit(visitor, param);
301  }
302 
303 
304  template <class t_Visitor, class t_Entry>
306  const t_Visitor &,
307  t_Entry &,
308  const typename t_Visitor::Parameters &,
310  {
311  ARILES2_TRACE_FUNCTION;
312  }
313  } // namespace process
314 } // namespace ariles2
315 
316 
317 
318 namespace ariles2
319 {
320  namespace copyfrom
321  {
322  template <class t_Visitor, class t_Left, class t_Right>
324  t_Visitor &visitor,
325  t_Left &left,
326  const t_Right &right,
327  const typename t_Visitor::Parameters &param,
329  {
330  ARILES2_TRACE_FUNCTION;
331  ARILES2_TRACE_TYPE(left);
332  ARILES2_TRACE_TYPE(right);
333 
334  left.arilesVisit(visitor, right, param);
335  }
336 
337 
338 #define ARILES2_BASIC_TYPE(type) \
339  template <class t_Visitor> \
340  void ARILES2_VISIBILITY_ATTRIBUTE apply_copyfrom( \
341  t_Visitor &, type &left, const type &right, const typename t_Visitor::Parameters &) \
342  { \
343  ARILES2_TRACE_FUNCTION; \
344  left = right; \
345  }
346 
349 
350 #undef ARILES2_BASIC_TYPE
351 
352  template <class t_Visitor, typename t_Enumeration>
354  t_Visitor &,
355  t_Enumeration &left,
356  const t_Enumeration &right,
357  const typename t_Visitor::Parameters &,
358  ARILES2_IS_ENUM_ENABLER(t_Enumeration))
359  {
360  ARILES2_TRACE_FUNCTION;
361  left = right;
362  }
363  } // namespace copyfrom
364 
365 
366  namespace copyto
367  {
368  template <class t_Visitor, class t_Left, class t_Right>
370  t_Visitor &visitor,
371  const t_Left &left,
372  t_Right &right,
373  const typename t_Visitor::Parameters &param,
375  {
376  ARILES2_TRACE_FUNCTION;
377  ARILES2_TRACE_TYPE(left);
378  ARILES2_TRACE_TYPE(right);
379 
380  left.arilesVisit(visitor, right, param);
381  }
382 
383 
384 #define ARILES2_BASIC_TYPE(type) \
385  template <class t_Visitor> \
386  void ARILES2_VISIBILITY_ATTRIBUTE apply_copyto( \
387  t_Visitor &, const type &left, type &right, const typename t_Visitor::Parameters &) \
388  { \
389  ARILES2_TRACE_FUNCTION; \
390  right = left; \
391  }
392 
395 
396 #undef ARILES2_BASIC_TYPE
397 
398  template <class t_Visitor, typename t_Enumeration>
400  t_Visitor &,
401  const t_Enumeration &left,
402  t_Enumeration &right,
403  const typename t_Visitor::Parameters &,
404  ARILES2_IS_ENUM_ENABLER(t_Enumeration))
405  {
406  ARILES2_TRACE_FUNCTION;
407  right = left;
408  }
409  } // namespace copyto
410 } // namespace ariles2
ariles2::copyfrom::apply_copyfrom
void ARILES2_VISIBILITY_ATTRIBUTE apply_copyfrom(t_Visitor &visitor, t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:323
ariles2
Definition: basic.h:16
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_BASIC_TYPES_LIST
#define ARILES2_BASIC_TYPES_LIST
Definition: helpers.h:131
ARILES2_COMPARE_TYPES_LIST
#define ARILES2_COMPARE_TYPES_LIST
Generate compare methods for basic types.
Definition: basic.h:185
ariles2::process::apply_process
void ARILES2_VISIBILITY_ATTRIBUTE apply_process(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Entry))
Definition: basic.h:293
ariles2::defaults::Base
Definition: defaults.h:117
ariles2::Ariles
Definition: helpers.h:153
t_Visitor
ariles2::compare::apply_compare
void ARILES2_VISIBILITY_ATTRIBUTE apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:146
ARILES2_COMPLEX_NUMBER_TYPES_LIST
#define ARILES2_COMPLEX_NUMBER_TYPES_LIST
Definition: helpers.h:127
ariles2::read::Base
Definition: read.h:522
ARILES2_IS_BASE_DISABLER
#define ARILES2_IS_BASE_DISABLER(Base, Derived)
Definition: helpers.h:63
ARILES2_IS_BASE_ENABLER
#define ARILES2_IS_BASE_ENABLER(Base, Derived)
Definition: helpers.h:60
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::write::Base
Definition: write.h:388
ARILES2_IS_ENUM_ENABLER
#define ARILES2_IS_ENUM_ENABLER(Enum)
Definition: helpers.h:52
ariles2::read::apply_read
void ARILES2_VISIBILITY_ATTRIBUTE apply_read(t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES2_IS_BASE_ENABLER(ariles2::read::Base, t_Entry))
Definition: basic.h:21
ariles2::copyto::apply_copyto
void ARILES2_VISIBILITY_ATTRIBUTE apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:369
ariles2::defaults::apply_defaults
void ARILES2_VISIBILITY_ATTRIBUTE apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::defaults::Base, t_Entry))
Definition: basic.h:237