Ariles
common.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 
14 namespace ariles
15 {
16  namespace visitor
17  {
19  {
20  protected:
21  Visitor(){};
22  ~Visitor(){};
23  };
24 
25 
26  template <class t_Parameters>
28  {
29  protected:
30  Base(){};
31  ~Base(){};
32 
33  const t_Parameters &getDefaultParameters() const
34  {
35  const static t_Parameters parameters;
36  return parameters;
37  }
38  };
39  } // namespace visitor
40 
41 
42  namespace entry
43  {
44 #define ARILES_METHODS(Namespace, VisitorQualifier, MethodQualifier) \
45  virtual void arilesVirtualVisit( \
46  VisitorQualifier ariles::Namespace::Visitor &visitor, const ariles::Namespace::Visitor::Parameters &param) \
47  MethodQualifier \
48  { \
49  ARILES_TRACE_FUNCTION; \
50  this->arilesVisit(visitor, param); \
51  } \
52  using ariles::Namespace::Base::arilesGetParameters;
53 
54 
55  template <class t_Visitor>
57  {
58  public:
59  virtual void arilesVirtualVisit(t_Visitor &, const typename t_Visitor::Parameters &) = 0;
60 
61  virtual const typename t_Visitor::Parameters &arilesGetParameters(const t_Visitor &visitor) const
62  {
64  return (visitor.getDefaultParameters());
65  }
66  };
67 
68 
69  template <class t_Visitor>
71  {
72  public:
73  virtual void arilesVirtualVisit(t_Visitor &, const typename t_Visitor::Parameters &) const = 0;
74 
75  virtual const typename t_Visitor::Parameters &arilesGetParameters(const t_Visitor &visitor) const
76  {
78  return (visitor.getDefaultParameters());
79  }
80  };
81  } // namespace entry
82 } // namespace ariles
83 
84 #ifndef ARILES_DISABLE
85 # ifndef ARILES_ENABLED
86 # define ARILES_ENABLED
87 # endif
88 #endif
89 
90 #ifdef ARILES_ENABLED
91 
92 namespace ariles
93 {
94  // -----
95  template <class t_Ariles, class t_Visitor>
96  void apply(
97  t_Visitor &visitor,
98  t_Ariles &ariles_class,
99  const std::string &name,
100  const typename t_Visitor::Parameters &param,
102  {
104  visitor.start(ariles_class, name, param);
105  }
106 
107 
108  template <class t_Ariles, class t_Visitor>
109  void apply(
110  t_Visitor &visitor,
111  t_Ariles &ariles_class,
112  const char *name,
113  const typename t_Visitor::Parameters &param,
115  {
117  visitor.start(ariles_class, name, param);
118  }
119 
120 
121  template <class t_Visitor, class t_Ariles>
122  void apply(
123  t_Visitor &visitor,
124  t_Ariles &ariles_class,
125  const typename t_Visitor::Parameters &param,
127  {
129  ariles::apply(visitor, ariles_class, ariles_class.arilesDefaultID(), param);
130  }
131 
132 
133  template <class t_Visitor, class t_Ariles>
134  void apply(
135  t_Visitor &visitor,
136  t_Ariles &ariles_class,
137  const std::string &name,
139  {
141  ariles::apply(visitor, ariles_class, name, visitor.getParameters(ariles_class));
142  }
143 
144 
145  template <class t_Visitor, class t_Ariles>
146  void apply(
147  t_Visitor &visitor,
148  t_Ariles &ariles_class,
149  const char *name,
151  {
153  ariles::apply(visitor, ariles_class, name, visitor.getParameters(ariles_class));
154  }
155 
156 
157  template <class t_Visitor, class t_Ariles>
158  void apply(t_Visitor &visitor, t_Ariles &ariles_class, ARILES_IS_BASE_ENABLER(ariles::visitor::Visitor, t_Visitor))
159  {
161  ariles::apply(visitor, ariles_class, ariles_class.arilesDefaultID());
162  }
163 
164 
165  template <class t_Visitor, class t_Ariles>
166  void apply(t_Ariles &ariles_class, ARILES_IS_BASE_ENABLER(ariles::visitor::Visitor, t_Visitor))
167  {
169  t_Visitor visitor;
170  ariles::apply(visitor, ariles_class);
171  }
172  // -----
173 
174 
175 
176  // -----
177  template <class t_Visitor, class t_Ariles, class t_Arg>
178  void apply(
179  t_Arg &arg,
180  t_Ariles &ariles_class,
183  {
185  t_Visitor visitor(arg);
186  ariles::apply(visitor, ariles_class);
187  }
188 
189 
190  template <class t_Visitor, class t_Ariles, class t_Arg>
191  void apply(
192  t_Arg &arg,
193  t_Ariles &ariles_class,
194  const char *name,
197  {
199  t_Visitor visitor(arg);
200  ariles::apply(visitor, ariles_class, name);
201  }
202 
203 
204  template <class t_Visitor, class t_Ariles, class t_Arg>
205  void apply(
206  const t_Arg &arg,
207  t_Ariles &ariles_class,
210  {
212  t_Visitor visitor(arg);
213  ariles::apply(visitor, ariles_class);
214  }
215 
216 
217  template <class t_Visitor, class t_Ariles, class t_Arg>
218  void apply(
219  t_Arg &arg,
220  t_Ariles &ariles_class,
221  const typename t_Visitor::Parameters &param,
224  {
226  t_Visitor visitor(arg);
227  ariles::apply(visitor, ariles_class, param);
228  }
229 
230 
231  template <class t_Visitor, class t_Ariles>
232  void apply(
233  const std::string &arg,
234  t_Ariles &ariles_class,
235  const unsigned int flags,
237  {
239  t_Visitor visitor(arg);
240  ariles::apply(visitor, ariles_class, typename t_Visitor::Parameters(flags));
241  }
242  // -----
243 
244 
245  // -----
246  template <class t_Visitor, class t_Left, class t_Right>
247  void apply(
248  t_Visitor &visitor,
249  t_Left &left,
250  t_Right &right,
251  const std::string &name,
252  const typename t_Visitor::Parameters &param,
254  {
256  try
257  {
258  visitor.start(left, right, name, param);
259  }
260  catch (std::exception &e)
261  {
262  if (true == param.throw_on_error_)
263  {
264  ARILES_THROW(std::string("Comparison failed: ") + e.what());
265  }
266  visitor.equal_ = false;
267  }
268  }
269 
270 
271  template <class t_Visitor, class t_Left, class t_Right>
272  void apply(
273  t_Visitor &visitor,
274  t_Left &left,
275  t_Right &right,
277  {
279  ariles::apply(visitor, left, right, left.arilesDefaultID(), visitor.getParameters(left));
280  }
281 
282 
283  template <class t_Visitor, class t_Left, class t_Right>
284  void apply(
285  t_Visitor &visitor,
286  t_Left &left,
287  t_Right &right,
288  const typename t_Visitor::Parameters &param,
290  {
292  ariles::apply(visitor, left, right, left.arilesDefaultID(), param);
293  }
294  // -----
295 } // namespace ariles
296 
297 #else
298 
299 namespace ariles
300 {
301  // -----
302  template <class t_One, class t_Two, class t_Three, class t_Four, class t_Five>
303  void apply(t_One, t_Two, t_Three, t_Four, t_Five)
304  {
305  }
306 
307  template <class t_One, class t_Two, class t_Three, class t_Four>
308  void apply(t_One, t_Two, t_Three, t_Four)
309  {
310  }
311 
312  template <class t_One, class t_Two, class t_Three>
313  void apply(t_One, t_Two, t_Three)
314  {
315  }
316 
317  template <class t_One, class t_Two>
318  void apply(t_One, t_Two)
319  {
320  }
321 
322  template <class t_One, class t_Two>
323  void apply(t_Two)
324  {
325  }
326  // -----
327 } // namespace ariles
328 
329 #endif
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
#define ARILES_IS_BASE_ENABLER(Base, Derived)
Definition: helpers.h:48
virtual const t_Visitor::Parameters & arilesGetParameters(const t_Visitor &visitor) const
Definition: common.h:61
virtual const t_Visitor::Parameters & arilesGetParameters(const t_Visitor &visitor) const
Definition: common.h:75
const t_Parameters & getDefaultParameters() const
Definition: common.h:33
#define ARILES_IS_BASE_DISABLER(Base, Derived)
Definition: helpers.h:51
#define ARILES_VISIBILITY_ATTRIBUTE
Definition: helpers.h:69
Definition: basic.h:17