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 
31 namespace 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 
45  virtual MapElements getDictElements(Input&) = 0;
46  virtual ListElements getListElements(Input&) = 0;
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
62  visitUnknown(Input& element)
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  {
139  throw error::AronException(
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  {
174  i++;
175  }
176  v.visitListOnExit(o);
177  return;
178  }
180  {
181  v.visitDictOnEnter(o);
182  for (auto& [key, value] : v.getDictElements(o))
183  {
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
armarx::aron::type::Descriptor::FLOAT
@ FLOAT
armarx::aron::data::RecursiveTypedVisitor::visitObjectOnExit
virtual void visitObjectOnExit(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:105
armarx::aron::data::RecursiveTypedVisitor::getPairElements
virtual PairElements getPairElements(DataInput &, TypeInput &)=0
armarx::aron::type::Descriptor::DOUBLE
@ DOUBLE
armarx::aron::error::AronException
A base class for aron exceptions.
Definition: Exception.h:36
armarx::aron::data::RecursiveTypedVisitor::visitListOnEnter
virtual void visitListOnEnter(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:112
Visitor.h
armarx::aron::data::RecursiveVisitor::~RecursiveVisitor
virtual ~RecursiveVisitor()=default
armarx::aron::data::Descriptor::NDARRAY
@ NDARRAY
armarx::aron::data::RecursiveTypedVisitor::visitString
virtual void visitString(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:126
armarx::aron::data::Descriptor::LIST
@ LIST
armarx::aron::data::RecursiveVisitor::visitInt
virtual void visitInt(Input &element)
Definition: RecursiveVisitor.h:54
armarx::aron::type::Descriptor::IMAGE
@ IMAGE
armarx::aron::data::RecursiveTypedVisitor::visitTupleOnEnter
virtual void visitTupleOnEnter(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:110
armarx::aron::data::Descriptor::STRING
@ STRING
armarx::aron::data::RecursiveTypedVisitor::visitPointCloud
virtual void visitPointCloud(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:119
armarx::aron::data::RecursiveTypedVisitor::getTupleElements
virtual TupleElements getTupleElements(DataInput &, TypeInput &)=0
armarx::aron::data::RecursiveTypedVisitor::visitPairOnEnter
virtual void visitPairOnEnter(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:108
armarx::aron::data::RecursiveVisitor< data::VariantPtr >::InputNonConst
typename std::remove_const< Input >::type InputNonConst
Definition: RecursiveVisitor.h:40
armarx::aron::data::RecursiveVisitor::visitString
virtual void visitString(Input &element)
Definition: RecursiveVisitor.h:59
armarx::aron::data::RecursiveTypedVisitor::visitIntEnum
virtual void visitIntEnum(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:120
armarx::aron::type::Descriptor::PAIR
@ PAIR
armarx::aron::data::RecursiveVisitor::visitDouble
virtual void visitDouble(Input &element)
Definition: RecursiveVisitor.h:57
armarx::aron::data::RecursiveTypedVisitor< data::VariantPtr, const type::VariantPtr >::MapElements
std::map< std::string, std::pair< DataInputNonConst, TypeInputNonConst > > MapElements
Definition: RecursiveVisitor.h:92
armarx::aron::type::Descriptor::LIST
@ LIST
armarx::aron::data::Descriptor
Descriptor
Definition: Descriptor.h:179
armarx::aron::data::RecursiveVisitor< data::VariantPtr >::Input
typename VisitorBase< data::VariantPtr >::Input Input
Definition: RecursiveVisitor.h:39
armarx::aron::data::Descriptor::FLOAT
@ FLOAT
armarx::aron::data::RecursiveVisitor::visitListOnExit
virtual void visitListOnExit(Input &element)
Definition: RecursiveVisitor.h:51
armarx::aron::data::RecursiveVisitor::visitDictOnEnter
virtual void visitDictOnEnter(Input &element)
Definition: RecursiveVisitor.h:48
armarx::aron::data::RecursiveTypedVisitor< data::VariantPtr, const type::VariantPtr >::PairElements
std::pair< std::pair< DataInputNonConst, TypeInputNonConst >, std::pair< DataInputNonConst, TypeInputNonConst > > PairElements
Definition: RecursiveVisitor.h:95
armarx::aron::type::Descriptor::NDARRAY
@ NDARRAY
armarx::aron::data::Descriptor::INT
@ INT
armarx::aron::data::RecursiveVisitor::getListElements
virtual ListElements getListElements(Input &)=0
armarx::aron::data::RecursiveTypedVisitor::getObjectElements
virtual MapElements getObjectElements(DataInput &, TypeInput &)=0
armarx::aron::data::RecursiveTypedVisitor::visitPairOnExit
virtual void visitPairOnExit(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:109
armarx::aron::data::Descriptor::DICT
@ DICT
armarx::aron::data::isRecursiveVisitor
concept isRecursiveVisitor
Definition: RecursiveVisitor.h:149
armarx::aron::type::Descriptor::BOOL
@ BOOL
armarx::aron::data::RecursiveTypedVisitor
Definition: RecursiveVisitor.h:84
armarx::aron::data::isRecursiveTypedVisitor
concept isRecursiveTypedVisitor
Definition: RecursiveVisitor.h:152
armarx::aron::data::RecursiveVisitor::getDictElements
virtual MapElements getDictElements(Input &)=0
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:855
armarx::aron::data::RecursiveTypedVisitor< data::VariantPtr, const type::VariantPtr >::TypeInput
typename TypedVisitorBase< data::VariantPtr, const type::VariantPtr >::TypeInput TypeInput
Definition: RecursiveVisitor.h:87
armarx::aron::data::RecursiveTypedVisitor::visitObjectOnEnter
virtual void visitObjectOnEnter(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:104
armarx::aron::data::RecursiveTypedVisitor::visitDouble
virtual void visitDouble(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:124
armarx::aron::type::Descriptor::MATRIX
@ MATRIX
armarx::aron::data::RecursiveTypedVisitor::getListElements
virtual ListElements getListElements(DataInput &, TypeInput &)=0
armarx::aron::data::RecursiveTypedVisitor::visitListOnExit
virtual void visitListOnExit(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:113
armarx::aron::data::RecursiveVisitor
Definition: RecursiveVisitor.h:37
armarx::aron::data::RecursiveTypedVisitor::visitMatrix
virtual void visitMatrix(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:115
armarx::aron::type::Descriptor::QUATERNION
@ QUATERNION
armarx::aron::data::Descriptor::BOOL
@ BOOL
armarx::aron::requires
requires(!aron::detail::DtoAndBoAreSame< DtoT, BoT >) void toAron(std
Definition: aron_conversions.h:129
armarx::aron::data::TypedVisitorBase::DataInput
T1 DataInput
Definition: Visitor.h:53
armarx::aron::data::RecursiveTypedVisitor::visitFloat
virtual void visitFloat(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:123
armarx::aron::data::TypedVisitorBase
Definition: Visitor.h:51
armarx::aron::data
A convenience header to include all aron files (full include, not forward declared)
Definition: aron_conversions.cpp:3
armarx::aron::data::RecursiveTypedVisitor< data::VariantPtr, const type::VariantPtr >::DataInput
typename TypedVisitorBase< data::VariantPtr, const type::VariantPtr >::DataInput DataInput
Definition: RecursiveVisitor.h:86
armarx::aron::data::RecursiveTypedVisitor::visitDictOnExit
virtual void visitDictOnExit(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:107
armarx::aron::type::Descriptor::STRING
@ STRING
armarx::aron::type::Descriptor::LONG
@ LONG
armarx::ctrlutil::v
double v(double t, double v0, double a0, double j)
Definition: CtrlUtil.h:39
armarx::aron::type::Descriptor::INT
@ INT
armarx::aron::data::RecursiveVisitor::visitLong
virtual void visitLong(Input &element)
Definition: RecursiveVisitor.h:55
armarx::aron::data::RecursiveTypedVisitor::visitImage
virtual void visitImage(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:118
armarx::aron::data::TypedVisitorBase::TypeInput
T2 TypeInput
Definition: Visitor.h:54
armarx::aron::data::RecursiveVisitor::visitUnknown
virtual void visitUnknown(Input &element)
Definition: RecursiveVisitor.h:62
armarx::aron::type::Descriptor::INT_ENUM
@ INT_ENUM
armarx::aron::data::RecursiveTypedVisitor::visitTupleOnExit
virtual void visitTupleOnExit(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:111
armarx::aron::data::RecursiveTypedVisitor::visitUnknown
virtual void visitUnknown(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:130
armarx::aron::type::Descriptor::OBJECT
@ OBJECT
armarx::aron::data::RecursiveTypedVisitor< data::VariantPtr, const type::VariantPtr >::TypeInputNonConst
typename std::remove_const< TypeInput >::type TypeInputNonConst
Definition: RecursiveVisitor.h:89
armarx::aron::data::visitRecursive
requires isRecursiveVisitor< RecursiveVisitorImplementation, typename RecursiveVisitorImplementation::Input > void visitRecursive(RecursiveVisitorImplementation &v, typename RecursiveVisitorImplementation::Input &o)
Definition: RecursiveVisitor.h:161
armarx::aron::type::Descriptor::UNKNOWN
@ UNKNOWN
armarx::aron::data::Descriptor::LONG
@ LONG
armarx::aron::type::Descriptor::DICT
@ DICT
armarx::aron::data::RecursiveTypedVisitor::getDictElements
virtual MapElements getDictElements(DataInput &, TypeInput &)=0
armarx::aron::type::Descriptor::TUPLE
@ TUPLE
armarx::aron::data::RecursiveTypedVisitor::visitNDArray
virtual void visitNDArray(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:116
armarx::aron::data::RecursiveTypedVisitor< data::VariantPtr, const type::VariantPtr >::ListElements
std::vector< std::pair< DataInputNonConst, TypeInputNonConst > > ListElements
Definition: RecursiveVisitor.h:93
armarx::aron::data::RecursiveVisitor::visitDictOnExit
virtual void visitDictOnExit(Input &element)
Definition: RecursiveVisitor.h:49
armarx::aron::data::Descriptor::DOUBLE
@ DOUBLE
armarx::aron::type::Descriptor::POINTCLOUD
@ POINTCLOUD
armarx::aron::data::RecursiveVisitor::visitNDArray
virtual void visitNDArray(Input &element)
Definition: RecursiveVisitor.h:53
armarx::aron::data::RecursiveTypedVisitor::~RecursiveTypedVisitor
virtual ~RecursiveTypedVisitor()=default
T
float T
Definition: UnscentedKalmanFilterTest.cpp:38
armarx::aron::data::RecursiveVisitor< data::VariantPtr >::ListElements
std::vector< InputNonConst > ListElements
Definition: RecursiveVisitor.h:43
armarx::aron::data::RecursiveTypedVisitor::visitDictOnEnter
virtual void visitDictOnEnter(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:106
armarx::aron::data::Descriptor::UNKNOWN
@ UNKNOWN
armarx::aron::data::RecursiveTypedVisitor::visitBool
virtual void visitBool(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:125
armarx::aron::data::VisitorBase
Definition: Visitor.h:39
armarx::aron::data::RecursiveVisitor::visitFloat
virtual void visitFloat(Input &element)
Definition: RecursiveVisitor.h:56
armarx::aron::data::RecursiveVisitor::visitListOnEnter
virtual void visitListOnEnter(Input &element)
Definition: RecursiveVisitor.h:50
armarx::aron::type::Descriptor
Descriptor
Definition: Descriptor.h:69
armarx::aron::data::RecursiveTypedVisitor::visitQuaternion
virtual void visitQuaternion(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:117
armarx::aron::data::RecursiveVisitor< data::VariantPtr >::MapElements
std::map< std::string, InputNonConst > MapElements
Definition: RecursiveVisitor.h:42
armarx::aron::data::VisitorBase::Input
T Input
Definition: Visitor.h:41
armarx::aron::data::RecursiveTypedVisitor::visitInt
virtual void visitInt(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:121
armarx::aron::type::Descriptor::ANY_OBJECT
@ ANY_OBJECT
armarx::aron::data::RecursiveTypedVisitor::visitLong
virtual void visitLong(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:122
armarx::aron::data::RecursiveTypedVisitor::visitAnyObject
virtual void visitAnyObject(DataInput &elementData, TypeInput &elementType)
Definition: RecursiveVisitor.h:127
armarx::aron::data::RecursiveTypedVisitor< data::VariantPtr, const type::VariantPtr >::DataInputNonConst
typename std::remove_const< DataInput >::type DataInputNonConst
Definition: RecursiveVisitor.h:90
armarx::aron::data::RecursiveVisitor::visitBool
virtual void visitBool(Input &element)
Definition: RecursiveVisitor.h:58
armarx::aron::data::RecursiveTypedVisitor< data::VariantPtr, const type::VariantPtr >::TupleElements
std::vector< std::pair< DataInputNonConst, TypeInputNonConst > > TupleElements
Definition: RecursiveVisitor.h:96