Visitor.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 <map>
27 #include <string>
28 #include <vector>
29 
30 #include "../../Descriptor.h"
31 #include "../../Exception.h"
32 
33 namespace armarx::aron::type
34 {
35  /**
36  * @brief The visit function. Takes a visitor implementation as input and a type representation (e.g. aron::type::variant or nlohmann::json).
37  * Inspired by std::visit for std::variant
38  * This method only performs a single visit. This is useful if you only want to call a specific method depending on the type, or if you want to call a customized recursive function
39  * If you want to call a visitX recursively, please refer to "RecursiveVisitor.h"
40  */
41  template <class VisitorImplementation>
42  void visit(VisitorImplementation& v, typename VisitorImplementation::Input& t)
43  {
44  auto descriptor = v.getDescriptor(t);
45  switch (descriptor)
46  {
48  return v.visitObject(t);
50  return v.visitList(t);
52  return v.visitDict(t);
54  return v.visitPair(t);
56  return v.visitTuple(t);
58  return v.visitNDArray(t);
60  return v.visitMatrix(t);
62  return v.visitImage(t);
64  return v.visitPointCloud(t);
66  return v.visitQuaternion(t);
68  return v.visitInt(t);
70  return v.visitLong(t);
72  return v.visitFloat(t);
74  return v.visitDouble(t);
76  return v.visitString(t);
78  return v.visitBool(t);
80  return v.visitAnyObject(t);
82  return v.visitIntEnum(t);
84  return v.visitUnknown(t);
85  }
86  }
87 
88  /**
89  * @brief The VisitorBase struct. Defines basic methods and typedefs for all visitors
90  */
91  template <class T>
92  struct VisitorBase
93  {
94  using Input = T;
95 
96  virtual type::Descriptor getDescriptor(Input&) = 0;
97  virtual ~VisitorBase() = default;
98  };
99 
100  /**
101  * @brief The Visitor struct. Defines the visitX methods a visitor has to impelement
102  */
103  template <class T>
104  struct Visitor : virtual public VisitorBase<T>
105  {
106  using Input = typename VisitorBase<T>::Input;
107  virtual void visitObject(Input&) {};
108  virtual void visitDict(Input&) {};
109  virtual void visitPair(Input&) {};
110  virtual void visitTuple(Input&) {};
111  virtual void visitList(Input&) {};
112  virtual void visitMatrix(Input&) {};
113  virtual void visitNDArray(Input&) {};
114  virtual void visitQuaternion(Input&) {};
115  virtual void visitOrientation(Input&) {};
116  virtual void visitPosition(Input&) {};
117  virtual void visitPose(Input&) {};
118  virtual void visitImage(Input&) {};
119  virtual void visitPointCloud(Input&) {};
120  virtual void visitIntEnum(Input&) {};
121  virtual void visitInt(Input&) {};
122  virtual void visitLong(Input&) {};
123  virtual void visitFloat(Input&) {};
124  virtual void visitDouble(Input&) {};
125  virtual void visitBool(Input&) {};
126  virtual void visitString(Input&) {};
127  virtual void visitAnyObject(Input&) {};
128  virtual void visitUnknown(Input&) { throw error::AronException(__PRETTY_FUNCTION__, "Unknown type in visitor."); }
129  virtual ~Visitor() = default;
130  };
131 }
armarx::aron::type::Descriptor::FLOAT
@ FLOAT
armarx::aron::type::Visitor::~Visitor
virtual ~Visitor()=default
armarx::aron::type::VisitorBase< const nlohmann::json >::Input
const nlohmann::json Input
Definition: Visitor.h:94
armarx::aron::type::Descriptor::DOUBLE
@ DOUBLE
armarx::aron::error::AronException
A base class for aron exceptions.
Definition: Exception.h:42
armarx::aron::type::Visitor::visitObject
virtual void visitObject(Input &)
Definition: Visitor.h:107
armarx::aron::type::Visitor::visitIntEnum
virtual void visitIntEnum(Input &)
Definition: Visitor.h:120
armarx::aron::type::Visitor::visitAnyObject
virtual void visitAnyObject(Input &)
Definition: Visitor.h:127
armarx::aron::type::Descriptor::IMAGE
@ IMAGE
armarx::aron::type::Visitor::visitBool
virtual void visitBool(Input &)
Definition: Visitor.h:125
armarx::aron::type::Visitor::visitOrientation
virtual void visitOrientation(Input &)
Definition: Visitor.h:115
armarx::aron::type::Visitor::visitList
virtual void visitList(Input &)
Definition: Visitor.h:111
armarx::aron::type::Visitor
The Visitor struct.
Definition: Visitor.h:104
armarx::aron::type::Visitor::visitInt
virtual void visitInt(Input &)
Definition: Visitor.h:121
armarx::aron::type::Descriptor::PAIR
@ PAIR
armarx::aron::type::VisitorBase
The VisitorBase struct.
Definition: Visitor.h:92
armarx::aron::type::Descriptor::LIST
@ LIST
armarx::aron::type::Visitor::visitQuaternion
virtual void visitQuaternion(Input &)
Definition: Visitor.h:114
armarx::aron::type::Visitor::visitPointCloud
virtual void visitPointCloud(Input &)
Definition: Visitor.h:119
armarx::aron::type::Visitor::visitTuple
virtual void visitTuple(Input &)
Definition: Visitor.h:110
armarx::aron::type::Descriptor::NDARRAY
@ NDARRAY
armarx::aron::type::Visitor::visitPosition
virtual void visitPosition(Input &)
Definition: Visitor.h:116
armarx::aron::type::Visitor::visitPose
virtual void visitPose(Input &)
Definition: Visitor.h:117
armarx::aron::type::Descriptor::BOOL
@ BOOL
armarx::aron::type::Visitor::visitString
virtual void visitString(Input &)
Definition: Visitor.h:126
armarx::aron::type::Visitor::visitLong
virtual void visitLong(Input &)
Definition: Visitor.h:122
armarx::aron::type::VisitorBase::getDescriptor
virtual type::Descriptor getDescriptor(Input &)=0
armarx::aron::type::Descriptor::MATRIX
@ MATRIX
armarx::aron::type::Descriptor::QUATERNION
@ QUATERNION
armarx::aron::type::Visitor::visitUnknown
virtual void visitUnknown(Input &)
Definition: Visitor.h:128
armarx::aron::type
A convenience header to include all aron files (full include, not forward declared)
Definition: aron_conversions.cpp:9
armarx::aron::type::Descriptor::STRING
@ STRING
armarx::aron::type::Descriptor::LONG
@ LONG
armarx::aron::type::Visitor::visitDict
virtual void visitDict(Input &)
Definition: Visitor.h:108
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::type::Visitor::visitPair
virtual void visitPair(Input &)
Definition: Visitor.h:109
armarx::aron::type::Descriptor::INT_ENUM
@ INT_ENUM
armarx::aron::type::Descriptor::OBJECT
@ OBJECT
armarx::aron::type::Descriptor::UNKNOWN
@ UNKNOWN
armarx::aron::type::Descriptor::DICT
@ DICT
armarx::aron::type::Descriptor::TUPLE
@ TUPLE
armarx::aron::type::visit
void visit(VisitorImplementation &v, typename VisitorImplementation::Input &t)
The visit function.
Definition: Visitor.h:42
armarx::aron::type::Descriptor::POINTCLOUD
@ POINTCLOUD
T
float T
Definition: UnscentedKalmanFilterTest.cpp:35
armarx::aron::type::Visitor::visitNDArray
virtual void visitNDArray(Input &)
Definition: Visitor.h:113
armarx::aron::type::Descriptor
Descriptor
Definition: Descriptor.h:76
armarx::aron::type::Visitor::visitMatrix
virtual void visitMatrix(Input &)
Definition: Visitor.h:112
armarx::aron::data::VisitorBase< const nlohmann::json >::Input
const nlohmann::json Input
Definition: Visitor.h:41
armarx::aron::type::Descriptor::ANY_OBJECT
@ ANY_OBJECT
armarx::aron::type::Visitor::visitDouble
virtual void visitDouble(Input &)
Definition: Visitor.h:124
armarx::aron::type::Visitor::visitFloat
virtual void visitFloat(Input &)
Definition: Visitor.h:123
armarx::aron::type::VisitorBase::~VisitorBase
virtual ~VisitorBase()=default
armarx::aron::type::Visitor::visitImage
virtual void visitImage(Input &)
Definition: Visitor.h:118