Program Listing for File message_type_traits.hpp

Return to documentation for file (include/ros_babel_fish/messages/message_type_traits.hpp)

//
// Created by stefan on 23.01.21.
//

#ifndef ROS_BABEL_FISH_MESSAGE_TYPE_TRAITS_HPP
#define ROS_BABEL_FISH_MESSAGE_TYPE_TRAITS_HPP

#include "ros_babel_fish/messages/message_types.hpp"
#include <string>
#include <vector>

namespace ros_babel_fish
{
// Predeclare message classes
class Message;

class ArrayMessageBase;

class CompoundMessage;

namespace message_type_traits
{
template<typename T>
struct message_type {
  static constexpr MessageType value = MessageTypes::None;
};

template<MessageType>
struct member_type {
  typedef void value;
};

template<MessageType>
struct value_type {
  typedef void value;
};

inline bool isValueType( MessageType type )
{
  return type != MessageTypes::Compound && type != MessageTypes::Array && type != MessageTypes::None;
}

#define DECLARE_MESSAGE_TYPE_FOR_TYPE( __message_type, __type )                                    \
  template<>                                                                                       \
  struct message_type<__type> {                                                                    \
    static constexpr MessageType value = __message_type;                                           \
  }
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::Bool, bool );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::UInt8, uint8_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::UInt16, uint16_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::UInt32, uint32_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::UInt64, uint64_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::Int8, int8_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::Int16, int16_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::Int32, int32_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::Int64, int64_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::Float, float );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::Double, double );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::LongDouble, long double );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::WChar, char16_t );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::String, std::string );
DECLARE_MESSAGE_TYPE_FOR_TYPE( MessageTypes::WString, std::wstring );
#undef DECLARE_MESSAGE_TYPE_FOR_TYPE

#define DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( __message_type, __type )                             \
  template<>                                                                                       \
  struct member_type<__message_type> {                                                             \
    typedef __type value;                                                                          \
  }
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Bool, bool );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Octet, unsigned char );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::UInt8, uint8_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::UInt16, uint16_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::UInt32, uint32_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::UInt64, uint64_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Int8, int8_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Int16, int16_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Int32, int32_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Int64, int64_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Float, float );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Double, double );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::LongDouble, long double );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Char, unsigned char );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::WChar, char16_t );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::String, std::string );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::WString, std::wstring );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Compound, CompoundMessage );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Array, ArrayMessageBase );
DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE( MessageTypes::None, void );
#undef DECLARE_MEMBER_TYPE_FOR_MESSAGE_TYPE
#define DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( __message_type, __type )                              \
  template<>                                                                                       \
  struct value_type<__message_type> {                                                              \
    typedef __type value;                                                                          \
  }
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Bool, bool );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Octet, unsigned char );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::UInt8, uint8_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::UInt16, uint16_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::UInt32, uint32_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::UInt64, uint64_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Int8, int8_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Int16, int16_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Int32, int32_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Int64, int64_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Float, float );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Double, double );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::LongDouble, long double );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Char, unsigned char );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::WChar, char16_t );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::String, std::string );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::WString, std::wstring );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Compound, CompoundMessage );
DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE( MessageTypes::Array, ArrayMessageBase );
#undef DECLARE_VALUE_TYPE_FOR_MESSAGE_TYPE

template<typename T, bool FIXED_LENGTH = false>
struct array_type {
  typedef T &Reference;
  typedef T ReturnType;
  typedef const T ConstReturnType;
  typedef const T &ArgumentType;
};
template<>
struct array_type<bool, false> {
  typedef std::vector<bool>::reference Reference;
  typedef bool ReturnType;
  typedef bool ConstReturnType;
  typedef bool ArgumentType;
};
template<>
struct array_type<Message, false> {
  typedef void Reference;
  typedef void ReturnType;
  typedef const void ConstReturnType;
  typedef void ArgumentType;
};
template<>
struct array_type<Message, true> {
  typedef void Reference;
  typedef void ReturnType;
  typedef const void ConstReturnType;
  typedef void ArgumentType;
};
} // namespace message_type_traits
} // namespace ros_babel_fish

#endif // ROS_BABEL_FISH_MESSAGE_TYPE_TRAITS_HPP