Ariles
Loading...
Searching...
No Matches
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
16namespace ariles2
17{
18 /// @ingroup aggregate
19 namespace aggregate
20 {
21 template <class t_Visitor>
23 {
24 public:
25 typename t_Visitor::Parameters parameters_;
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>>
41 typename t_Visitor::Parameters &get()
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>
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
102 using ParametersWrapper<t_Visitor>::get;
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>
144
145 template <>
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
175 using BaseVisitorWrapper<t_Visitor>::get;
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
const t_Visitor::Parameters & get() const
Definition aggregate.h:51
ParametersWrapper(const typename t_Visitor::Parameters &parameters)
Definition aggregate.h:32
t_Visitor::Parameters parameters_
Definition aggregate.h:25
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
t_Visitor::ReturnType apply(t_Visitor &visitor, t_Ariles &ariles_class, t_Subtree &&subtree, const typename t_Visitor::Parameters &param)
Definition common.h:165