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 #ifndef ARILES_API_VERSION
14 # define ARILES_API_VERSION 1
15 #endif
16 
17 namespace ariles
18 {
19  namespace read
20  {
21  template <class t_Visitor, class t_Entry>
23  t_Visitor &visitor,
24  t_Entry &entry,
25  const typename t_Visitor::Parameters &parameters,
27  {
29 
30  typename t_Visitor::Parameters param = parameters;
31  if (false == param.isSet(t_Visitor::Parameters::PROPAGATE_ALLOW_MISSING_ENTRIES))
32  {
33  param.set(t_Visitor::Parameters::DEFAULT & t_Visitor::Parameters::ALLOW_MISSING_ENTRIES);
34  }
35 
36  ariles::count::Visitor counter;
37  ariles::apply(counter, entry);
38  if (true == param.isSet(t_Visitor::Parameters::ALLOW_MISSING_ENTRIES))
39  {
40  visitor.template startMap<t_Visitor::SIZE_LIMIT_NONE>(counter.counter_);
41  }
42  else
43  {
44  visitor.template startMap<t_Visitor::SIZE_LIMIT_EQUAL>(counter.counter_);
45  }
46  entry.arilesVirtualVisit(visitor, param);
47  visitor.endMap();
48 
49 #if 1 == ARILES_API_VERSION
50  entry.finalize(); /// @todo DEPRECATED
51 #endif
52  }
53 
54 
55  /**
56  * @brief Read configuration entry (an enum)
57  * This function is necessary since an explicit casting to integer is needed.
58  */
59  template <class t_Visitor, typename t_Enumeration>
61  t_Visitor &visitor,
62  t_Enumeration &entry,
63  const typename t_Visitor::Parameters & /*param*/,
64  // ENABLE this function for enums
65  ARILES_IS_ENUM_ENABLER(t_Enumeration))
66  {
68  int tmp_value = 0;
69  visitor.readElement(tmp_value);
70  entry = static_cast<t_Enumeration>(tmp_value);
71  }
72 
73 
74 #define ARILES_BASIC_TYPE(type) \
75  template <class t_Visitor> \
76  void ARILES_VISIBILITY_ATTRIBUTE apply_read( \
77  t_Visitor &visitor, type &entry, const typename t_Visitor::Parameters &param) \
78  { \
79  ARILES_TRACE_FUNCTION; \
80  ARILES_UNUSED_ARG(param); \
81  visitor.readElement(entry); \
82  }
83 
85 
86 #undef ARILES_BASIC_TYPE
87  } // namespace read
88 } // namespace ariles
89 
90 
91 namespace ariles
92 {
93  namespace write
94  {
95  template <class t_Visitor, class t_Entry>
97  t_Visitor &writer,
98  const t_Entry &entry,
99  const typename t_Visitor::Parameters &param,
101  {
103  ariles::count::Visitor counter;
104  ariles::apply(counter, entry);
105  writer.startMap(counter.counter_);
106  entry.arilesVirtualVisit(writer, param);
107  writer.endMap();
108  }
109 
110 
111 
112  template <class t_Visitor, typename t_Enumeration>
114  t_Visitor &writer,
115  const t_Enumeration entry,
116  const typename t_Visitor::Parameters & /*param*/,
117  ARILES_IS_ENUM_ENABLER(t_Enumeration))
118  {
120  int tmp_value = entry;
121  writer.writeElement(tmp_value);
122  }
123 
124 
125 #define ARILES_BASIC_TYPE(type) \
126  template <class t_Visitor> \
127  void ARILES_VISIBILITY_ATTRIBUTE apply_write( \
128  t_Visitor &writer, const type &entry, const typename t_Visitor::Parameters &) \
129  { \
130  ARILES_TRACE_FUNCTION; \
131  writer.writeElement(entry); \
132  }
133 
134  /**
135  * @brief Generate apply methods for basic types.
136  */
138 
139 #undef ARILES_BASIC_TYPE
140  } // namespace write
141 } // namespace ariles
142 
143 
144 namespace ariles
145 {
146  namespace compare
147  {
148  template <class t_Visitor, class t_Left, class t_Right>
150  t_Visitor &visitor,
151  const t_Left &left,
152  const t_Right &right,
153  const typename t_Visitor::Parameters &param,
155  {
157  if (true == param.compare_number_of_entries_)
158  {
159  ariles::count::Visitor counter;
160  ariles::apply(counter, left);
161 
162  const std::size_t left_counter = counter.counter_;
163  ariles::apply(counter, right);
164 
165  visitor.equal_ &= (left_counter == counter.counter_);
166  }
167  left.arilesVisit(visitor, right, param);
168  }
169 
170 
171  template <class t_Visitor, typename t_Enumeration>
173  t_Visitor &visitor,
174  const t_Enumeration &left,
175  const t_Enumeration &right,
176  const typename t_Visitor::Parameters & /*param*/,
177  ARILES_IS_ENUM_ENABLER(t_Enumeration))
178  {
179  visitor.equal_ &= (left == right);
180  }
181 
182 
183 #define ARILES_BASIC_TYPE(type) \
184  template <class t_Visitor> \
185  inline void ARILES_VISIBILITY_ATTRIBUTE apply_compare( \
186  t_Visitor &visitor, const type &left, const type &right, const typename t_Visitor::Parameters &) \
187  { \
188  visitor.equal_ &= (left == right); \
189  }
190 
191 /**
192  * @brief Generate compare methods for basic types.
193  */
194 #define ARILES_COMPARE_TYPES_LIST \
195  ARILES_BASIC_INTEGER_TYPES_LIST \
196  ARILES_BASIC_TYPE(bool) \
197  ARILES_BASIC_TYPE(std::string)
198 
200 
201 #undef ARILES_BASIC_TYPE
202 
203 
204 
205  template <class t_Visitor>
207  t_Visitor &visitor,
208  const float &left,
209  const float &right,
210  const typename t_Visitor::Parameters &param)
211  {
212  visitor.equal_ &= (visitor.compareFloats(left, right, param));
213  }
214 
215 
216  template <class t_Visitor>
218  t_Visitor &visitor,
219  const double &left,
220  const double &right,
221  const typename t_Visitor::Parameters &param)
222  {
223  visitor.equal_ &= visitor.compareFloats(left, right, param);
224  }
225  } // namespace compare
226 } // namespace ariles
227 
228 
229 namespace ariles
230 {
231  namespace defaults
232  {
233  template <class t_Visitor, class t_Entry>
235  const t_Visitor &visitor,
236  t_Entry &entry,
237  const typename t_Visitor::Parameters &param,
239  {
241  entry.arilesVirtualVisit(visitor, param);
242  }
243 
244 
245  template <class t_Visitor, typename t_Enumeration>
247  const t_Visitor & /*visitor*/,
248  t_Enumeration & /*entry*/,
249  const typename t_Visitor::Parameters & /*param*/,
250  ARILES_IS_ENUM_ENABLER(t_Enumeration))
251  {
253  }
254 
255 
256 #define ARILES_BASIC_TYPE(type) \
257  template <class t_Visitor> \
258  void ARILES_VISIBILITY_ATTRIBUTE apply_defaults( \
259  const t_Visitor &, type &entry, const typename t_Visitor::Parameters &param) \
260  { \
261  ARILES_TRACE_FUNCTION; \
262  entry = param.template getDefault<type>(); \
263  }
264 
266 
267 #undef ARILES_BASIC_TYPE
268  } // namespace defaults
269 } // namespace ariles
270 
271 
272 
273 namespace ariles
274 {
275  namespace process
276  {
277  template <class t_Visitor, class t_Entry>
279  const t_Visitor &visitor,
280  t_Entry &entry,
281  const typename t_Visitor::Parameters &param,
283  {
285  entry.arilesVirtualVisit(visitor, param);
286 #if 1 == ARILES_API_VERSION
287  if (true == ARILES_IS_BASE_OF(ariles::postprocess::Base, t_Entry))
288  {
289  entry.finalize(); /// @todo DEPRECATED
290  }
291 #endif
292  }
293 
294 
295  template <class t_Visitor, class t_Entry>
297  const t_Visitor &,
298  t_Entry &,
299  const typename t_Visitor::Parameters &,
301  {
303  }
304  } // namespace process
305 } // namespace ariles
void ARILES_VISIBILITY_ATTRIBUTE apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::Ariles, t_Left))
Definition: basic.h:149
void apply(t_Visitor &visitor, t_Ariles &ariles_class, const std::string &name, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::visitor::Visitor, t_Visitor))
Definition: common.h:96
#define ARILES_TRACE_FUNCTION
Definition: trace.h:118
void ARILES_VISIBILITY_ATTRIBUTE apply_process(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::Ariles, t_Entry))
Definition: basic.h:278
void ARILES_VISIBILITY_ATTRIBUTE apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::defaults::Base, t_Entry))
Definition: basic.h:234
#define ARILES_IS_BASE_ENABLER(Base, Derived)
Definition: helpers.h:48
#define ARILES_IS_BASE_OF(Base, Derived)
Definition: helpers.h:46
#define ARILES_BASIC_TYPES_LIST
Definition: helpers.h:105
#define ARILES_IS_ENUM_ENABLER(Enum)
Definition: helpers.h:44
#define ARILES_IS_BASE_DISABLER(Base, Derived)
Definition: helpers.h:51
void ARILES_VISIBILITY_ATTRIBUTE apply_write(t_Visitor &writer, const t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::write::Base, t_Entry))
Definition: basic.h:96
#define ARILES_COMPARE_TYPES_LIST
Generate compare methods for basic types.
Definition: basic.h:194
std::size_t counter_
Definition: count.h:31
#define ARILES_VISIBILITY_ATTRIBUTE
Definition: helpers.h:69
void ARILES_VISIBILITY_ATTRIBUTE apply_read(t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES_IS_BASE_ENABLER(ariles::read::Base, t_Entry))
Definition: basic.h:22
Definition: basic.h:17