RecursiveVisitor.h
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T),
5 * Karlsruhe Institute of Technology (KIT), all rights reserved.
6 *
7 * ArmarX is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * ArmarX is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * @author Fabian Peller-Konrad (fabian dot peller-konrad at kit dot edu)
20 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
21 * GNU General Public License
22 */
23
24#pragma once
25
26#include <type_traits>
27
28#include "../../Descriptor.h"
29#include "Visitor.h"
30
31namespace armarx::aron::data
32{
33 /**
34 * @see type/visitor/RecursiveVisitor.h
35 */
36 template <class T>
37 struct RecursiveVisitor : virtual public VisitorBase<T>
38 {
39 using Input = typename VisitorBase<T>::Input;
40 using InputNonConst = typename std::remove_const<Input>::type;
41
42 using MapElements = std::map<std::string, InputNonConst>;
43 using ListElements = std::vector<InputNonConst>;
44
47
48 virtual void visitDictOnEnter(Input& element){};
49 virtual void visitDictOnExit(Input& element){};
50 virtual void visitListOnEnter(Input& element){};
51 virtual void visitListOnExit(Input& element){};
52
53 virtual void visitNDArray(Input& element){};
54 virtual void visitInt(Input& element){};
55 virtual void visitLong(Input& element){};
56 virtual void visitFloat(Input& element){};
57 virtual void visitDouble(Input& element){};
58 virtual void visitBool(Input& element){};
59 virtual void visitString(Input& element){};
60
61 virtual void
63 {
64 if (!element)
65 {
66 throw error::AronException(__PRETTY_FUNCTION__,
67 "Unknown type in visitor. The element was NULL.");
68 }
69 else
70 {
72 __PRETTY_FUNCTION__,
73 "Unknown type in visitor. The element was set but descriptor was undefined.");
74 }
75 }
76
77 virtual ~RecursiveVisitor() = default;
78 };
79
80 /**
81 * @see type/visitor/RecursiveVisitor.h
82 */
83 template <class T1, class T2>
84 struct RecursiveTypedVisitor : virtual public TypedVisitorBase<T1, T2>
85 {
88
89 using TypeInputNonConst = typename std::remove_const<TypeInput>::type;
90 using DataInputNonConst = typename std::remove_const<DataInput>::type;
91
92 using MapElements = std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>>;
93 using ListElements = std::vector<std::pair<DataInputNonConst, TypeInputNonConst>>;
94 using PairElements = std::pair<std::pair<DataInputNonConst, TypeInputNonConst>,
95 std::pair<DataInputNonConst, TypeInputNonConst>>;
96 using TupleElements = std::vector<std::pair<DataInputNonConst, TypeInputNonConst>>;
97
103
104 virtual void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType){};
105 virtual void visitObjectOnExit(DataInput& elementData, TypeInput& elementType){};
106 virtual void visitDictOnEnter(DataInput& elementData, TypeInput& elementType){};
107 virtual void visitDictOnExit(DataInput& elementData, TypeInput& elementType){};
108 virtual void visitPairOnEnter(DataInput& elementData, TypeInput& elementType){};
109 virtual void visitPairOnExit(DataInput& elementData, TypeInput& elementType){};
110 virtual void visitTupleOnEnter(DataInput& elementData, TypeInput& elementType){};
111 virtual void visitTupleOnExit(DataInput& elementData, TypeInput& elementType){};
112 virtual void visitListOnEnter(DataInput& elementData, TypeInput& elementType){};
113 virtual void visitListOnExit(DataInput& elementData, TypeInput& elementType){};
114
115 virtual void visitMatrix(DataInput& elementData, TypeInput& elementType){};
116 virtual void visitNDArray(DataInput& elementData, TypeInput& elementType){};
117 virtual void visitQuaternion(DataInput& elementData, TypeInput& elementType){};
118 virtual void visitImage(DataInput& elementData, TypeInput& elementType){};
119 virtual void visitPointCloud(DataInput& elementData, TypeInput& elementType){};
120 virtual void visitIntEnum(DataInput& elementData, TypeInput& elementType){};
121 virtual void visitInt(DataInput& elementData, TypeInput& elementType){};
122 virtual void visitLong(DataInput& elementData, TypeInput& elementType){};
123 virtual void visitFloat(DataInput& elementData, TypeInput& elementType){};
124 virtual void visitDouble(DataInput& elementData, TypeInput& elementType){};
125 virtual void visitBool(DataInput& elementData, TypeInput& elementType){};
126 virtual void visitString(DataInput& elementData, TypeInput& elementType){};
127 virtual void visitAnyObject(DataInput& elementData, TypeInput& elementType){};
128
129 virtual void
130 visitUnknown(DataInput& elementData, TypeInput& elementType)
131 {
132 if (!elementData)
133 {
134 throw error::AronException(__PRETTY_FUNCTION__,
135 "Unknown type in visitor. The element was NULL.");
136 }
137 else
138 {
140 __PRETTY_FUNCTION__,
141 "Unknown type in visitor. The element was set but descriptor was undefined.");
142 }
143 }
144
145 virtual ~RecursiveTypedVisitor() = default;
146 };
147
148 template <class T, class Data>
149 concept isRecursiveVisitor = std::is_base_of<RecursiveVisitor<Data>, T>::value;
150
151 template <class T, class Data, class Type>
152 concept isRecursiveTypedVisitor = std::is_base_of<RecursiveTypedVisitor<Data, Type>, T>::value;
153
154 /**
155 * @see type/visitor/RecursiveVisitor.h
156 */
157 template <class RecursiveVisitorImplementation>
158 requires isRecursiveVisitor<RecursiveVisitorImplementation,
159 typename RecursiveVisitorImplementation::Input>
160 void
161 visitRecursive(RecursiveVisitorImplementation& v,
162 typename RecursiveVisitorImplementation::Input& o)
163 {
164 data::Descriptor descriptor = v.getDescriptor(o);
165 switch (descriptor)
166 {
168 {
169 v.visitListOnEnter(o);
170 unsigned int i = 0;
171 for (auto& value : v.getListElements(o))
172 {
173 visitRecursive(v, value);
174 i++;
175 }
176 v.visitListOnExit(o);
177 return;
178 }
180 {
181 v.visitDictOnEnter(o);
182 for (auto& [key, value] : v.getDictElements(o))
183 {
184 visitRecursive(v, value);
185 }
186 v.visitDictOnExit(o);
187 return;
188 }
190 return v.visitNDArray(o);
192 return v.visitInt(o);
194 return v.visitLong(o);
196 return v.visitFloat(o);
198 return v.visitDouble(o);
200 return v.visitString(o);
202 return v.visitBool(o);
204 return v.visitUnknown(o);
205 }
206 }
207
208 /**
209 * @see type/visitor/RecursiveVisitor.h
210 * @see data/visitor/Visitor.h
211 */
212 template <class RecursiveVisitorImplementation>
213 requires isRecursiveTypedVisitor<RecursiveVisitorImplementation,
214 typename RecursiveVisitorImplementation::DataInput,
215 typename RecursiveVisitorImplementation::TypeInput>
216 void
217 visitRecursive(RecursiveVisitorImplementation& v,
218 typename RecursiveVisitorImplementation::DataInput& o,
219 typename RecursiveVisitorImplementation::TypeInput& t)
220 {
221 type::Descriptor descriptor = v.getDescriptor(o, t);
222 switch (descriptor)
223 {
225 {
226 v.visitListOnEnter(o, t);
227 unsigned int i = 0;
228 for (auto& [value, acceptedType] : v.getListElements(o, t))
229 {
230 visitRecursive(v, value, acceptedType);
231 i++;
232 }
233 v.visitListOnExit(o, t);
234 return;
235 }
237 {
238 v.visitPairOnEnter(o, t);
239 auto pair = v.getPairElements(o, t);
240 auto first = pair.first;
241 auto second = pair.second;
242 visitRecursive(v, first.first, first.second);
243 visitRecursive(v, second.first, second.second);
244 v.visitPairOnExit(o, t);
245 return;
246 }
248 {
249 v.visitTupleOnEnter(o, t);
250 unsigned int i = 0;
251 for (auto& [value, acceptedType] : v.getTupleElements(o, t))
252 {
253 visitRecursive(v, value, acceptedType);
254 i++;
255 }
256 v.visitTupleOnExit(o, t);
257 return;
258 }
260 {
261 v.visitDictOnEnter(o, t);
262 for (auto& [key, pair] : v.getDictElements(o, t))
263 {
264 visitRecursive(v, pair.first, pair.second);
265 }
266 v.visitDictOnExit(o, t);
267 return;
268 }
270 {
271 v.visitObjectOnEnter(o, t);
272 for (auto& [key, pair] : v.getObjectElements(o, t))
273 {
274 visitRecursive(v, pair.first, pair.second);
275 }
276 v.visitObjectOnExit(o, t);
277 return;
278 }
280 return v.visitNDArray(o, t);
282 return v.visitMatrix(o, t);
284 return v.visitImage(o, t);
286 return v.visitPointCloud(o, t);
288 return v.visitQuaternion(o, t);
290 return v.visitInt(o, t);
292 return v.visitLong(o, t);
294 return v.visitFloat(o, t);
296 return v.visitDouble(o, t);
298 return v.visitString(o, t);
300 return v.visitBool(o, t);
302 return v.visitAnyObject(o, t);
304 return v.visitIntEnum(o, t);
306 return v.visitUnknown(o, t);
307 }
308 }
309} // namespace armarx::aron::data
A base class for aron exceptions.
Definition Exception.h:37
A convenience header to include all aron files (full include, not forward declared)
void visitRecursive(RecursiveVisitorImplementation &v, typename RecursiveVisitorImplementation::Input &o)
virtual MapElements getObjectElements(DataInput &, TypeInput &)=0
virtual void visitPairOnExit(DataInput &elementData, TypeInput &elementType)
virtual void visitObjectOnExit(DataInput &elementData, TypeInput &elementType)
virtual void visitInt(DataInput &elementData, TypeInput &elementType)
virtual ListElements getListElements(DataInput &, TypeInput &)=0
typename TypedVisitorBase< T1, T2 >::TypeInput TypeInput
virtual void visitListOnExit(DataInput &elementData, TypeInput &elementType)
virtual void visitPointCloud(DataInput &elementData, TypeInput &elementType)
virtual void visitIntEnum(DataInput &elementData, TypeInput &elementType)
virtual void visitUnknown(DataInput &elementData, TypeInput &elementType)
virtual PairElements getPairElements(DataInput &, TypeInput &)=0
std::vector< std::pair< DataInputNonConst, TypeInputNonConst > > ListElements
virtual void visitTupleOnExit(DataInput &elementData, TypeInput &elementType)
virtual void visitDictOnEnter(DataInput &elementData, TypeInput &elementType)
virtual void visitListOnEnter(DataInput &elementData, TypeInput &elementType)
virtual void visitTupleOnEnter(DataInput &elementData, TypeInput &elementType)
virtual void visitPairOnEnter(DataInput &elementData, TypeInput &elementType)
virtual void visitImage(DataInput &elementData, TypeInput &elementType)
virtual void visitDictOnExit(DataInput &elementData, TypeInput &elementType)
typename std::remove_const< TypeInput >::type TypeInputNonConst
typename TypedVisitorBase< T1, T2 >::DataInput DataInput
std::pair< std::pair< DataInputNonConst, TypeInputNonConst >, std::pair< DataInputNonConst, TypeInputNonConst > > PairElements
virtual MapElements getDictElements(DataInput &, TypeInput &)=0
virtual void visitDouble(DataInput &elementData, TypeInput &elementType)
virtual void visitFloat(DataInput &elementData, TypeInput &elementType)
virtual void visitBool(DataInput &elementData, TypeInput &elementType)
typename std::remove_const< DataInput >::type DataInputNonConst
virtual TupleElements getTupleElements(DataInput &, TypeInput &)=0
virtual void visitObjectOnEnter(DataInput &elementData, TypeInput &elementType)
std::vector< std::pair< DataInputNonConst, TypeInputNonConst > > TupleElements
virtual void visitString(DataInput &elementData, TypeInput &elementType)
virtual void visitQuaternion(DataInput &elementData, TypeInput &elementType)
std::map< std::string, std::pair< DataInputNonConst, TypeInputNonConst > > MapElements
virtual void visitAnyObject(DataInput &elementData, TypeInput &elementType)
virtual void visitNDArray(DataInput &elementData, TypeInput &elementType)
virtual void visitMatrix(DataInput &elementData, TypeInput &elementType)
virtual void visitLong(DataInput &elementData, TypeInput &elementType)
std::vector< InputNonConst > ListElements
std::map< std::string, InputNonConst > MapElements
virtual void visitLong(Input &element)
virtual void visitString(Input &element)
virtual void visitDictOnEnter(Input &element)
virtual void visitDouble(Input &element)
typename std::remove_const< Input >::type InputNonConst
virtual void visitBool(Input &element)
virtual void visitDictOnExit(Input &element)
virtual void visitUnknown(Input &element)
virtual void visitListOnExit(Input &element)
virtual MapElements getDictElements(Input &)=0
typename VisitorBase< T >::Input Input
virtual void visitInt(Input &element)
virtual void visitNDArray(Input &element)
virtual ListElements getListElements(Input &)=0
virtual void visitListOnEnter(Input &element)
virtual void visitFloat(Input &element)