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 #include <vector>
14 #include "../internal/helpers.h"
15 
16 namespace ariles2
17 {
18  namespace visitor
19  {
20  class Parameters
21  {
22  public:
24 
25  public:
26  Parameters(const bool override_parameters = true)
27  {
28  override_parameters_ = override_parameters;
29  }
30  };
31 
32 
34  {
35  protected:
36  Visitor(){};
37  ~Visitor(){};
38  };
39 
40 
42  {
43  protected:
46  };
47 
48 
49  template <class t_Visitor, class t_Parameters, class t_ReturnType = void>
51  {
52  public:
53  typedef t_ReturnType ReturnType;
54 
55  protected:
56  Base(){};
57  ~Base(){};
58 
60  {
61  const static t_Parameters parameters(false);
62  return parameters;
63  }
64  };
65  } // namespace visitor
66 
67 
68 #define ARILES2_BASE_METHODS(Namespace) \
69  using Namespace::Base::arilesVirtualVisit; \
70  using Namespace::Base::arilesGetParameters;
71 
72 #define ARILES2_METHODS(Namespace, VisitorQualifier, MethodQualifier) \
73  virtual void arilesVirtualVisit( \
74  VisitorQualifier ariles2::Namespace::Visitor &visitor, \
75  const ariles2::Namespace::Visitor::Parameters &param) MethodQualifier \
76  { \
77  ARILES2_TRACE_FUNCTION; \
78  this->arilesVisit(visitor, param); \
79  } \
80  using ariles2::Namespace::Base::arilesGetParameters;
81 
82 
83  namespace entry
84  {
85  template <class t_Visitor>
87  {
88  public:
89  virtual void arilesVirtualVisit(t_Visitor &, const typename t_Visitor::Parameters &) = 0;
90 
91  virtual const typename t_Visitor::Parameters &arilesGetParameters(const t_Visitor &visitor) const
92  {
93  ARILES2_TRACE_FUNCTION;
94  return (visitor.getDefaultParameters());
95  }
96  };
97 
98 
99  template <class t_Visitor>
101  {
102  public:
103  virtual void arilesVirtualVisit(t_Visitor &, const typename t_Visitor::Parameters &) const = 0;
104 
105  virtual const typename t_Visitor::Parameters &arilesGetParameters(const t_Visitor &visitor) const
106  {
107  ARILES2_TRACE_FUNCTION;
108  return (visitor.getDefaultParameters());
109  }
110  };
111  } // namespace entry
112 } // namespace ariles2
113 
114 #ifndef ARILES2_DISABLE
115 # ifndef ARILES2_ENABLED
116 # define ARILES2_ENABLED
117 # endif
118 #endif
119 
120 #ifdef ARILES2_ENABLED
121 
122 namespace ariles2
123 {
124  // -----
125  template <class t_Ariles, class t_Visitor, class t_Subtree>
126  typename t_Visitor::ReturnType apply(
127  t_Visitor &visitor,
128  t_Ariles &ariles_class,
129  const t_Subtree &subtree,
130  const typename t_Visitor::Parameters &param,
131  ARILES2_IS_ANY_OF(t_Subtree, std::string, std::vector<std::string>),
133  {
134  ARILES2_TRACE_FUNCTION;
135  return (visitor.visit(ariles_class, subtree, param));
136  }
137 
138 
139  template <class t_Ariles, class t_Visitor>
140  typename t_Visitor::ReturnType apply(
141  t_Visitor &visitor,
142  t_Ariles &ariles_class,
143  const char *name,
144  const typename t_Visitor::Parameters &param,
146  {
147  ARILES2_TRACE_FUNCTION;
148  return (visitor.visit(ariles_class, name, param));
149  }
150 
151 
152  template <class t_Visitor, class t_Ariles>
153  typename t_Visitor::ReturnType apply(
154  t_Visitor &visitor,
155  t_Ariles &ariles_class,
156  const typename t_Visitor::Parameters &param,
158  {
159  ARILES2_TRACE_FUNCTION;
160  return (ariles2::apply(visitor, ariles_class, ariles_class.arilesDefaultID(), param));
161  }
162 
163 
164  template <class t_Visitor, class t_Ariles, class t_Subtree>
165  typename t_Visitor::ReturnType apply(
166  t_Visitor &visitor,
167  t_Ariles &ariles_class,
168  const t_Subtree &subtree,
169  ARILES2_IS_ANY_OF(t_Subtree, std::string, std::vector<std::string>),
171  {
172  ARILES2_TRACE_FUNCTION;
173  return (visitor.visit(ariles_class, subtree, visitor.getParameters(ariles_class)));
174  }
175 
176 
177  template <class t_Visitor, class t_Ariles>
178  typename t_Visitor::ReturnType apply(
179  t_Visitor &visitor,
180  t_Ariles &ariles_class,
181  const char *name,
183  {
184  ARILES2_TRACE_FUNCTION;
185  return (visitor.visit(ariles_class, name, visitor.getParameters(ariles_class)));
186  }
187 
188 
189  template <class t_Visitor, class t_Ariles>
190  typename t_Visitor::ReturnType apply(
191  t_Visitor &visitor,
192  t_Ariles &ariles_class,
194  {
195  ARILES2_TRACE_FUNCTION;
196  return (ariles2::apply(visitor, ariles_class, ariles_class.arilesDefaultID()));
197  }
198 
199 
200  template <class t_Visitor, class t_Ariles>
201  typename t_Visitor::ReturnType apply(
202  t_Ariles &ariles_class,
204  {
205  ARILES2_TRACE_FUNCTION;
206  t_Visitor visitor;
207  return (ariles2::apply(visitor, ariles_class));
208  }
209  // -----
210 
211 
212 
213  // -----
214  template <class t_Visitor, class t_Ariles, class t_Arg>
215  typename t_Visitor::ReturnType apply(
216  t_Arg &arg,
217  t_Ariles &ariles_class,
221  {
222  ARILES2_TRACE_FUNCTION;
223  t_Visitor visitor(arg);
224  return (ariles2::apply(visitor, ariles_class));
225  }
226 
227 
228  template <class t_Visitor, class t_Ariles, class t_Arg>
229  typename t_Visitor::ReturnType apply(
230  t_Arg &arg,
231  t_Ariles &ariles_class,
232  const char *name,
235  {
236  ARILES2_TRACE_FUNCTION;
237  t_Visitor visitor(arg);
238  return (ariles2::apply(visitor, ariles_class, name));
239  }
240 
241 
242  template <class t_Visitor, class t_Ariles, class t_Arg>
243  typename t_Visitor::ReturnType apply(
244  const t_Arg &arg,
245  t_Ariles &ariles_class,
248  {
249  ARILES2_TRACE_FUNCTION;
250  t_Visitor visitor(arg);
251  return (ariles2::apply(visitor, ariles_class));
252  }
253 
254 
255  template <class t_Visitor, class t_Ariles, class t_Arg>
256  typename t_Visitor::ReturnType apply(
257  t_Arg &arg,
258  t_Ariles &ariles_class,
259  const typename t_Visitor::Parameters &param,
260  ARILES2_IS_BASE_DISABLER(std::string, t_Arg),
263  {
264  ARILES2_TRACE_FUNCTION;
265  t_Visitor visitor(arg);
266  return (ariles2::apply(visitor, ariles_class, param));
267  }
268 
269 
270  template <class t_Visitor, class t_Ariles, class t_Arg, class t_Subtree>
271  typename t_Visitor::ReturnType apply(
272  t_Arg &arg,
273  t_Ariles &ariles_class,
274  const t_Subtree &subtree,
275  ARILES2_IS_ANY_OF(t_Subtree, const std::string, const std::vector<std::string>),
276  ARILES2_IS_BASE_DISABLER(std::string, t_Arg),
279  {
280  ARILES2_TRACE_FUNCTION;
281  t_Visitor visitor(arg);
282  return (ariles2::apply(visitor, ariles_class, subtree));
283  }
284 
285 
286  template <class t_Visitor, class t_Ariles, class t_Arg>
287  typename t_Visitor::ReturnType apply(
288  t_Arg &arg,
289  t_Ariles &ariles_class,
290  const char *name,
291  const typename t_Visitor::Parameters &param,
292  ARILES2_IS_BASE_DISABLER(std::string, t_Arg),
295  {
296  ARILES2_TRACE_FUNCTION;
297  t_Visitor visitor(arg);
298  return (ariles2::apply(visitor, ariles_class, name, param));
299  }
300 
301 
302  template <class t_Visitor, class t_Ariles>
303  typename t_Visitor::ReturnType apply(
304  const std::string &arg,
305  t_Ariles &ariles_class,
306  const typename t_Visitor::Parameters &param,
308  {
309  ARILES2_TRACE_FUNCTION;
310  t_Visitor visitor(arg);
311  return (ariles2::apply(visitor, ariles_class, param));
312  }
313 
314 
315  template <class t_Visitor, class t_Ariles, class t_Subtree>
316  typename t_Visitor::ReturnType apply(
317  const std::string &arg,
318  t_Ariles &ariles_class,
319  const t_Subtree &subtree,
320  ARILES2_IS_ANY_OF(t_Subtree, const std::string, const std::vector<std::string>),
322  {
323  ARILES2_TRACE_FUNCTION;
324  t_Visitor visitor(arg);
325  return (ariles2::apply(visitor, ariles_class, subtree));
326  }
327  // -----
328 
329 
330  // -----
331  template <class t_Visitor, class t_Left, class t_Right>
332  typename t_Visitor::ReturnType apply(
333  t_Left &left,
334  t_Right &right,
337  {
338  ARILES2_TRACE_FUNCTION;
339  t_Visitor visitor;
340  return (visitor.visit(left, right, left.arilesDefaultID(), visitor.getParameters(left)));
341  }
342 
343 
344  template <class t_Visitor, class t_Left, class t_Right>
345  typename t_Visitor::ReturnType apply(
346  t_Visitor &visitor,
347  t_Left &left,
348  t_Right &right,
349  const std::string &name,
350  const typename t_Visitor::Parameters &param,
352  {
353  ARILES2_TRACE_FUNCTION;
354  return (visitor.visit(left, right, name, param));
355  }
356 
357 
358  template <class t_Visitor, class t_Left, class t_Right>
359  typename t_Visitor::ReturnType apply(
360  t_Visitor &visitor,
361  t_Left &left,
362  t_Right &right,
363  ARILES2_IS_BASE_DISABLER(typename t_Visitor::Parameters, t_Right),
364  ARILES2_IS_BASE_DISABLER(std::string, t_Right),
366  {
367  ARILES2_TRACE_FUNCTION;
368  return (visitor.visit(left, right, left.arilesDefaultID(), visitor.getParameters(left)));
369  }
370 
371 
372  template <class t_Visitor, class t_Left, class t_Right>
373  typename t_Visitor::ReturnType apply(
374  t_Visitor &visitor,
375  t_Left &left,
376  t_Right &right,
377  const typename t_Visitor::Parameters &param,
379  {
380  ARILES2_TRACE_FUNCTION;
381  return (ariles2::apply(visitor, left, right, left.arilesDefaultID(), param));
382  }
383  // -----
384 } // namespace ariles2
385 
386 #else
387 
388 namespace ariles2
389 {
390  // -----
391  template <class t_One, class t_Two, class t_Three, class t_Four, class t_Five>
392  void apply(t_One, t_Two, t_Three, t_Four, t_Five)
393  {
394  }
395 
396  template <class t_One, class t_Two, class t_Three, class t_Four>
397  void apply(t_One, t_Two, t_Three, t_Four)
398  {
399  }
400 
401  template <class t_One, class t_Two, class t_Three>
402  void apply(t_One, t_Two, t_Three)
403  {
404  }
405 
406  template <class t_One, class t_Two>
407  void apply(t_One, t_Two)
408  {
409  }
410 
411  template <class t_One, class t_Two>
412  void apply(t_Two)
413  {
414  }
415  // -----
416 } // namespace ariles2
417 
418 #endif
ariles2
Definition: basic.h:16
ariles2::visitor::GenericVisitor
Definition: common.h:41
ariles2::visitor::GenericVisitor::GenericVisitor
GenericVisitor()
Definition: common.h:44
ariles2::visitor::Base
Definition: common.h:50
ariles2::entry::Base::arilesGetParameters
virtual const t_Visitor::Parameters & arilesGetParameters(const t_Visitor &visitor) const
Definition: common.h:91
t_Parameters
ariles2::visitor::Base::~Base
~Base()
Definition: common.h:57
ariles2::visitor::Visitor::~Visitor
~Visitor()
Definition: common.h:37
ariles2::entry::Base
Definition: common.h:86
ariles2::visitor::Parameters::override_parameters_
bool override_parameters_
Definition: common.h:23
ariles2::visitor::Visitor::Visitor
Visitor()
Definition: common.h:36
ariles2::Ariles
Definition: helpers.h:153
ariles2::apply
t_Visitor::ReturnType apply(t_Visitor &visitor, t_Ariles &ariles_class, const t_Subtree &subtree, const typename t_Visitor::Parameters &param, ARILES2_IS_ANY_OF(t_Subtree, std::string, std::vector< std::string >), ARILES2_IS_BASE_ENABLER(ariles2::visitor::Visitor, t_Visitor))
Definition: common.h:126
t_Visitor
ARILES2_IS_ANY_OF
#define ARILES2_IS_ANY_OF(Type, Type1, Type2)
Definition: helpers.h:66
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::visitor::Parameters
Definition: common.h:20
ariles2::entry::ConstBase
Definition: common.h:100
ariles2::visitor::Base::getDefaultParameters
const t_Parameters & getDefaultParameters() const
Definition: common.h:59
ariles2::visitor::GenericVisitor::~GenericVisitor
~GenericVisitor()
Definition: common.h:45
ariles2::entry::ConstBase::arilesGetParameters
virtual const t_Visitor::Parameters & arilesGetParameters(const t_Visitor &visitor) const
Definition: common.h:105
ariles2::visitor::Parameters::Parameters
Parameters(const bool override_parameters=true)
Definition: common.h:26
ariles2::visitor::Base::Base
Base()
Definition: common.h:56
ariles2::visitor::Base::ReturnType
t_ReturnType ReturnType
Definition: common.h:53
ariles2::visitor::Visitor
Definition: common.h:33