00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CSERIALIZABLE_H
00029 #define CSERIALIZABLE_H
00030
00031 #include <mrpt/utils/CObject.h>
00032 #include <mrpt/utils/CStream.h>
00033 #include <mrpt/utils/safe_pointers.h>
00034
00035 namespace mrpt
00036 {
00037
00038
00039 namespace utils
00040 {
00041 DEFINE_MRPT_OBJECT_PRE( CSerializable )
00042
00043
00044
00045
00046
00047
00048 class BASE_IMPEXP CSerializable : public mrpt::utils::CObject
00049 {
00050
00051 DEFINE_VIRTUAL_MRPT_OBJECT( CSerializable )
00052
00053 virtual ~CSerializable() { }
00054
00055 protected:
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 virtual void writeToStream(mrpt::utils::CStream &out, int *getVersion) const = 0;
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 virtual void readFromStream(mrpt::utils::CStream &in, int version) = 0;
00080 };
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 std::string BASE_IMPEXP ObjectToString(const CSerializable *o);
00092
00093
00094
00095
00096
00097
00098
00099 void BASE_IMPEXP StringToObject(const std::string &str, CSerializablePtr &obj);
00100
00101
00102
00103
00104
00105
00106 void BASE_IMPEXP ObjectToOctetVector(const CSerializable *o, vector_byte & out_vector);
00107
00108
00109
00110
00111
00112
00113
00114 void BASE_IMPEXP OctetVectorToObject(const vector_byte & in_data, CSerializablePtr &obj);
00115
00116
00117
00118
00119
00120
00121
00122 void BASE_IMPEXP ObjectToRawString(const CSerializable *o, std::string & out_str);
00123
00124
00125
00126
00127
00128
00129
00130 void BASE_IMPEXP RawStringToObject(const std::string & in_str, CSerializablePtr &obj);
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149 template<typename T>
00150 struct TTypeName
00151 {
00152 static std::string get() {
00153 return std::string( T::classinfo->className );
00154 }
00155 };
00156
00157 #define MRPT_DECLARE_TTYPENAME(_TYPE) \
00158 template<> struct TTypeName <_TYPE > { \
00159 static std::string get() { return std::string(#_TYPE); } };
00160
00161 #define MRPT_DECLARE_TTYPENAME_PTR(_TYPE) \
00162 template<> struct TTypeName <_TYPE##Ptr> { \
00163 static std::string get() { return TTypeName<_TYPE>::get(); } };
00164
00165 MRPT_DECLARE_TTYPENAME(bool)
00166 MRPT_DECLARE_TTYPENAME(double)
00167 MRPT_DECLARE_TTYPENAME(float)
00168 MRPT_DECLARE_TTYPENAME(uint64_t)
00169 MRPT_DECLARE_TTYPENAME(int64_t)
00170 MRPT_DECLARE_TTYPENAME(uint32_t)
00171 MRPT_DECLARE_TTYPENAME(int32_t)
00172 MRPT_DECLARE_TTYPENAME(uint16_t)
00173 MRPT_DECLARE_TTYPENAME(int16_t)
00174 MRPT_DECLARE_TTYPENAME(uint8_t)
00175 MRPT_DECLARE_TTYPENAME(int8_t)
00176
00177 MRPT_DECLARE_TTYPENAME(std::string)
00178
00179
00180 #define MRPT_DECLARE_TTYPENAME_CONTAINER(_CONTAINER) \
00181 template< typename V > \
00182 struct TTypeName <_CONTAINER<V> > { \
00183 static std::string get() { \
00184 return std::string( #_CONTAINER )+std::string("<")+std::string( TTypeName<V>::get() ) + std::string(">"); \
00185 } \
00186 };
00187
00188 MRPT_DECLARE_TTYPENAME_CONTAINER( std::vector )
00189 MRPT_DECLARE_TTYPENAME_CONTAINER( std::deque )
00190 MRPT_DECLARE_TTYPENAME_CONTAINER( std::list )
00191 MRPT_DECLARE_TTYPENAME_CONTAINER( std::set )
00192
00193
00194 #define MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(_CONT) \
00195 template<> struct TTypeName <_CONT> : TTypeName<std::vector<_CONT::value_type> > { };
00196
00197 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_signed_byte )
00198 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_signed_word)
00199 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_int)
00200 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_long)
00201 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_float)
00202 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_double)
00203 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_byte)
00204 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_word)
00205 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_uint)
00206
00207 #if MRPT_WORD_SIZE!=32 // If it's 32 bit, size_t <=> uint32_t
00208 MRPT_DECLARE_TTYPENAME_MAP_FOR_VECTOR(vector_size_t)
00209 #endif
00210
00211
00212 #define MRPT_DECLARE_TTYPENAME_CONTAINER_ASSOC(_CONTAINER) \
00213 template< typename K, typename V > \
00214 struct TTypeName <_CONTAINER<K,V> > { \
00215 static std::string get() { \
00216 return std::string( #_CONTAINER )+std::string("<")+std::string( TTypeName<K>::get() )+ std::string(",")+std::string( TTypeName<V>::get() )+std::string(">"); \
00217 } \
00218 };
00219
00220 MRPT_DECLARE_TTYPENAME_CONTAINER_ASSOC( std::map )
00221 MRPT_DECLARE_TTYPENAME_CONTAINER_ASSOC( std::multimap )
00222
00223
00224 template< typename T1, typename T2 >
00225 struct TTypeName <std::pair<T1,T2> > {
00226 static std::string get() {
00227 return std::string("std::pair<")+std::string( TTypeName<T1>::get() )+ std::string(",")+std::string( TTypeName<T2>::get() )+std::string(">");
00228 }
00229 };
00230
00231
00232
00233
00234
00235
00236 #define DEFINE_SERIALIZABLE(class_name) \
00237 DEFINE_MRPT_OBJECT(class_name) \
00238 protected: \
00239 void writeToStream(mrpt::utils::CStream &out, int *getVersion) const;\
00240 void readFromStream(mrpt::utils::CStream &in, int version);
00241
00242
00243
00244 #define DEFINE_SERIALIZABLE_PRE_CUSTOM_LINKAGE(class_name,_LINKAGE_) \
00245 DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE2(class_name,_LINKAGE_ class_name) \
00246 _LINKAGE_ ::mrpt::utils::CStream& operator>>(mrpt::utils::CStream& in, class_name##Ptr &pObj);
00247
00248
00249
00250
00251 #define DEFINE_SERIALIZABLE_PRE(class_name) \
00252 DEFINE_SERIALIZABLE_PRE_CUSTOM_LINKAGE(class_name, BASE_IMPEXP )
00253
00254
00255
00256 #define DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE_LINKAGE(class_name, base_name, _LINKAGE_ ) \
00257 DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE2(class_name, base_name, _LINKAGE_ class_name) \
00258 _LINKAGE_ ::mrpt::utils::CStream& operator>>(mrpt::utils::CStream& in, class_name##Ptr &pObj);
00259
00260
00261
00262
00263 #define DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE(class_name, base_name) \
00264 DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE(class_name, base_name, BASE_IMPEXP ) \
00265 BASE_IMPEXP ::mrpt::utils::CStream& operator>>(mrpt::utils::CStream& in, class_name##Ptr &pObj);
00266
00267
00268
00269 #define IMPLEMENTS_SERIALIZABLE(class_name, base,NameSpace) \
00270 IMPLEMENTS_MRPT_OBJECT(class_name, base,NameSpace) \
00271 mrpt::utils::CStream& NameSpace::operator>>(mrpt::utils::CStream& in, NameSpace::class_name##Ptr &pObj) \
00272 { pObj = NameSpace::class_name##Ptr( in.ReadObject() ); return in; }
00273
00274
00275
00276 #define DEFINE_VIRTUAL_SERIALIZABLE(class_name) \
00277 DEFINE_VIRTUAL_MRPT_OBJECT(class_name)
00278
00279
00280
00281
00282 #define IMPLEMENTS_VIRTUAL_SERIALIZABLE(class_name, base_class_name,NameSpace) \
00283 IMPLEMENTS_VIRTUAL_MRPT_OBJECT(class_name, base_class_name,NameSpace) \
00284 mrpt::utils::CStream& NameSpace::operator>>(mrpt::utils::CStream& in, class_name##Ptr &pObj) \
00285 { pObj = class_name##Ptr( in.ReadObject() ); return in; }
00286
00287
00288 }
00289 }
00290
00291 #endif