29 #ifndef CPP_INTROSPECTION_TYPE_H 30 #define CPP_INTROSPECTION_TYPE_H 34 #include <boost/any.hpp> 35 #include <boost/enable_shared_from_this.hpp> 36 #include <boost/lexical_cast.hpp> 40 #include <std_msgs/String.h> 41 #include <std_msgs/Bool.h> 43 #define CATCH_BAD_CAST_EXCEPTION_AND_RETURN(return_value, default_value) \ 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; \ 56 class Type :
public boost::enable_shared_from_this<Type>
62 Type(
const char *name) : name_(name) {}
67 virtual const std::type_info&
getTypeId()
const = 0;
69 virtual bool isString()
const {
return false; }
72 template <
typename TargetType> TargetType
as(
const boost::any& value)
const;
73 template <
typename SourceType> boost::any
from(
const SourceType& value)
const;
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;
97 virtual const std::type_info&
getTypeId()
const {
return *
static_cast<const std::type_info *
>(0); }
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(); }
109 template <
typename T>
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)); }
134 typedef std_msgs::Bool::_data_type
type;
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)); }
155 typedef std_msgs::String::_data_type
type;
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)); }
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))); }
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))); }
221 #endif // CPP_INTROSPECTION_TYPE_H
virtual boost::any from_string(const std::string &value) const
TargetType as(const boost::any &value) const
virtual boost::any from_int(int value) const
virtual double as_double(const boost::any &value) const
virtual bool isNumeric() const
virtual int as_int(const boost::any &value) const =0
virtual bool isNumeric() const
DurationType(const char *name)
virtual std::string as_string(const boost::any &value) const =0
virtual boost::any from_int(int value) const
BoolType(const char *name)
virtual std::string as_string(const boost::any &value) const
virtual bool isNumeric() const
virtual const std::type_info & getTypeId() const
virtual double as_double(const boost::any &value) const
virtual unsigned as_unsigned(const boost::any &value) const
virtual double as_double(const boost::any &value) const
boost::any from(const SourceType &value) const
virtual boost::any from_double(double value) const
virtual const std::type_info & getTypeId() const
virtual const std::type_info & getTypeId() const
static const TypePtr & add(const TypePtr &type, const std::string &alias=std::string())
std_msgs::Bool::_data_type type
virtual std::string as_string(const boost::any &value) const
virtual int as_int(const boost::any &value) const
NumericType(const char *name)
virtual boost::any from_int(int value) const
virtual std::string as_string(const boost::any &value) const
virtual boost::any from_unsigned(unsigned value) const
virtual std::string as_string(const boost::any &value) const
virtual int as_int(const boost::any &value) const
virtual boost::any from_int(int value) const
virtual const std::type_info & getTypeId() const
StringType(const char *name)
virtual boost::any from_unsigned(unsigned value) const
#define CATCH_BAD_CAST_EXCEPTION_AND_RETURN(return_value, default_value)
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
TypePtr type(const std::string &name)
virtual boost::any from_int(int value) const
virtual double as_double(const boost::any &value) const
virtual bool isNumeric() const
virtual boost::any from_unsigned(unsigned value) const
virtual boost::any from_unsigned(unsigned value) const
virtual const std::type_info & getTypeId() const
virtual boost::any from_double(double value) const
virtual bool isString() const
virtual const std::type_info & getTypeId() const
virtual boost::any from_string(const std::string &value) const =0
virtual int as_int(const boost::any &value) const
StaticInitializer(const TypePtr &type)
virtual unsigned as_unsigned(const boost::any &value) const
virtual boost::any from_string(const std::string &value) const
virtual unsigned as_unsigned(const boost::any &value) const =0
virtual int as_int(const boost::any &value) const
TimeType(const char *name)
virtual boost::any from_unsigned(unsigned value) const
virtual boost::any from_double(double value) const
virtual unsigned as_unsigned(const boost::any &value) const
virtual boost::any from_int(int value) const
virtual int as_int(const boost::any &value) const
virtual boost::any from_unsigned(unsigned value) const
virtual unsigned as_unsigned(const boost::any &value) const
virtual int as_int(const boost::any &value) const
virtual boost::any from_string(const std::string &value) const
virtual boost::any from_double(double value) const =0
virtual double as_double(const boost::any &value) const
virtual boost::any from_double(double value) const
virtual boost::any from_unsigned(unsigned value) const =0
virtual double as_double(const boost::any &value) const
virtual boost::any from_string(const std::string &value) const
TypePtr alias(const std::string &name) const
virtual boost::any from_double(double value) const
virtual bool isNumeric() const
virtual boost::any from_string(const std::string &value) const
bool operator==(const Type &other)
virtual const std::type_info & getTypeId() const =0
virtual boost::any from_double(double value) const
virtual const char * getName() const
virtual boost::any from_string(const std::string &value) const
virtual std::string as_string(const boost::any &value) const
std_msgs::String::_data_type type
virtual unsigned as_unsigned(const boost::any &value) const
virtual unsigned as_unsigned(const boost::any &value) const
virtual bool isString() const