36 #ifndef ROS_INTROSPECTION_HELPER_H 37 #define ROS_INTROSPECTION_HELPER_H 46 using Span = nonstd::span<T>;
52 "00010203040506070809" 53 "10111213141516171819" 54 "20212223242526272829" 55 "30313233343536373839" 56 "40414243444546474849" 57 "50515253545556575859" 58 "60616263646566676869" 59 "70717273747576777879" 60 "80818283848586878889" 61 "90919293949596979899";
64 buffer[0] =
static_cast<char>(
'0' + value);
67 else if (value < 100) {
69 buffer[0] = DIGITS[ value ];
70 buffer[1] = DIGITS[ value+1 ];
74 return sprintf( buffer,
"%d", value );
82 if ( offset +
sizeof(T) > static_cast<std::size_t>(buffer.size()) )
84 throw std::runtime_error(
"Buffer overrun in RosIntrospection::ReadFromBuffer");
86 destination = (*(
reinterpret_cast<const T*
>( &(buffer.data()[offset]) ) ) );
92 uint32_t string_size = 0;
95 if( offset + string_size > static_cast<std::size_t>(buffer.size()) )
97 throw std::runtime_error(
"Buffer overrun in RosIntrospection::ReadFromBuffer");
100 const char* buffer_ptr =
reinterpret_cast<const char*
>( &buffer[offset] );
101 offset += string_size;
103 destination.assign( buffer_ptr, string_size );
106 template <
typename T>
inline 118 case BOOL:
return ReadFromBufferToVariant<bool>(buffer,offset);
119 case CHAR:
return ReadFromBufferToVariant<char>(buffer,offset);
121 case UINT8:
return ReadFromBufferToVariant<uint8_t>(buffer,offset);
122 case UINT16:
return ReadFromBufferToVariant<uint16_t>(buffer,offset);
123 case UINT32:
return ReadFromBufferToVariant<uint32_t>(buffer,offset);
124 case UINT64:
return ReadFromBufferToVariant<uint64_t>(buffer,offset);
126 case INT8:
return ReadFromBufferToVariant<int8_t>(buffer,offset);
127 case INT16:
return ReadFromBufferToVariant<int16_t>(buffer,offset);
128 case INT32:
return ReadFromBufferToVariant<int32_t>(buffer,offset);
129 case INT64:
return ReadFromBufferToVariant<int64_t>(buffer,offset);
131 case FLOAT32:
return ReadFromBufferToVariant<float>(buffer,offset);
132 case FLOAT64:
return ReadFromBufferToVariant<double>(buffer,offset);
148 uint32_t string_size = 0;
150 if( offset + string_size > static_cast<std::size_t>(buffer.size()) ) {
151 throw std::runtime_error(
"Buffer overrun");
153 Variant var_string(reinterpret_cast<const char*>( &buffer[offset] ), string_size );
154 offset += string_size;
157 case OTHER:
return -1;
160 throw std::runtime_error(
"unsupported builtin type value");
int print_number(char *buffer, uint16_t value)
Variant ReadFromBufferToVariant(const Span< uint8_t > &buffer, size_t &offset)
void ReadFromBuffer(const Span< uint8_t > &buffer, size_t &offset, T &destination)