Ariles
aggregate.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2017-2024 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 // cppcheck-suppress-file duplInheritedMember
11 
12 #pragma once
13 
14 #include "common.h"
15 
16 namespace ariles2
17 {
18  /// @ingroup aggregate
19  namespace aggregate
20  {
21  template <class t_Visitor>
23  {
24  public:
26 
27  public:
28  explicit ParametersWrapper(const bool override_parameters = true) : parameters_(override_parameters)
29  {
30  }
31 
32  explicit ParametersWrapper(const typename t_Visitor::Parameters &parameters) : parameters_(parameters)
33  {
34  }
35 
36  template <
37  class t_IdType,
38  typename = std::enable_if_t<
39  std::is_same<t_IdType, t_Visitor>::value
40  or std::is_base_of<t_IdType, typename t_Visitor::Parameters>::value>>
42  {
43  return (parameters_);
44  }
45 
46  template <
47  class t_IdType,
48  typename = std::enable_if_t<
49  std::is_same<t_IdType, t_Visitor>::value
50  or std::is_base_of<t_IdType, typename t_Visitor::Parameters>::value>>
51  const typename t_Visitor::Parameters &get() const
52  {
53  return (parameters_);
54  }
55  };
56 
57  template <class... t_Visitors>
58  class Parameters;
59 
60  template <>
61  class Parameters<>
62  {
63  public:
64  explicit Parameters(const bool){};
66 
67  void get(){};
68  };
69 
70  template <class t_Visitor, class... t_Visitors>
71  class Parameters<t_Visitor, t_Visitors...> : public ParametersWrapper<t_Visitor>,
72  public Parameters<t_Visitors...>
73  {
74  public:
75  explicit Parameters(const bool override_parameters = true)
76  : ParametersWrapper<t_Visitor>(override_parameters), Parameters<t_Visitors...>(override_parameters)
77  {
78  }
79 
80  template <class... t_Parameters>
81  // cppcheck-suppress noExplicitConstructor
82  Parameters(const typename t_Visitor::Parameters &parameters, t_Parameters &&...other_parameters)
83  : ParametersWrapper<t_Visitor>(parameters)
84  , Parameters<t_Visitors...>(std::forward<t_Parameters>(other_parameters)...)
85  {
86  }
87 
88  template <class t_Parameters>
89  // cppcheck-suppress noExplicitConstructor
90  Parameters(const t_Parameters &parameters, const bool override_parameters = true)
91  : ParametersWrapper<t_Visitor>(override_parameters)
92  , Parameters<t_Visitors...>(parameters, override_parameters)
93  {
94  }
95 
96  // cppcheck-suppress noExplicitConstructor
97  Parameters(const typename t_Visitor::Parameters &parameters, const bool override_parameters = true)
98  : ParametersWrapper<t_Visitor>(parameters), Parameters<t_Visitors...>(override_parameters)
99  {
100  }
101 
103  using Parameters<t_Visitors...>::get;
104  };
105 
106 
107 
108  template <class t_Visitor>
110  {
111  public:
112  t_Visitor visitor_;
113 
114  public:
115  template <class... t_Args>
116  explicit BaseVisitorWrapper(const std::tuple<t_Args...> &args_tuple)
117  : visitor_(std::get<t_Args>(args_tuple)...)
118  {
119  }
120 
121  template <
122  class t_GetVisitor,
123  typename = std::enable_if_t<
124  std::is_same<t_GetVisitor, t_Visitor>::value
125  or std::is_base_of<t_GetVisitor, t_Visitor>::value>>
126  t_Visitor &get()
127  {
128  return (visitor_);
129  }
130 
131  template <
132  class t_GetVisitor,
133  typename = std::enable_if_t<
134  std::is_same<t_GetVisitor, t_Visitor>::value
135  or std::is_base_of<t_GetVisitor, t_Visitor>::value>>
136  const t_Visitor &get() const
137  {
138  return (visitor_);
139  }
140  };
141 
142  template <class... t_Visitors>
143  class BaseVisitor;
144 
145  template <>
146  class BaseVisitor<>
147  {
148  public:
150  {
151  }
152 
153  void get() const
154  {
155  }
156 
157  template <class t_Entry, class t_Path, class t_Parameters>
158  void visit(t_Entry &, const t_Path &, const t_Parameters &)
159  {
160  }
161  };
162 
163  template <class t_Visitor, class... t_Visitors>
164  class BaseVisitor<t_Visitor, t_Visitors...> : public BaseVisitorWrapper<t_Visitor>,
165  public BaseVisitor<t_Visitors...>
166  {
167  public:
168  template <class t_ConstructorTuple, class... t_Args>
169  BaseVisitor(t_ConstructorTuple &&constructor_tuple, t_Args &&...args)
170  : BaseVisitorWrapper<t_Visitor>(std::forward<t_ConstructorTuple>(constructor_tuple))
171  , BaseVisitor<t_Visitors...>(std::forward<t_Args>(args)...)
172  {
173  }
174 
176  using BaseVisitor<t_Visitors...>::get;
177 
178 
179  template <class t_Entry, class t_Path, class t_Parameters>
180  void visit(t_Entry &entry, const t_Path &path, const t_Parameters &param)
181  {
182  ariles2::apply(BaseVisitorWrapper<t_Visitor>::visitor_, entry, path, param.template get<t_Visitor>());
183 
184  BaseVisitor<t_Visitors...>::template visit(entry, path, param);
185  }
186  };
187 
188 
189  template <class t_Derived, class... t_Visitors>
190  class Visitor : public BaseVisitor<t_Visitors...>, public visitor::Base<t_Derived, Parameters<t_Visitors...>>
191  {
192  public:
193  using Parameters = aggregate::Parameters<t_Visitors...>;
194 
195  public:
196  template <class... t_Args>
197  explicit Visitor(t_Args &&...args) : BaseVisitor<t_Visitors...>(std::forward<t_Args>(args)...)
198  {
199  }
200 
201  template <class t_Ariles>
202  const Parameters getParameters(const t_Ariles &ariles_class) const
203  {
204  // static variable is potentially unsafe
205  return (Parameters(
206  ariles_class.arilesGetParameters(BaseVisitor<t_Visitors...>::template get<t_Visitors>())...));
207  }
208 
209 
210  template <class t_Entry, class t_Path>
211  void visit(t_Entry &entry, const t_Path &path, const Parameters &param)
212  {
213  BaseVisitor<t_Visitors...>::template visit(entry, path, param);
214  }
215  };
216  } // namespace aggregate
217 } // namespace ariles2
const t_Visitor & get() const
Definition: aggregate.h:136
BaseVisitorWrapper(const std::tuple< t_Args... > &args_tuple)
Definition: aggregate.h:116
void visit(t_Entry &entry, const t_Path &path, const t_Parameters &param)
Definition: aggregate.h:180
BaseVisitor(t_ConstructorTuple &&constructor_tuple, t_Args &&...args)
Definition: aggregate.h:169
void visit(t_Entry &, const t_Path &, const t_Parameters &)
Definition: aggregate.h:158
ParametersWrapper(const typename t_Visitor::Parameters &parameters)
Definition: aggregate.h:32
t_Visitor::Parameters parameters_
Definition: aggregate.h:25
const t_Visitor::Parameters & get() const
Definition: aggregate.h:51
t_Visitor::Parameters & get()
Definition: aggregate.h:41
ParametersWrapper(const bool override_parameters=true)
Definition: aggregate.h:28
Parameters(const bool override_parameters=true)
Definition: aggregate.h:75
Parameters(const t_Parameters &parameters, const bool override_parameters=true)
Definition: aggregate.h:90
Parameters(const typename t_Visitor::Parameters &parameters, t_Parameters &&...other_parameters)
Definition: aggregate.h:82
Parameters(const typename t_Visitor::Parameters &parameters, const bool override_parameters=true)
Definition: aggregate.h:97
void visit(t_Entry &entry, const t_Path &path, const Parameters &param)
Definition: aggregate.h:211
const Parameters getParameters(const t_Ariles &ariles_class) const
Definition: aggregate.h:202
Visitor(t_Args &&...args)
Definition: aggregate.h:197
aggregate::Parameters< t_Visitors... > Parameters
Definition: aggregate.h:193
visitor::Parameters Parameters
Definition: count.h:26
Definition: basic.h:17
t_Visitor::ReturnType apply(t_Visitor &visitor, t_Ariles &ariles_class, t_Subtree &&subtree, const typename t_Visitor::Parameters &param)
Definition: common.h:165