type.h
Go to the documentation of this file.
1 //=================================================================================================
2 // Copyright (c) 2011, Johannes Meyer, TU Darmstadt
3 // All rights reserved.
4 
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 // * Redistributions in binary form must reproduce the above copyright
10 // notice, this list of conditions and the following disclaimer in the
11 // documentation and/or other materials provided with the distribution.
12 // * Neither the name of the Flight Systems and Automatic Control group,
13 // TU Darmstadt, nor the names of its contributors may be used to
14 // endorse or promote products derived from this software without
15 // specific prior written permission.
16 
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
21 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 //=================================================================================================
28 
29 #ifndef CPP_INTROSPECTION_TYPE_H
30 #define CPP_INTROSPECTION_TYPE_H
31 
32 #include <introspection/forwards.h>
33 
34 #include <boost/any.hpp>
35 #include <boost/enable_shared_from_this.hpp>
36 #include <boost/lexical_cast.hpp>
37 
38 #include <ros/time.h>
39 #include <ros/console.h>
40 #include <std_msgs/String.h>
41 #include <std_msgs/Bool.h>
42 
43 #define CATCH_BAD_CAST_EXCEPTION_AND_RETURN(return_value, default_value) \
44  try { \
45  return return_value; \
46  } catch (boost::bad_any_cast&) { \
47  ROS_WARN_NAMED("cpp_introspection", "bad_any_cast exception while trying to convert a value of type %s", getName()); \
48  return default_value; \
49  } catch (boost::bad_lexical_cast&) { \
50  return default_value; \
51  } while(0)
52 
53 
54 namespace cpp_introspection {
55 
56  class Type : public boost::enable_shared_from_this<Type>
57  {
58  private:
59  const char *name_;
60 
61  public:
62  Type(const char *name) : name_(name) {}
63  virtual ~Type() {}
64  static const TypePtr& add(const TypePtr& type, const std::string& alias = std::string());
65 
66  virtual const char *getName() const { return name_; }
67  virtual const std::type_info& getTypeId() const = 0;
68  virtual bool isNumeric() const { return false; }
69  virtual bool isString() const { return false; }
70 
71  template <typename T> bool is() const { return &(getTypeId()) && (getTypeId() == typeid(T)); }
72  template <typename TargetType> TargetType as(const boost::any& value) const;
73  template <typename SourceType> boost::any from(const SourceType& value) const;
74 
75  virtual std::string as_string(const boost::any& value) const = 0;
76  virtual double as_double(const boost::any& value) const = 0;
77  virtual int as_int(const boost::any& value) const = 0;
78  virtual unsigned as_unsigned(const boost::any& value) const = 0;
79  virtual boost::any from_string(const std::string& value) const = 0;
80  virtual boost::any from_double(double value) const = 0;
81  virtual boost::any from_int(int value) const = 0;
82  virtual boost::any from_unsigned(unsigned value) const = 0;
83 
84  struct StaticInitializer { StaticInitializer(const TypePtr& type); };
85  TypePtr alias(const std::string& name) const;
86 
87  bool operator==(const Type& other) { return &getTypeId() && &other.getTypeId() && getTypeId() == other.getTypeId(); }
88  };
89 
90  struct UnknownType : public Type
91  {
92  public:
93  UnknownType() : Type("(unknown)") {}
94  virtual ~UnknownType() {}
95  static TypePtr Instance();
96 
97  virtual const std::type_info& getTypeId() const { return *static_cast<const std::type_info *>(0); }
98 
99  virtual std::string as_string(const boost::any& value) const { return std::string(); }
100  virtual double as_double(const boost::any& value) const { return std::numeric_limits<double>::quiet_NaN(); }
101  virtual int as_int(const boost::any& value) const { return 0; }
102  virtual unsigned as_unsigned(const boost::any& value) const { return 0; }
103  virtual boost::any from_string(const std::string& value) const { return boost::any(); }
104  virtual boost::any from_double(double value) const { return boost::any(); }
105  virtual boost::any from_int(int value) const { return boost::any(); }
106  virtual boost::any from_unsigned(unsigned value) const { return boost::any(); }
107  };
108 
109  template <typename T>
110  class NumericType : public Type
111  {
112  public:
113  typedef T type;
114 
115  NumericType(const char *name) : Type(name) {}
116  virtual ~NumericType() {}
117 
118  virtual const std::type_info& getTypeId() const { return typeid(type); }
119  virtual bool isNumeric() const { return true; }
120 
121  virtual std::string as_string(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(boost::lexical_cast<std::string>(boost::any_cast<type>(value)), std::string()); }
122  virtual double as_double(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(double(boost::any_cast<type>(value)), std::numeric_limits<double>::quiet_NaN()); }
123  virtual int as_int(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(int(boost::any_cast<type>(value)), 0); }
124  virtual unsigned as_unsigned(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(unsigned(boost::any_cast<type>(value)), 0); }
125  virtual boost::any from_string(const std::string& value) const { return boost::any(boost::lexical_cast<type>(value)); }
126  virtual boost::any from_double(double value) const { return boost::any(type(value)); }
127  virtual boost::any from_int(int value) const { return boost::any(type(value)); }
128  virtual boost::any from_unsigned(unsigned value) const { return boost::any(type(value)); }
129  };
130 
131  class BoolType : public Type
132  {
133  public:
134  typedef std_msgs::Bool::_data_type type;
135 
136  BoolType(const char *name) : Type(name) {}
137  virtual ~BoolType() {}
138 
139  virtual const std::type_info& getTypeId() const { return typeid(type); }
140  virtual bool isNumeric() const { return true; }
141 
142  virtual std::string as_string(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(boost::lexical_cast<std::string>(boost::any_cast<type>(value)), std::string()); }
143  virtual double as_double(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(double(boost::any_cast<type>(value)), std::numeric_limits<double>::quiet_NaN()); }
144  virtual int as_int(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(int(boost::any_cast<type>(value)), 0); }
145  virtual unsigned as_unsigned(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(unsigned(boost::any_cast<type>(value)), 0); }
146  virtual boost::any from_string(const std::string& value) const { return boost::any(type(boost::lexical_cast<bool>(value))); }
147  virtual boost::any from_double(double value) const { return boost::any(type(value)); }
148  virtual boost::any from_int(int value) const { return boost::any(type(value)); }
149  virtual boost::any from_unsigned(unsigned value) const { return boost::any(type(value)); }
150  };
151 
152  class StringType : public Type
153  {
154  public:
155  typedef std_msgs::String::_data_type type;
156 
157  StringType(const char *name) : Type(name) {}
158  virtual ~StringType() {}
159 
160  virtual const std::type_info& getTypeId() const { return typeid(type); }
161  virtual bool isString() const { return true; }
162 
163  virtual std::string as_string(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(boost::any_cast<type>(value), std::string()); }
164  virtual double as_double(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(boost::lexical_cast<double>(boost::any_cast<type>(value)), std::numeric_limits<double>::quiet_NaN()); }
165  virtual int as_int(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(boost::lexical_cast<int>(boost::any_cast<type>(value)), 0); }
166  virtual unsigned as_unsigned(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(boost::lexical_cast<unsigned>(boost::any_cast<type>(value)), 0); }
167  virtual boost::any from_string(const std::string& value) const { return boost::any(type(value)); }
168  virtual boost::any from_double(double value) const { return boost::any(boost::lexical_cast<type>(value)); }
169  virtual boost::any from_int(int value) const { return boost::any(boost::lexical_cast<type>(value)); }
170  virtual boost::any from_unsigned(unsigned value) const { return boost::any(boost::lexical_cast<type>(value)); }
171  };
172 
173  class TimeType : public Type
174  {
175  public:
176  typedef ros::Time type;
177 
178  TimeType(const char *name) : Type(name) {}
179  virtual ~TimeType() {}
180 
181  virtual const std::type_info& getTypeId() const { return typeid(type); }
182  virtual bool isNumeric() const { return true; }
183 
184  virtual std::string as_string(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(boost::lexical_cast<std::string>(boost::any_cast<type>(value).toSec()), std::string()); }
185  virtual double as_double(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(double(boost::any_cast<type>(value).toSec()), std::numeric_limits<double>::quiet_NaN()); }
186  virtual int as_int(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(int(boost::any_cast<type>(value).toSec()), 0); }
187  virtual unsigned as_unsigned(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(unsigned(boost::any_cast<type>(value).toSec()), 0); }
188  virtual boost::any from_string(const std::string& value) const { return boost::any(type(boost::lexical_cast<double>(value))); }
189  virtual boost::any from_double(double value) const { return boost::any(type(value)); }
190  virtual boost::any from_int(int value) const { return boost::any(type(double(value))); }
191  virtual boost::any from_unsigned(unsigned value) const { return boost::any(type(double(value))); }
192  };
193 
194  class DurationType : public Type
195  {
196  public:
198 
199  DurationType(const char *name) : Type(name) {}
200  virtual ~DurationType() {}
201 
202  virtual const std::type_info& getTypeId() const { return typeid(type); }
203  virtual bool isNumeric() const { return true; }
204 
205  virtual std::string as_string(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(boost::lexical_cast<std::string>(boost::any_cast<type>(value).toSec()), std::string()); }
206  virtual double as_double(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(double(boost::any_cast<type>(value).toSec()), std::numeric_limits<double>::quiet_NaN()); }
207  virtual int as_int(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(int(boost::any_cast<type>(value).toSec()), 0); }
208  virtual unsigned as_unsigned(const boost::any& value) const { CATCH_BAD_CAST_EXCEPTION_AND_RETURN(unsigned(boost::any_cast<type>(value).toSec()), 0); }
209  virtual boost::any from_string(const std::string& value) const { return boost::any(type(boost::lexical_cast<double>(value))); }
210  virtual boost::any from_double(double value) const { return boost::any(type(value)); }
211  virtual boost::any from_int(int value) const { return boost::any(type(double(value))); }
212  virtual boost::any from_unsigned(unsigned value) const { return boost::any(type(double(value))); }
213  };
214 
215  TypePtr type(const std::string& name);
216 
217 } // namespace cpp_introspection
218 
220 
221 #endif // CPP_INTROSPECTION_TYPE_H
bool is() const
Definition: type.h:71
virtual boost::any from_string(const std::string &value) const
Definition: type.h:146
TargetType as(const boost::any &value) const
Definition: conversion.h:76
virtual boost::any from_int(int value) const
Definition: type.h:105
virtual double as_double(const boost::any &value) const
Definition: type.h:143
virtual bool isNumeric() const
Definition: type.h:119
virtual int as_int(const boost::any &value) const =0
virtual bool isNumeric() const
Definition: type.h:182
DurationType(const char *name)
Definition: type.h:199
virtual std::string as_string(const boost::any &value) const =0
virtual boost::any from_int(int value) const
Definition: type.h:211
BoolType(const char *name)
Definition: type.h:136
const char * name_
Definition: type.h:59
virtual std::string as_string(const boost::any &value) const
Definition: type.h:99
virtual bool isNumeric() const
Definition: type.h:68
virtual const std::type_info & getTypeId() const
Definition: type.h:181
virtual double as_double(const boost::any &value) const
Definition: type.h:164
virtual unsigned as_unsigned(const boost::any &value) const
Definition: type.h:124
virtual double as_double(const boost::any &value) const
Definition: type.h:185
boost::any from(const SourceType &value) const
Definition: conversion.h:77
virtual boost::any from_double(double value) const
Definition: type.h:104
virtual const std::type_info & getTypeId() const
Definition: type.h:118
virtual const std::type_info & getTypeId() const
Definition: type.h:160
static const TypePtr & add(const TypePtr &type, const std::string &alias=std::string())
Definition: types.cpp:55
std_msgs::Bool::_data_type type
Definition: type.h:134
virtual std::string as_string(const boost::any &value) const
Definition: type.h:121
virtual int as_int(const boost::any &value) const
Definition: type.h:123
NumericType(const char *name)
Definition: type.h:115
virtual boost::any from_int(int value) const
Definition: type.h:169
virtual std::string as_string(const boost::any &value) const
Definition: type.h:205
virtual boost::any from_unsigned(unsigned value) const
Definition: type.h:170
virtual std::string as_string(const boost::any &value) const
Definition: type.h:142
virtual int as_int(const boost::any &value) const
Definition: type.h:186
virtual boost::any from_int(int value) const
Definition: type.h:127
virtual const std::type_info & getTypeId() const
Definition: type.h:202
StringType(const char *name)
Definition: type.h:157
virtual boost::any from_unsigned(unsigned value) const
Definition: type.h:191
virtual ~Type()
Definition: type.h:63
#define CATCH_BAD_CAST_EXCEPTION_AND_RETURN(return_value, default_value)
Definition: type.h:43
virtual double as_double(const boost::any &value) const =0
virtual boost::any from_int(int value) const =0
virtual std::string as_string(const boost::any &value) const
Definition: type.h:184
TypePtr type(const std::string &name)
Definition: types.cpp:82
virtual boost::any from_int(int value) const
Definition: type.h:190
virtual double as_double(const boost::any &value) const
Definition: type.h:100
virtual bool isNumeric() const
Definition: type.h:203
virtual boost::any from_unsigned(unsigned value) const
Definition: type.h:212
virtual boost::any from_unsigned(unsigned value) const
Definition: type.h:106
virtual const std::type_info & getTypeId() const
Definition: type.h:97
virtual boost::any from_double(double value) const
Definition: type.h:168
virtual bool isString() const
Definition: type.h:69
virtual const std::type_info & getTypeId() const
Definition: type.h:139
virtual boost::any from_string(const std::string &value) const =0
virtual int as_int(const boost::any &value) const
Definition: type.h:207
StaticInitializer(const TypePtr &type)
Definition: types.cpp:66
virtual unsigned as_unsigned(const boost::any &value) const
Definition: type.h:208
virtual boost::any from_string(const std::string &value) const
Definition: type.h:188
virtual unsigned as_unsigned(const boost::any &value) const =0
virtual int as_int(const boost::any &value) const
Definition: type.h:165
TimeType(const char *name)
Definition: type.h:178
virtual boost::any from_unsigned(unsigned value) const
Definition: type.h:128
virtual boost::any from_double(double value) const
Definition: type.h:210
virtual unsigned as_unsigned(const boost::any &value) const
Definition: type.h:145
virtual boost::any from_int(int value) const
Definition: type.h:148
virtual int as_int(const boost::any &value) const
Definition: type.h:144
virtual boost::any from_unsigned(unsigned value) const
Definition: type.h:149
virtual unsigned as_unsigned(const boost::any &value) const
Definition: type.h:102
virtual int as_int(const boost::any &value) const
Definition: type.h:101
virtual boost::any from_string(const std::string &value) const
Definition: type.h:125
virtual boost::any from_double(double value) const =0
virtual double as_double(const boost::any &value) const
Definition: type.h:122
virtual boost::any from_double(double value) const
Definition: type.h:126
virtual boost::any from_unsigned(unsigned value) const =0
virtual double as_double(const boost::any &value) const
Definition: type.h:206
virtual boost::any from_string(const std::string &value) const
Definition: type.h:209
TypePtr alias(const std::string &name) const
Definition: types.cpp:71
virtual boost::any from_double(double value) const
Definition: type.h:147
virtual bool isNumeric() const
Definition: type.h:140
Type(const char *name)
Definition: type.h:62
virtual boost::any from_string(const std::string &value) const
Definition: type.h:103
bool operator==(const Type &other)
Definition: type.h:87
virtual const std::type_info & getTypeId() const =0
virtual boost::any from_double(double value) const
Definition: type.h:189
virtual const char * getName() const
Definition: type.h:66
virtual boost::any from_string(const std::string &value) const
Definition: type.h:167
virtual std::string as_string(const boost::any &value) const
Definition: type.h:163
std_msgs::String::_data_type type
Definition: type.h:155
virtual unsigned as_unsigned(const boost::any &value) const
Definition: type.h:166
virtual unsigned as_unsigned(const boost::any &value) const
Definition: type.h:187
virtual bool isString() const
Definition: type.h:161


cpp_introspection
Author(s): Johannes Meyer
autogenerated on Mon Jun 10 2019 12:56:18