complete motor

Dependencies:   BufferedSerial motor_sn7544

Committer:
Jeonghoon
Date:
Thu Jul 11 13:30:27 2019 +0000
Revision:
11:2228e8931266
190711; ;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeonghoon 11:2228e8931266 1 /*
Jeonghoon 11:2228e8931266 2 * Copyright (C) 2009, Willow Garage, Inc.
Jeonghoon 11:2228e8931266 3 *
Jeonghoon 11:2228e8931266 4 * Redistribution and use in source and binary forms, with or without
Jeonghoon 11:2228e8931266 5 * modification, are permitted provided that the following conditions are met:
Jeonghoon 11:2228e8931266 6 * * Redistributions of source code must retain the above copyright notice,
Jeonghoon 11:2228e8931266 7 * this list of conditions and the following disclaimer.
Jeonghoon 11:2228e8931266 8 * * Redistributions in binary form must reproduce the above copyright
Jeonghoon 11:2228e8931266 9 * notice, this list of conditions and the following disclaimer in the
Jeonghoon 11:2228e8931266 10 * documentation and/or other materials provided with the distribution.
Jeonghoon 11:2228e8931266 11 * * Neither the names of Willow Garage, Inc. nor the names of its
Jeonghoon 11:2228e8931266 12 * contributors may be used to endorse or promote products derived from
Jeonghoon 11:2228e8931266 13 * this software without specific prior written permission.
Jeonghoon 11:2228e8931266 14 *
Jeonghoon 11:2228e8931266 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Jeonghoon 11:2228e8931266 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Jeonghoon 11:2228e8931266 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Jeonghoon 11:2228e8931266 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
Jeonghoon 11:2228e8931266 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Jeonghoon 11:2228e8931266 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Jeonghoon 11:2228e8931266 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Jeonghoon 11:2228e8931266 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
Jeonghoon 11:2228e8931266 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Jeonghoon 11:2228e8931266 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Jeonghoon 11:2228e8931266 25 * POSSIBILITY OF SUCH DAMAGE.
Jeonghoon 11:2228e8931266 26 */
Jeonghoon 11:2228e8931266 27
Jeonghoon 11:2228e8931266 28 #ifndef ROSCPP_SERIALIZATION_H
Jeonghoon 11:2228e8931266 29 #define ROSCPP_SERIALIZATION_H
Jeonghoon 11:2228e8931266 30
Jeonghoon 11:2228e8931266 31 #include "roscpp_serialization_macros.h"
Jeonghoon 11:2228e8931266 32
Jeonghoon 11:2228e8931266 33 #include <ros/types.h>
Jeonghoon 11:2228e8931266 34 #include <ros/time.h>
Jeonghoon 11:2228e8931266 35
Jeonghoon 11:2228e8931266 36 #include "serialized_message.h"
Jeonghoon 11:2228e8931266 37 #include "ros/message_traits.h"
Jeonghoon 11:2228e8931266 38 #include "ros/builtin_message_traits.h"
Jeonghoon 11:2228e8931266 39 #include "ros/exception.h"
Jeonghoon 11:2228e8931266 40 #include "ros/datatypes.h"
Jeonghoon 11:2228e8931266 41
Jeonghoon 11:2228e8931266 42 #include <vector>
Jeonghoon 11:2228e8931266 43 #include <map>
Jeonghoon 11:2228e8931266 44
Jeonghoon 11:2228e8931266 45 #include <boost/array.hpp>
Jeonghoon 11:2228e8931266 46 #include <boost/call_traits.hpp>
Jeonghoon 11:2228e8931266 47 #include <boost/utility/enable_if.hpp>
Jeonghoon 11:2228e8931266 48 #include <boost/mpl/and.hpp>
Jeonghoon 11:2228e8931266 49 #include <boost/mpl/or.hpp>
Jeonghoon 11:2228e8931266 50 #include <boost/mpl/not.hpp>
Jeonghoon 11:2228e8931266 51
Jeonghoon 11:2228e8931266 52 #include <cstring>
Jeonghoon 11:2228e8931266 53
Jeonghoon 11:2228e8931266 54 #define ROS_NEW_SERIALIZATION_API 1
Jeonghoon 11:2228e8931266 55
Jeonghoon 11:2228e8931266 56 /**
Jeonghoon 11:2228e8931266 57 * \brief Declare your serializer to use an allInOne member instead of requiring 3 different serialization
Jeonghoon 11:2228e8931266 58 * functions.
Jeonghoon 11:2228e8931266 59 *
Jeonghoon 11:2228e8931266 60 * The allinone method has the form:
Jeonghoon 11:2228e8931266 61 \verbatim
Jeonghoon 11:2228e8931266 62 template<typename Stream, typename T>
Jeonghoon 11:2228e8931266 63 inline static void allInOne(Stream& stream, T t)
Jeonghoon 11:2228e8931266 64 {
Jeonghoon 11:2228e8931266 65 stream.next(t.a);
Jeonghoon 11:2228e8931266 66 stream.next(t.b);
Jeonghoon 11:2228e8931266 67 ...
Jeonghoon 11:2228e8931266 68 }
Jeonghoon 11:2228e8931266 69 \endverbatim
Jeonghoon 11:2228e8931266 70 *
Jeonghoon 11:2228e8931266 71 * The only guarantee given is that Stream::next(T) is defined.
Jeonghoon 11:2228e8931266 72 */
Jeonghoon 11:2228e8931266 73 #define ROS_DECLARE_ALLINONE_SERIALIZER \
Jeonghoon 11:2228e8931266 74 template<typename Stream, typename T> \
Jeonghoon 11:2228e8931266 75 inline static void write(Stream& stream, const T& t) \
Jeonghoon 11:2228e8931266 76 { \
Jeonghoon 11:2228e8931266 77 allInOne<Stream, const T&>(stream, t); \
Jeonghoon 11:2228e8931266 78 } \
Jeonghoon 11:2228e8931266 79 \
Jeonghoon 11:2228e8931266 80 template<typename Stream, typename T> \
Jeonghoon 11:2228e8931266 81 inline static void read(Stream& stream, T& t) \
Jeonghoon 11:2228e8931266 82 { \
Jeonghoon 11:2228e8931266 83 allInOne<Stream, T&>(stream, t); \
Jeonghoon 11:2228e8931266 84 } \
Jeonghoon 11:2228e8931266 85 \
Jeonghoon 11:2228e8931266 86 template<typename T> \
Jeonghoon 11:2228e8931266 87 inline static uint32_t serializedLength(const T& t) \
Jeonghoon 11:2228e8931266 88 { \
Jeonghoon 11:2228e8931266 89 LStream stream; \
Jeonghoon 11:2228e8931266 90 allInOne<LStream, const T&>(stream, t); \
Jeonghoon 11:2228e8931266 91 return stream.getLength(); \
Jeonghoon 11:2228e8931266 92 }
Jeonghoon 11:2228e8931266 93
Jeonghoon 11:2228e8931266 94 namespace ros
Jeonghoon 11:2228e8931266 95 {
Jeonghoon 11:2228e8931266 96 namespace serialization
Jeonghoon 11:2228e8931266 97 {
Jeonghoon 11:2228e8931266 98 namespace mt = message_traits;
Jeonghoon 11:2228e8931266 99 namespace mpl = boost::mpl;
Jeonghoon 11:2228e8931266 100
Jeonghoon 11:2228e8931266 101 class ROSCPP_SERIALIZATION_DECL StreamOverrunException : public ros::Exception
Jeonghoon 11:2228e8931266 102 {
Jeonghoon 11:2228e8931266 103 public:
Jeonghoon 11:2228e8931266 104 StreamOverrunException(const std::string& what)
Jeonghoon 11:2228e8931266 105 : Exception(what)
Jeonghoon 11:2228e8931266 106 {}
Jeonghoon 11:2228e8931266 107 };
Jeonghoon 11:2228e8931266 108
Jeonghoon 11:2228e8931266 109 ROSCPP_SERIALIZATION_DECL void throwStreamOverrun();
Jeonghoon 11:2228e8931266 110
Jeonghoon 11:2228e8931266 111 /**
Jeonghoon 11:2228e8931266 112 * \brief Templated serialization class. Default implementation provides backwards compatibility with
Jeonghoon 11:2228e8931266 113 * old message types.
Jeonghoon 11:2228e8931266 114 *
Jeonghoon 11:2228e8931266 115 * Specializing the Serializer class is the only thing you need to do to get the ROS serialization system
Jeonghoon 11:2228e8931266 116 * to work with a type.
Jeonghoon 11:2228e8931266 117 */
Jeonghoon 11:2228e8931266 118 template<typename T>
Jeonghoon 11:2228e8931266 119 struct Serializer
Jeonghoon 11:2228e8931266 120 {
Jeonghoon 11:2228e8931266 121 /**
Jeonghoon 11:2228e8931266 122 * \brief Write an object to the stream. Normally the stream passed in here will be a ros::serialization::OStream
Jeonghoon 11:2228e8931266 123 */
Jeonghoon 11:2228e8931266 124 template<typename Stream>
Jeonghoon 11:2228e8931266 125 inline static void write(Stream& stream, typename boost::call_traits<T>::param_type t)
Jeonghoon 11:2228e8931266 126 {
Jeonghoon 11:2228e8931266 127 t.serialize(stream.getData(), 0);
Jeonghoon 11:2228e8931266 128 }
Jeonghoon 11:2228e8931266 129
Jeonghoon 11:2228e8931266 130 /**
Jeonghoon 11:2228e8931266 131 * \brief Read an object from the stream. Normally the stream passed in here will be a ros::serialization::IStream
Jeonghoon 11:2228e8931266 132 */
Jeonghoon 11:2228e8931266 133 template<typename Stream>
Jeonghoon 11:2228e8931266 134 inline static void read(Stream& stream, typename boost::call_traits<T>::reference t)
Jeonghoon 11:2228e8931266 135 {
Jeonghoon 11:2228e8931266 136 t.deserialize(stream.getData());
Jeonghoon 11:2228e8931266 137 }
Jeonghoon 11:2228e8931266 138
Jeonghoon 11:2228e8931266 139 /**
Jeonghoon 11:2228e8931266 140 * \brief Determine the serialized length of an object.
Jeonghoon 11:2228e8931266 141 */
Jeonghoon 11:2228e8931266 142 inline static uint32_t serializedLength(typename boost::call_traits<T>::param_type t)
Jeonghoon 11:2228e8931266 143 {
Jeonghoon 11:2228e8931266 144 return t.serializationLength();
Jeonghoon 11:2228e8931266 145 }
Jeonghoon 11:2228e8931266 146 };
Jeonghoon 11:2228e8931266 147
Jeonghoon 11:2228e8931266 148 /**
Jeonghoon 11:2228e8931266 149 * \brief Serialize an object. Stream here should normally be a ros::serialization::OStream
Jeonghoon 11:2228e8931266 150 */
Jeonghoon 11:2228e8931266 151 template<typename T, typename Stream>
Jeonghoon 11:2228e8931266 152 inline void serialize(Stream& stream, const T& t)
Jeonghoon 11:2228e8931266 153 {
Jeonghoon 11:2228e8931266 154 Serializer<T>::write(stream, t);
Jeonghoon 11:2228e8931266 155 }
Jeonghoon 11:2228e8931266 156
Jeonghoon 11:2228e8931266 157 /**
Jeonghoon 11:2228e8931266 158 * \brief Deserialize an object. Stream here should normally be a ros::serialization::IStream
Jeonghoon 11:2228e8931266 159 */
Jeonghoon 11:2228e8931266 160 template<typename T, typename Stream>
Jeonghoon 11:2228e8931266 161 inline void deserialize(Stream& stream, T& t)
Jeonghoon 11:2228e8931266 162 {
Jeonghoon 11:2228e8931266 163 Serializer<T>::read(stream, t);
Jeonghoon 11:2228e8931266 164 }
Jeonghoon 11:2228e8931266 165
Jeonghoon 11:2228e8931266 166 /**
Jeonghoon 11:2228e8931266 167 * \brief Determine the serialized length of an object
Jeonghoon 11:2228e8931266 168 */
Jeonghoon 11:2228e8931266 169 template<typename T>
Jeonghoon 11:2228e8931266 170 inline uint32_t serializationLength(const T& t)
Jeonghoon 11:2228e8931266 171 {
Jeonghoon 11:2228e8931266 172 return Serializer<T>::serializedLength(t);
Jeonghoon 11:2228e8931266 173 }
Jeonghoon 11:2228e8931266 174
Jeonghoon 11:2228e8931266 175 #define ROS_CREATE_SIMPLE_SERIALIZER(Type) \
Jeonghoon 11:2228e8931266 176 template<> struct Serializer<Type> \
Jeonghoon 11:2228e8931266 177 { \
Jeonghoon 11:2228e8931266 178 template<typename Stream> inline static void write(Stream& stream, const Type v) \
Jeonghoon 11:2228e8931266 179 { \
Jeonghoon 11:2228e8931266 180 memcpy(stream.advance(sizeof(v)), &v, sizeof(v) ); \
Jeonghoon 11:2228e8931266 181 } \
Jeonghoon 11:2228e8931266 182 \
Jeonghoon 11:2228e8931266 183 template<typename Stream> inline static void read(Stream& stream, Type& v) \
Jeonghoon 11:2228e8931266 184 { \
Jeonghoon 11:2228e8931266 185 memcpy(&v, stream.advance(sizeof(v)), sizeof(v) ); \
Jeonghoon 11:2228e8931266 186 } \
Jeonghoon 11:2228e8931266 187 \
Jeonghoon 11:2228e8931266 188 inline static uint32_t serializedLength(const Type&) \
Jeonghoon 11:2228e8931266 189 { \
Jeonghoon 11:2228e8931266 190 return sizeof(Type); \
Jeonghoon 11:2228e8931266 191 } \
Jeonghoon 11:2228e8931266 192 };
Jeonghoon 11:2228e8931266 193
Jeonghoon 11:2228e8931266 194 ROS_CREATE_SIMPLE_SERIALIZER(uint8_t)
Jeonghoon 11:2228e8931266 195 ROS_CREATE_SIMPLE_SERIALIZER(int8_t)
Jeonghoon 11:2228e8931266 196 ROS_CREATE_SIMPLE_SERIALIZER(uint16_t)
Jeonghoon 11:2228e8931266 197 ROS_CREATE_SIMPLE_SERIALIZER(int16_t)
Jeonghoon 11:2228e8931266 198 ROS_CREATE_SIMPLE_SERIALIZER(uint32_t)
Jeonghoon 11:2228e8931266 199 ROS_CREATE_SIMPLE_SERIALIZER(int32_t)
Jeonghoon 11:2228e8931266 200 ROS_CREATE_SIMPLE_SERIALIZER(uint64_t)
Jeonghoon 11:2228e8931266 201 ROS_CREATE_SIMPLE_SERIALIZER(int64_t)
Jeonghoon 11:2228e8931266 202 ROS_CREATE_SIMPLE_SERIALIZER(float)
Jeonghoon 11:2228e8931266 203 ROS_CREATE_SIMPLE_SERIALIZER(double)
Jeonghoon 11:2228e8931266 204
Jeonghoon 11:2228e8931266 205 /**
Jeonghoon 11:2228e8931266 206 * \brief Serializer specialized for bool (serialized as uint8)
Jeonghoon 11:2228e8931266 207 */
Jeonghoon 11:2228e8931266 208 template<> struct Serializer<bool>
Jeonghoon 11:2228e8931266 209 {
Jeonghoon 11:2228e8931266 210 template<typename Stream> inline static void write(Stream& stream, const bool v)
Jeonghoon 11:2228e8931266 211 {
Jeonghoon 11:2228e8931266 212 uint8_t b = (uint8_t)v;
Jeonghoon 11:2228e8931266 213 memcpy(stream.advance(1), &b, 1 );
Jeonghoon 11:2228e8931266 214 }
Jeonghoon 11:2228e8931266 215
Jeonghoon 11:2228e8931266 216 template<typename Stream> inline static void read(Stream& stream, bool& v)
Jeonghoon 11:2228e8931266 217 {
Jeonghoon 11:2228e8931266 218 uint8_t b;
Jeonghoon 11:2228e8931266 219 memcpy(&b, stream.advance(1), 1 );
Jeonghoon 11:2228e8931266 220 v = (bool)b;
Jeonghoon 11:2228e8931266 221 }
Jeonghoon 11:2228e8931266 222
Jeonghoon 11:2228e8931266 223 inline static uint32_t serializedLength(bool)
Jeonghoon 11:2228e8931266 224 {
Jeonghoon 11:2228e8931266 225 return 1;
Jeonghoon 11:2228e8931266 226 }
Jeonghoon 11:2228e8931266 227 };
Jeonghoon 11:2228e8931266 228
Jeonghoon 11:2228e8931266 229 /**
Jeonghoon 11:2228e8931266 230 * \brief Serializer specialized for std::string
Jeonghoon 11:2228e8931266 231 */
Jeonghoon 11:2228e8931266 232 template<class ContainerAllocator>
Jeonghoon 11:2228e8931266 233 struct Serializer<std::basic_string<char, std::char_traits<char>, ContainerAllocator> >
Jeonghoon 11:2228e8931266 234 {
Jeonghoon 11:2228e8931266 235 typedef std::basic_string<char, std::char_traits<char>, ContainerAllocator> StringType;
Jeonghoon 11:2228e8931266 236
Jeonghoon 11:2228e8931266 237 template<typename Stream>
Jeonghoon 11:2228e8931266 238 inline static void write(Stream& stream, const StringType& str)
Jeonghoon 11:2228e8931266 239 {
Jeonghoon 11:2228e8931266 240 size_t len = str.size();
Jeonghoon 11:2228e8931266 241 stream.next((uint32_t)len);
Jeonghoon 11:2228e8931266 242
Jeonghoon 11:2228e8931266 243 if (len > 0)
Jeonghoon 11:2228e8931266 244 {
Jeonghoon 11:2228e8931266 245 memcpy(stream.advance((uint32_t)len), str.data(), len);
Jeonghoon 11:2228e8931266 246 }
Jeonghoon 11:2228e8931266 247 }
Jeonghoon 11:2228e8931266 248
Jeonghoon 11:2228e8931266 249 template<typename Stream>
Jeonghoon 11:2228e8931266 250 inline static void read(Stream& stream, StringType& str)
Jeonghoon 11:2228e8931266 251 {
Jeonghoon 11:2228e8931266 252 uint32_t len;
Jeonghoon 11:2228e8931266 253 stream.next(len);
Jeonghoon 11:2228e8931266 254 if (len > 0)
Jeonghoon 11:2228e8931266 255 {
Jeonghoon 11:2228e8931266 256 str = StringType((char*)stream.advance(len), len);
Jeonghoon 11:2228e8931266 257 }
Jeonghoon 11:2228e8931266 258 else
Jeonghoon 11:2228e8931266 259 {
Jeonghoon 11:2228e8931266 260 str.clear();
Jeonghoon 11:2228e8931266 261 }
Jeonghoon 11:2228e8931266 262 }
Jeonghoon 11:2228e8931266 263
Jeonghoon 11:2228e8931266 264 inline static uint32_t serializedLength(const StringType& str)
Jeonghoon 11:2228e8931266 265 {
Jeonghoon 11:2228e8931266 266 return 4 + (uint32_t)str.size();
Jeonghoon 11:2228e8931266 267 }
Jeonghoon 11:2228e8931266 268 };
Jeonghoon 11:2228e8931266 269
Jeonghoon 11:2228e8931266 270 /**
Jeonghoon 11:2228e8931266 271 * \brief Serializer specialized for ros::Time
Jeonghoon 11:2228e8931266 272 */
Jeonghoon 11:2228e8931266 273 template<>
Jeonghoon 11:2228e8931266 274 struct Serializer<ros::Time>
Jeonghoon 11:2228e8931266 275 {
Jeonghoon 11:2228e8931266 276 template<typename Stream>
Jeonghoon 11:2228e8931266 277 inline static void write(Stream& stream, const ros::Time& v)
Jeonghoon 11:2228e8931266 278 {
Jeonghoon 11:2228e8931266 279 stream.next(v.sec);
Jeonghoon 11:2228e8931266 280 stream.next(v.nsec);
Jeonghoon 11:2228e8931266 281 }
Jeonghoon 11:2228e8931266 282
Jeonghoon 11:2228e8931266 283 template<typename Stream>
Jeonghoon 11:2228e8931266 284 inline static void read(Stream& stream, ros::Time& v)
Jeonghoon 11:2228e8931266 285 {
Jeonghoon 11:2228e8931266 286 stream.next(v.sec);
Jeonghoon 11:2228e8931266 287 stream.next(v.nsec);
Jeonghoon 11:2228e8931266 288 }
Jeonghoon 11:2228e8931266 289
Jeonghoon 11:2228e8931266 290 inline static uint32_t serializedLength(const ros::Time&)
Jeonghoon 11:2228e8931266 291 {
Jeonghoon 11:2228e8931266 292 return 8;
Jeonghoon 11:2228e8931266 293 }
Jeonghoon 11:2228e8931266 294 };
Jeonghoon 11:2228e8931266 295
Jeonghoon 11:2228e8931266 296 /**
Jeonghoon 11:2228e8931266 297 * \brief Serializer specialized for ros::Duration
Jeonghoon 11:2228e8931266 298 */
Jeonghoon 11:2228e8931266 299 template<>
Jeonghoon 11:2228e8931266 300 struct Serializer<ros::Duration>
Jeonghoon 11:2228e8931266 301 {
Jeonghoon 11:2228e8931266 302 template<typename Stream>
Jeonghoon 11:2228e8931266 303 inline static void write(Stream& stream, const ros::Duration& v)
Jeonghoon 11:2228e8931266 304 {
Jeonghoon 11:2228e8931266 305 stream.next(v.sec);
Jeonghoon 11:2228e8931266 306 stream.next(v.nsec);
Jeonghoon 11:2228e8931266 307 }
Jeonghoon 11:2228e8931266 308
Jeonghoon 11:2228e8931266 309 template<typename Stream>
Jeonghoon 11:2228e8931266 310 inline static void read(Stream& stream, ros::Duration& v)
Jeonghoon 11:2228e8931266 311 {
Jeonghoon 11:2228e8931266 312 stream.next(v.sec);
Jeonghoon 11:2228e8931266 313 stream.next(v.nsec);
Jeonghoon 11:2228e8931266 314 }
Jeonghoon 11:2228e8931266 315
Jeonghoon 11:2228e8931266 316 inline static uint32_t serializedLength(const ros::Duration&)
Jeonghoon 11:2228e8931266 317 {
Jeonghoon 11:2228e8931266 318 return 8;
Jeonghoon 11:2228e8931266 319 }
Jeonghoon 11:2228e8931266 320 };
Jeonghoon 11:2228e8931266 321
Jeonghoon 11:2228e8931266 322 /**
Jeonghoon 11:2228e8931266 323 * \brief Vector serializer. Default implementation does nothing
Jeonghoon 11:2228e8931266 324 */
Jeonghoon 11:2228e8931266 325 template<typename T, class ContainerAllocator, class Enabled = void>
Jeonghoon 11:2228e8931266 326 struct VectorSerializer
Jeonghoon 11:2228e8931266 327 {};
Jeonghoon 11:2228e8931266 328
Jeonghoon 11:2228e8931266 329 /**
Jeonghoon 11:2228e8931266 330 * \brief Vector serializer, specialized for non-fixed-size, non-simple types
Jeonghoon 11:2228e8931266 331 */
Jeonghoon 11:2228e8931266 332 template<typename T, class ContainerAllocator>
Jeonghoon 11:2228e8931266 333 struct VectorSerializer<T, ContainerAllocator, typename boost::disable_if<mt::IsFixedSize<T> >::type >
Jeonghoon 11:2228e8931266 334 {
Jeonghoon 11:2228e8931266 335 typedef std::vector<T, typename ContainerAllocator::template rebind<T>::other> VecType;
Jeonghoon 11:2228e8931266 336 typedef typename VecType::iterator IteratorType;
Jeonghoon 11:2228e8931266 337 typedef typename VecType::const_iterator ConstIteratorType;
Jeonghoon 11:2228e8931266 338
Jeonghoon 11:2228e8931266 339 template<typename Stream>
Jeonghoon 11:2228e8931266 340 inline static void write(Stream& stream, const VecType& v)
Jeonghoon 11:2228e8931266 341 {
Jeonghoon 11:2228e8931266 342 stream.next((uint32_t)v.size());
Jeonghoon 11:2228e8931266 343 ConstIteratorType it = v.begin();
Jeonghoon 11:2228e8931266 344 ConstIteratorType end = v.end();
Jeonghoon 11:2228e8931266 345 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 346 {
Jeonghoon 11:2228e8931266 347 stream.next(*it);
Jeonghoon 11:2228e8931266 348 }
Jeonghoon 11:2228e8931266 349 }
Jeonghoon 11:2228e8931266 350
Jeonghoon 11:2228e8931266 351 template<typename Stream>
Jeonghoon 11:2228e8931266 352 inline static void read(Stream& stream, VecType& v)
Jeonghoon 11:2228e8931266 353 {
Jeonghoon 11:2228e8931266 354 uint32_t len;
Jeonghoon 11:2228e8931266 355 stream.next(len);
Jeonghoon 11:2228e8931266 356 v.resize(len);
Jeonghoon 11:2228e8931266 357 IteratorType it = v.begin();
Jeonghoon 11:2228e8931266 358 IteratorType end = v.end();
Jeonghoon 11:2228e8931266 359 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 360 {
Jeonghoon 11:2228e8931266 361 stream.next(*it);
Jeonghoon 11:2228e8931266 362 }
Jeonghoon 11:2228e8931266 363 }
Jeonghoon 11:2228e8931266 364
Jeonghoon 11:2228e8931266 365 inline static uint32_t serializedLength(const VecType& v)
Jeonghoon 11:2228e8931266 366 {
Jeonghoon 11:2228e8931266 367 uint32_t size = 4;
Jeonghoon 11:2228e8931266 368 ConstIteratorType it = v.begin();
Jeonghoon 11:2228e8931266 369 ConstIteratorType end = v.end();
Jeonghoon 11:2228e8931266 370 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 371 {
Jeonghoon 11:2228e8931266 372 size += serializationLength(*it);
Jeonghoon 11:2228e8931266 373 }
Jeonghoon 11:2228e8931266 374
Jeonghoon 11:2228e8931266 375 return size;
Jeonghoon 11:2228e8931266 376 }
Jeonghoon 11:2228e8931266 377 };
Jeonghoon 11:2228e8931266 378
Jeonghoon 11:2228e8931266 379 /**
Jeonghoon 11:2228e8931266 380 * \brief Vector serializer, specialized for fixed-size simple types
Jeonghoon 11:2228e8931266 381 */
Jeonghoon 11:2228e8931266 382 template<typename T, class ContainerAllocator>
Jeonghoon 11:2228e8931266 383 struct VectorSerializer<T, ContainerAllocator, typename boost::enable_if<mt::IsSimple<T> >::type >
Jeonghoon 11:2228e8931266 384 {
Jeonghoon 11:2228e8931266 385 typedef std::vector<T, typename ContainerAllocator::template rebind<T>::other> VecType;
Jeonghoon 11:2228e8931266 386 typedef typename VecType::iterator IteratorType;
Jeonghoon 11:2228e8931266 387 typedef typename VecType::const_iterator ConstIteratorType;
Jeonghoon 11:2228e8931266 388
Jeonghoon 11:2228e8931266 389 template<typename Stream>
Jeonghoon 11:2228e8931266 390 inline static void write(Stream& stream, const VecType& v)
Jeonghoon 11:2228e8931266 391 {
Jeonghoon 11:2228e8931266 392 uint32_t len = (uint32_t)v.size();
Jeonghoon 11:2228e8931266 393 stream.next(len);
Jeonghoon 11:2228e8931266 394 if (!v.empty())
Jeonghoon 11:2228e8931266 395 {
Jeonghoon 11:2228e8931266 396 const uint32_t data_len = len * (uint32_t)sizeof(T);
Jeonghoon 11:2228e8931266 397 memcpy(stream.advance(data_len), &v.front(), data_len);
Jeonghoon 11:2228e8931266 398 }
Jeonghoon 11:2228e8931266 399 }
Jeonghoon 11:2228e8931266 400
Jeonghoon 11:2228e8931266 401 template<typename Stream>
Jeonghoon 11:2228e8931266 402 inline static void read(Stream& stream, VecType& v)
Jeonghoon 11:2228e8931266 403 {
Jeonghoon 11:2228e8931266 404 uint32_t len;
Jeonghoon 11:2228e8931266 405 stream.next(len);
Jeonghoon 11:2228e8931266 406 v.resize(len);
Jeonghoon 11:2228e8931266 407
Jeonghoon 11:2228e8931266 408 if (len > 0)
Jeonghoon 11:2228e8931266 409 {
Jeonghoon 11:2228e8931266 410 const uint32_t data_len = (uint32_t)sizeof(T) * len;
Jeonghoon 11:2228e8931266 411 memcpy(&v.front(), stream.advance(data_len), data_len);
Jeonghoon 11:2228e8931266 412 }
Jeonghoon 11:2228e8931266 413 }
Jeonghoon 11:2228e8931266 414
Jeonghoon 11:2228e8931266 415 inline static uint32_t serializedLength(const VecType& v)
Jeonghoon 11:2228e8931266 416 {
Jeonghoon 11:2228e8931266 417 return 4 + v.size() * (uint32_t)sizeof(T);
Jeonghoon 11:2228e8931266 418 }
Jeonghoon 11:2228e8931266 419 };
Jeonghoon 11:2228e8931266 420
Jeonghoon 11:2228e8931266 421 /**
Jeonghoon 11:2228e8931266 422 * \brief Vector serializer, specialized for fixed-size non-simple types
Jeonghoon 11:2228e8931266 423 */
Jeonghoon 11:2228e8931266 424 template<typename T, class ContainerAllocator>
Jeonghoon 11:2228e8931266 425 struct VectorSerializer<T, ContainerAllocator, typename boost::enable_if<mpl::and_<mt::IsFixedSize<T>, mpl::not_<mt::IsSimple<T> > > >::type >
Jeonghoon 11:2228e8931266 426 {
Jeonghoon 11:2228e8931266 427 typedef std::vector<T, typename ContainerAllocator::template rebind<T>::other> VecType;
Jeonghoon 11:2228e8931266 428 typedef typename VecType::iterator IteratorType;
Jeonghoon 11:2228e8931266 429 typedef typename VecType::const_iterator ConstIteratorType;
Jeonghoon 11:2228e8931266 430
Jeonghoon 11:2228e8931266 431 template<typename Stream>
Jeonghoon 11:2228e8931266 432 inline static void write(Stream& stream, const VecType& v)
Jeonghoon 11:2228e8931266 433 {
Jeonghoon 11:2228e8931266 434 stream.next((uint32_t)v.size());
Jeonghoon 11:2228e8931266 435 ConstIteratorType it = v.begin();
Jeonghoon 11:2228e8931266 436 ConstIteratorType end = v.end();
Jeonghoon 11:2228e8931266 437 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 438 {
Jeonghoon 11:2228e8931266 439 stream.next(*it);
Jeonghoon 11:2228e8931266 440 }
Jeonghoon 11:2228e8931266 441 }
Jeonghoon 11:2228e8931266 442
Jeonghoon 11:2228e8931266 443 template<typename Stream>
Jeonghoon 11:2228e8931266 444 inline static void read(Stream& stream, VecType& v)
Jeonghoon 11:2228e8931266 445 {
Jeonghoon 11:2228e8931266 446 uint32_t len;
Jeonghoon 11:2228e8931266 447 stream.next(len);
Jeonghoon 11:2228e8931266 448 v.resize(len);
Jeonghoon 11:2228e8931266 449 IteratorType it = v.begin();
Jeonghoon 11:2228e8931266 450 IteratorType end = v.end();
Jeonghoon 11:2228e8931266 451 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 452 {
Jeonghoon 11:2228e8931266 453 stream.next(*it);
Jeonghoon 11:2228e8931266 454 }
Jeonghoon 11:2228e8931266 455 }
Jeonghoon 11:2228e8931266 456
Jeonghoon 11:2228e8931266 457 inline static uint32_t serializedLength(const VecType& v)
Jeonghoon 11:2228e8931266 458 {
Jeonghoon 11:2228e8931266 459 uint32_t size = 4;
Jeonghoon 11:2228e8931266 460 if (!v.empty())
Jeonghoon 11:2228e8931266 461 {
Jeonghoon 11:2228e8931266 462 uint32_t len_each = serializationLength(v.front());
Jeonghoon 11:2228e8931266 463 size += len_each * (uint32_t)v.size();
Jeonghoon 11:2228e8931266 464 }
Jeonghoon 11:2228e8931266 465
Jeonghoon 11:2228e8931266 466 return size;
Jeonghoon 11:2228e8931266 467 }
Jeonghoon 11:2228e8931266 468 };
Jeonghoon 11:2228e8931266 469
Jeonghoon 11:2228e8931266 470 /**
Jeonghoon 11:2228e8931266 471 * \brief serialize version for std::vector
Jeonghoon 11:2228e8931266 472 */
Jeonghoon 11:2228e8931266 473 template<typename T, class ContainerAllocator, typename Stream>
Jeonghoon 11:2228e8931266 474 inline void serialize(Stream& stream, const std::vector<T, ContainerAllocator>& t)
Jeonghoon 11:2228e8931266 475 {
Jeonghoon 11:2228e8931266 476 VectorSerializer<T, ContainerAllocator>::write(stream, t);
Jeonghoon 11:2228e8931266 477 }
Jeonghoon 11:2228e8931266 478
Jeonghoon 11:2228e8931266 479 /**
Jeonghoon 11:2228e8931266 480 * \brief deserialize version for std::vector
Jeonghoon 11:2228e8931266 481 */
Jeonghoon 11:2228e8931266 482 template<typename T, class ContainerAllocator, typename Stream>
Jeonghoon 11:2228e8931266 483 inline void deserialize(Stream& stream, std::vector<T, ContainerAllocator>& t)
Jeonghoon 11:2228e8931266 484 {
Jeonghoon 11:2228e8931266 485 VectorSerializer<T, ContainerAllocator>::read(stream, t);
Jeonghoon 11:2228e8931266 486 }
Jeonghoon 11:2228e8931266 487
Jeonghoon 11:2228e8931266 488 /**
Jeonghoon 11:2228e8931266 489 * \brief serializationLength version for std::vector
Jeonghoon 11:2228e8931266 490 */
Jeonghoon 11:2228e8931266 491 template<typename T, class ContainerAllocator>
Jeonghoon 11:2228e8931266 492 inline uint32_t serializationLength(const std::vector<T, ContainerAllocator>& t)
Jeonghoon 11:2228e8931266 493 {
Jeonghoon 11:2228e8931266 494 return VectorSerializer<T, ContainerAllocator>::serializedLength(t);
Jeonghoon 11:2228e8931266 495 }
Jeonghoon 11:2228e8931266 496
Jeonghoon 11:2228e8931266 497 /**
Jeonghoon 11:2228e8931266 498 * \brief Array serializer, default implementation does nothing
Jeonghoon 11:2228e8931266 499 */
Jeonghoon 11:2228e8931266 500 template<typename T, size_t N, class Enabled = void>
Jeonghoon 11:2228e8931266 501 struct ArraySerializer
Jeonghoon 11:2228e8931266 502 {};
Jeonghoon 11:2228e8931266 503
Jeonghoon 11:2228e8931266 504 /**
Jeonghoon 11:2228e8931266 505 * \brief Array serializer, specialized for non-fixed-size, non-simple types
Jeonghoon 11:2228e8931266 506 */
Jeonghoon 11:2228e8931266 507 template<typename T, size_t N>
Jeonghoon 11:2228e8931266 508 struct ArraySerializer<T, N, typename boost::disable_if<mt::IsFixedSize<T> >::type>
Jeonghoon 11:2228e8931266 509 {
Jeonghoon 11:2228e8931266 510 typedef boost::array<T, N > ArrayType;
Jeonghoon 11:2228e8931266 511 typedef typename ArrayType::iterator IteratorType;
Jeonghoon 11:2228e8931266 512 typedef typename ArrayType::const_iterator ConstIteratorType;
Jeonghoon 11:2228e8931266 513
Jeonghoon 11:2228e8931266 514 template<typename Stream>
Jeonghoon 11:2228e8931266 515 inline static void write(Stream& stream, const ArrayType& v)
Jeonghoon 11:2228e8931266 516 {
Jeonghoon 11:2228e8931266 517 ConstIteratorType it = v.begin();
Jeonghoon 11:2228e8931266 518 ConstIteratorType end = v.end();
Jeonghoon 11:2228e8931266 519 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 520 {
Jeonghoon 11:2228e8931266 521 stream.next(*it);
Jeonghoon 11:2228e8931266 522 }
Jeonghoon 11:2228e8931266 523 }
Jeonghoon 11:2228e8931266 524
Jeonghoon 11:2228e8931266 525 template<typename Stream>
Jeonghoon 11:2228e8931266 526 inline static void read(Stream& stream, ArrayType& v)
Jeonghoon 11:2228e8931266 527 {
Jeonghoon 11:2228e8931266 528 IteratorType it = v.begin();
Jeonghoon 11:2228e8931266 529 IteratorType end = v.end();
Jeonghoon 11:2228e8931266 530 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 531 {
Jeonghoon 11:2228e8931266 532 stream.next(*it);
Jeonghoon 11:2228e8931266 533 }
Jeonghoon 11:2228e8931266 534 }
Jeonghoon 11:2228e8931266 535
Jeonghoon 11:2228e8931266 536 inline static uint32_t serializedLength(const ArrayType& v)
Jeonghoon 11:2228e8931266 537 {
Jeonghoon 11:2228e8931266 538 uint32_t size = 0;
Jeonghoon 11:2228e8931266 539 ConstIteratorType it = v.begin();
Jeonghoon 11:2228e8931266 540 ConstIteratorType end = v.end();
Jeonghoon 11:2228e8931266 541 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 542 {
Jeonghoon 11:2228e8931266 543 size += serializationLength(*it);
Jeonghoon 11:2228e8931266 544 }
Jeonghoon 11:2228e8931266 545
Jeonghoon 11:2228e8931266 546 return size;
Jeonghoon 11:2228e8931266 547 }
Jeonghoon 11:2228e8931266 548 };
Jeonghoon 11:2228e8931266 549
Jeonghoon 11:2228e8931266 550 /**
Jeonghoon 11:2228e8931266 551 * \brief Array serializer, specialized for fixed-size, simple types
Jeonghoon 11:2228e8931266 552 */
Jeonghoon 11:2228e8931266 553 template<typename T, size_t N>
Jeonghoon 11:2228e8931266 554 struct ArraySerializer<T, N, typename boost::enable_if<mt::IsSimple<T> >::type>
Jeonghoon 11:2228e8931266 555 {
Jeonghoon 11:2228e8931266 556 typedef boost::array<T, N > ArrayType;
Jeonghoon 11:2228e8931266 557 typedef typename ArrayType::iterator IteratorType;
Jeonghoon 11:2228e8931266 558 typedef typename ArrayType::const_iterator ConstIteratorType;
Jeonghoon 11:2228e8931266 559
Jeonghoon 11:2228e8931266 560 template<typename Stream>
Jeonghoon 11:2228e8931266 561 inline static void write(Stream& stream, const ArrayType& v)
Jeonghoon 11:2228e8931266 562 {
Jeonghoon 11:2228e8931266 563 const uint32_t data_len = N * sizeof(T);
Jeonghoon 11:2228e8931266 564 memcpy(stream.advance(data_len), &v.front(), data_len);
Jeonghoon 11:2228e8931266 565 }
Jeonghoon 11:2228e8931266 566
Jeonghoon 11:2228e8931266 567 template<typename Stream>
Jeonghoon 11:2228e8931266 568 inline static void read(Stream& stream, ArrayType& v)
Jeonghoon 11:2228e8931266 569 {
Jeonghoon 11:2228e8931266 570 const uint32_t data_len = N * sizeof(T);
Jeonghoon 11:2228e8931266 571 memcpy(&v.front(), stream.advance(data_len), data_len);
Jeonghoon 11:2228e8931266 572 }
Jeonghoon 11:2228e8931266 573
Jeonghoon 11:2228e8931266 574 inline static uint32_t serializedLength(const ArrayType&)
Jeonghoon 11:2228e8931266 575 {
Jeonghoon 11:2228e8931266 576 return N * sizeof(T);
Jeonghoon 11:2228e8931266 577 }
Jeonghoon 11:2228e8931266 578 };
Jeonghoon 11:2228e8931266 579
Jeonghoon 11:2228e8931266 580 /**
Jeonghoon 11:2228e8931266 581 * \brief Array serializer, specialized for fixed-size, non-simple types
Jeonghoon 11:2228e8931266 582 */
Jeonghoon 11:2228e8931266 583 template<typename T, size_t N>
Jeonghoon 11:2228e8931266 584 struct ArraySerializer<T, N, typename boost::enable_if<mpl::and_<mt::IsFixedSize<T>, mpl::not_<mt::IsSimple<T> > > >::type>
Jeonghoon 11:2228e8931266 585 {
Jeonghoon 11:2228e8931266 586 typedef boost::array<T, N > ArrayType;
Jeonghoon 11:2228e8931266 587 typedef typename ArrayType::iterator IteratorType;
Jeonghoon 11:2228e8931266 588 typedef typename ArrayType::const_iterator ConstIteratorType;
Jeonghoon 11:2228e8931266 589
Jeonghoon 11:2228e8931266 590 template<typename Stream>
Jeonghoon 11:2228e8931266 591 inline static void write(Stream& stream, const ArrayType& v)
Jeonghoon 11:2228e8931266 592 {
Jeonghoon 11:2228e8931266 593 ConstIteratorType it = v.begin();
Jeonghoon 11:2228e8931266 594 ConstIteratorType end = v.end();
Jeonghoon 11:2228e8931266 595 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 596 {
Jeonghoon 11:2228e8931266 597 stream.next(*it);
Jeonghoon 11:2228e8931266 598 }
Jeonghoon 11:2228e8931266 599 }
Jeonghoon 11:2228e8931266 600
Jeonghoon 11:2228e8931266 601 template<typename Stream>
Jeonghoon 11:2228e8931266 602 inline static void read(Stream& stream, ArrayType& v)
Jeonghoon 11:2228e8931266 603 {
Jeonghoon 11:2228e8931266 604 IteratorType it = v.begin();
Jeonghoon 11:2228e8931266 605 IteratorType end = v.end();
Jeonghoon 11:2228e8931266 606 for (; it != end; ++it)
Jeonghoon 11:2228e8931266 607 {
Jeonghoon 11:2228e8931266 608 stream.next(*it);
Jeonghoon 11:2228e8931266 609 }
Jeonghoon 11:2228e8931266 610 }
Jeonghoon 11:2228e8931266 611
Jeonghoon 11:2228e8931266 612 inline static uint32_t serializedLength(const ArrayType& v)
Jeonghoon 11:2228e8931266 613 {
Jeonghoon 11:2228e8931266 614 return serializationLength(v.front()) * N;
Jeonghoon 11:2228e8931266 615 }
Jeonghoon 11:2228e8931266 616 };
Jeonghoon 11:2228e8931266 617
Jeonghoon 11:2228e8931266 618 /**
Jeonghoon 11:2228e8931266 619 * \brief serialize version for boost::array
Jeonghoon 11:2228e8931266 620 */
Jeonghoon 11:2228e8931266 621 template<typename T, size_t N, typename Stream>
Jeonghoon 11:2228e8931266 622 inline void serialize(Stream& stream, const boost::array<T, N>& t)
Jeonghoon 11:2228e8931266 623 {
Jeonghoon 11:2228e8931266 624 ArraySerializer<T, N>::write(stream, t);
Jeonghoon 11:2228e8931266 625 }
Jeonghoon 11:2228e8931266 626
Jeonghoon 11:2228e8931266 627 /**
Jeonghoon 11:2228e8931266 628 * \brief deserialize version for boost::array
Jeonghoon 11:2228e8931266 629 */
Jeonghoon 11:2228e8931266 630 template<typename T, size_t N, typename Stream>
Jeonghoon 11:2228e8931266 631 inline void deserialize(Stream& stream, boost::array<T, N>& t)
Jeonghoon 11:2228e8931266 632 {
Jeonghoon 11:2228e8931266 633 ArraySerializer<T, N>::read(stream, t);
Jeonghoon 11:2228e8931266 634 }
Jeonghoon 11:2228e8931266 635
Jeonghoon 11:2228e8931266 636 /**
Jeonghoon 11:2228e8931266 637 * \brief serializationLength version for boost::array
Jeonghoon 11:2228e8931266 638 */
Jeonghoon 11:2228e8931266 639 template<typename T, size_t N>
Jeonghoon 11:2228e8931266 640 inline uint32_t serializationLength(const boost::array<T, N>& t)
Jeonghoon 11:2228e8931266 641 {
Jeonghoon 11:2228e8931266 642 return ArraySerializer<T, N>::serializedLength(t);
Jeonghoon 11:2228e8931266 643 }
Jeonghoon 11:2228e8931266 644
Jeonghoon 11:2228e8931266 645 /**
Jeonghoon 11:2228e8931266 646 * \brief Enum
Jeonghoon 11:2228e8931266 647 */
Jeonghoon 11:2228e8931266 648 namespace stream_types
Jeonghoon 11:2228e8931266 649 {
Jeonghoon 11:2228e8931266 650 enum StreamType
Jeonghoon 11:2228e8931266 651 {
Jeonghoon 11:2228e8931266 652 Input,
Jeonghoon 11:2228e8931266 653 Output,
Jeonghoon 11:2228e8931266 654 Length
Jeonghoon 11:2228e8931266 655 };
Jeonghoon 11:2228e8931266 656 }
Jeonghoon 11:2228e8931266 657 typedef stream_types::StreamType StreamType;
Jeonghoon 11:2228e8931266 658
Jeonghoon 11:2228e8931266 659 /**
Jeonghoon 11:2228e8931266 660 * \brief Stream base-class, provides common functionality for IStream and OStream
Jeonghoon 11:2228e8931266 661 */
Jeonghoon 11:2228e8931266 662 struct ROSCPP_SERIALIZATION_DECL Stream
Jeonghoon 11:2228e8931266 663 {
Jeonghoon 11:2228e8931266 664 /*
Jeonghoon 11:2228e8931266 665 * \brief Returns a pointer to the current position of the stream
Jeonghoon 11:2228e8931266 666 */
Jeonghoon 11:2228e8931266 667 inline uint8_t* getData() { return data_; }
Jeonghoon 11:2228e8931266 668 /**
Jeonghoon 11:2228e8931266 669 * \brief Advances the stream, checking bounds, and returns a pointer to the position before it
Jeonghoon 11:2228e8931266 670 * was advanced.
Jeonghoon 11:2228e8931266 671 * \throws StreamOverrunException if len would take this stream past the end of its buffer
Jeonghoon 11:2228e8931266 672 */
Jeonghoon 11:2228e8931266 673 ROS_FORCE_INLINE uint8_t* advance(uint32_t len)
Jeonghoon 11:2228e8931266 674 {
Jeonghoon 11:2228e8931266 675 uint8_t* old_data = data_;
Jeonghoon 11:2228e8931266 676 data_ += len;
Jeonghoon 11:2228e8931266 677 if (data_ > end_)
Jeonghoon 11:2228e8931266 678 {
Jeonghoon 11:2228e8931266 679 // Throwing directly here causes a significant speed hit due to the extra code generated
Jeonghoon 11:2228e8931266 680 // for the throw statement
Jeonghoon 11:2228e8931266 681 throwStreamOverrun();
Jeonghoon 11:2228e8931266 682 }
Jeonghoon 11:2228e8931266 683 return old_data;
Jeonghoon 11:2228e8931266 684 }
Jeonghoon 11:2228e8931266 685
Jeonghoon 11:2228e8931266 686 /**
Jeonghoon 11:2228e8931266 687 * \brief Returns the amount of space left in the stream
Jeonghoon 11:2228e8931266 688 */
Jeonghoon 11:2228e8931266 689 inline uint32_t getLength() { return (uint32_t)(end_ - data_); }
Jeonghoon 11:2228e8931266 690
Jeonghoon 11:2228e8931266 691 protected:
Jeonghoon 11:2228e8931266 692 Stream(uint8_t* _data, uint32_t _count)
Jeonghoon 11:2228e8931266 693 : data_(_data)
Jeonghoon 11:2228e8931266 694 , end_(_data + _count)
Jeonghoon 11:2228e8931266 695 {}
Jeonghoon 11:2228e8931266 696
Jeonghoon 11:2228e8931266 697 private:
Jeonghoon 11:2228e8931266 698 uint8_t* data_;
Jeonghoon 11:2228e8931266 699 uint8_t* end_;
Jeonghoon 11:2228e8931266 700 };
Jeonghoon 11:2228e8931266 701
Jeonghoon 11:2228e8931266 702 /**
Jeonghoon 11:2228e8931266 703 * \brief Input stream
Jeonghoon 11:2228e8931266 704 */
Jeonghoon 11:2228e8931266 705 struct ROSCPP_SERIALIZATION_DECL IStream : public Stream
Jeonghoon 11:2228e8931266 706 {
Jeonghoon 11:2228e8931266 707 static const StreamType stream_type = stream_types::Input;
Jeonghoon 11:2228e8931266 708
Jeonghoon 11:2228e8931266 709 IStream(uint8_t* data, uint32_t count)
Jeonghoon 11:2228e8931266 710 : Stream(data, count)
Jeonghoon 11:2228e8931266 711 {}
Jeonghoon 11:2228e8931266 712
Jeonghoon 11:2228e8931266 713 /**
Jeonghoon 11:2228e8931266 714 * \brief Deserialize an item from this input stream
Jeonghoon 11:2228e8931266 715 */
Jeonghoon 11:2228e8931266 716 template<typename T>
Jeonghoon 11:2228e8931266 717 ROS_FORCE_INLINE void next(T& t)
Jeonghoon 11:2228e8931266 718 {
Jeonghoon 11:2228e8931266 719 deserialize(*this, t);
Jeonghoon 11:2228e8931266 720 }
Jeonghoon 11:2228e8931266 721
Jeonghoon 11:2228e8931266 722 template<typename T>
Jeonghoon 11:2228e8931266 723 ROS_FORCE_INLINE IStream& operator>>(T& t)
Jeonghoon 11:2228e8931266 724 {
Jeonghoon 11:2228e8931266 725 deserialize(*this, t);
Jeonghoon 11:2228e8931266 726 return *this;
Jeonghoon 11:2228e8931266 727 }
Jeonghoon 11:2228e8931266 728 };
Jeonghoon 11:2228e8931266 729
Jeonghoon 11:2228e8931266 730 /**
Jeonghoon 11:2228e8931266 731 * \brief Output stream
Jeonghoon 11:2228e8931266 732 */
Jeonghoon 11:2228e8931266 733 struct ROSCPP_SERIALIZATION_DECL OStream : public Stream
Jeonghoon 11:2228e8931266 734 {
Jeonghoon 11:2228e8931266 735 static const StreamType stream_type = stream_types::Output;
Jeonghoon 11:2228e8931266 736
Jeonghoon 11:2228e8931266 737 OStream(uint8_t* data, uint32_t count)
Jeonghoon 11:2228e8931266 738 : Stream(data, count)
Jeonghoon 11:2228e8931266 739 {}
Jeonghoon 11:2228e8931266 740
Jeonghoon 11:2228e8931266 741 /**
Jeonghoon 11:2228e8931266 742 * \brief Serialize an item to this output stream
Jeonghoon 11:2228e8931266 743 */
Jeonghoon 11:2228e8931266 744 template<typename T>
Jeonghoon 11:2228e8931266 745 ROS_FORCE_INLINE void next(const T& t)
Jeonghoon 11:2228e8931266 746 {
Jeonghoon 11:2228e8931266 747 serialize(*this, t);
Jeonghoon 11:2228e8931266 748 }
Jeonghoon 11:2228e8931266 749
Jeonghoon 11:2228e8931266 750 template<typename T>
Jeonghoon 11:2228e8931266 751 ROS_FORCE_INLINE OStream& operator<<(const T& t)
Jeonghoon 11:2228e8931266 752 {
Jeonghoon 11:2228e8931266 753 serialize(*this, t);
Jeonghoon 11:2228e8931266 754 return *this;
Jeonghoon 11:2228e8931266 755 }
Jeonghoon 11:2228e8931266 756 };
Jeonghoon 11:2228e8931266 757
Jeonghoon 11:2228e8931266 758
Jeonghoon 11:2228e8931266 759 /**
Jeonghoon 11:2228e8931266 760 * \brief Length stream
Jeonghoon 11:2228e8931266 761 *
Jeonghoon 11:2228e8931266 762 * LStream is not what you would normally think of as a stream, but it is used in order to support
Jeonghoon 11:2228e8931266 763 * allinone serializers.
Jeonghoon 11:2228e8931266 764 */
Jeonghoon 11:2228e8931266 765 struct ROSCPP_SERIALIZATION_DECL LStream
Jeonghoon 11:2228e8931266 766 {
Jeonghoon 11:2228e8931266 767 static const StreamType stream_type = stream_types::Length;
Jeonghoon 11:2228e8931266 768
Jeonghoon 11:2228e8931266 769 LStream()
Jeonghoon 11:2228e8931266 770 : count_(0)
Jeonghoon 11:2228e8931266 771 {}
Jeonghoon 11:2228e8931266 772
Jeonghoon 11:2228e8931266 773 /**
Jeonghoon 11:2228e8931266 774 * \brief Add the length of an item to this length stream
Jeonghoon 11:2228e8931266 775 */
Jeonghoon 11:2228e8931266 776 template<typename T>
Jeonghoon 11:2228e8931266 777 ROS_FORCE_INLINE void next(const T& t)
Jeonghoon 11:2228e8931266 778 {
Jeonghoon 11:2228e8931266 779 count_ += serializationLength(t);
Jeonghoon 11:2228e8931266 780 }
Jeonghoon 11:2228e8931266 781
Jeonghoon 11:2228e8931266 782 /**
Jeonghoon 11:2228e8931266 783 * \brief increment the length by len
Jeonghoon 11:2228e8931266 784 */
Jeonghoon 11:2228e8931266 785 ROS_FORCE_INLINE uint32_t advance(uint32_t len)
Jeonghoon 11:2228e8931266 786 {
Jeonghoon 11:2228e8931266 787 uint32_t old = count_;
Jeonghoon 11:2228e8931266 788 count_ += len;
Jeonghoon 11:2228e8931266 789 return old;
Jeonghoon 11:2228e8931266 790 }
Jeonghoon 11:2228e8931266 791
Jeonghoon 11:2228e8931266 792 /**
Jeonghoon 11:2228e8931266 793 * \brief Get the total length of this tream
Jeonghoon 11:2228e8931266 794 */
Jeonghoon 11:2228e8931266 795 inline uint32_t getLength() { return count_; }
Jeonghoon 11:2228e8931266 796
Jeonghoon 11:2228e8931266 797 private:
Jeonghoon 11:2228e8931266 798 uint32_t count_;
Jeonghoon 11:2228e8931266 799 };
Jeonghoon 11:2228e8931266 800
Jeonghoon 11:2228e8931266 801 /**
Jeonghoon 11:2228e8931266 802 * \brief Serialize a message
Jeonghoon 11:2228e8931266 803 */
Jeonghoon 11:2228e8931266 804 template<typename M>
Jeonghoon 11:2228e8931266 805 inline SerializedMessage serializeMessage(const M& message)
Jeonghoon 11:2228e8931266 806 {
Jeonghoon 11:2228e8931266 807 SerializedMessage m;
Jeonghoon 11:2228e8931266 808 uint32_t len = serializationLength(message);
Jeonghoon 11:2228e8931266 809 m.num_bytes = len + 4;
Jeonghoon 11:2228e8931266 810 m.buf.reset(new uint8_t[m.num_bytes]);
Jeonghoon 11:2228e8931266 811
Jeonghoon 11:2228e8931266 812 OStream s(m.buf.get(), (uint32_t)m.num_bytes);
Jeonghoon 11:2228e8931266 813 serialize(s, (uint32_t)m.num_bytes - 4);
Jeonghoon 11:2228e8931266 814 m.message_start = s.getData();
Jeonghoon 11:2228e8931266 815 serialize(s, message);
Jeonghoon 11:2228e8931266 816
Jeonghoon 11:2228e8931266 817 return m;
Jeonghoon 11:2228e8931266 818 }
Jeonghoon 11:2228e8931266 819
Jeonghoon 11:2228e8931266 820 /**
Jeonghoon 11:2228e8931266 821 * \brief Serialize a service response
Jeonghoon 11:2228e8931266 822 */
Jeonghoon 11:2228e8931266 823 template<typename M>
Jeonghoon 11:2228e8931266 824 inline SerializedMessage serializeServiceResponse(bool ok, const M& message)
Jeonghoon 11:2228e8931266 825 {
Jeonghoon 11:2228e8931266 826 SerializedMessage m;
Jeonghoon 11:2228e8931266 827
Jeonghoon 11:2228e8931266 828 if (ok)
Jeonghoon 11:2228e8931266 829 {
Jeonghoon 11:2228e8931266 830 uint32_t len = serializationLength(message);
Jeonghoon 11:2228e8931266 831 m.num_bytes = len + 5;
Jeonghoon 11:2228e8931266 832 m.buf.reset(new uint8_t[m.num_bytes]);
Jeonghoon 11:2228e8931266 833
Jeonghoon 11:2228e8931266 834 OStream s(m.buf.get(), (uint32_t)m.num_bytes);
Jeonghoon 11:2228e8931266 835 serialize(s, (uint8_t)ok);
Jeonghoon 11:2228e8931266 836 serialize(s, (uint32_t)m.num_bytes - 5);
Jeonghoon 11:2228e8931266 837 serialize(s, message);
Jeonghoon 11:2228e8931266 838 }
Jeonghoon 11:2228e8931266 839 else
Jeonghoon 11:2228e8931266 840 {
Jeonghoon 11:2228e8931266 841 uint32_t len = serializationLength(message);
Jeonghoon 11:2228e8931266 842 m.num_bytes = len + 1;
Jeonghoon 11:2228e8931266 843 m.buf.reset(new uint8_t[m.num_bytes]);
Jeonghoon 11:2228e8931266 844
Jeonghoon 11:2228e8931266 845 OStream s(m.buf.get(), (uint32_t)m.num_bytes);
Jeonghoon 11:2228e8931266 846 serialize(s, (uint8_t)ok);
Jeonghoon 11:2228e8931266 847 serialize(s, message);
Jeonghoon 11:2228e8931266 848 }
Jeonghoon 11:2228e8931266 849
Jeonghoon 11:2228e8931266 850 return m;
Jeonghoon 11:2228e8931266 851 }
Jeonghoon 11:2228e8931266 852
Jeonghoon 11:2228e8931266 853 /**
Jeonghoon 11:2228e8931266 854 * \brief Deserialize a message. If includes_length is true, skips the first 4 bytes
Jeonghoon 11:2228e8931266 855 */
Jeonghoon 11:2228e8931266 856 template<typename M>
Jeonghoon 11:2228e8931266 857 inline void deserializeMessage(const SerializedMessage& m, M& message)
Jeonghoon 11:2228e8931266 858 {
Jeonghoon 11:2228e8931266 859 IStream s(m.message_start, m.num_bytes - (m.message_start - m.buf.get()));
Jeonghoon 11:2228e8931266 860 deserialize(s, message);
Jeonghoon 11:2228e8931266 861 }
Jeonghoon 11:2228e8931266 862
Jeonghoon 11:2228e8931266 863
Jeonghoon 11:2228e8931266 864 // Additional serialization traits
Jeonghoon 11:2228e8931266 865
Jeonghoon 11:2228e8931266 866 template<typename M>
Jeonghoon 11:2228e8931266 867 struct PreDeserializeParams
Jeonghoon 11:2228e8931266 868 {
Jeonghoon 11:2228e8931266 869 boost::shared_ptr<M> message;
Jeonghoon 11:2228e8931266 870 boost::shared_ptr<std::map<std::string, std::string> > connection_header;
Jeonghoon 11:2228e8931266 871 };
Jeonghoon 11:2228e8931266 872
Jeonghoon 11:2228e8931266 873 /**
Jeonghoon 11:2228e8931266 874 * \brief called by the SubscriptionCallbackHelper after a message is
Jeonghoon 11:2228e8931266 875 * instantiated but before that message is deserialized
Jeonghoon 11:2228e8931266 876 */
Jeonghoon 11:2228e8931266 877 template<typename M>
Jeonghoon 11:2228e8931266 878 struct PreDeserialize
Jeonghoon 11:2228e8931266 879 {
Jeonghoon 11:2228e8931266 880 static void notify(const PreDeserializeParams<M>&) { }
Jeonghoon 11:2228e8931266 881 };
Jeonghoon 11:2228e8931266 882
Jeonghoon 11:2228e8931266 883 } // namespace serialization
Jeonghoon 11:2228e8931266 884
Jeonghoon 11:2228e8931266 885 } // namespace ros
Jeonghoon 11:2228e8931266 886
Jeonghoon 11:2228e8931266 887 #endif // ROSCPP_SERIALIZATION_H