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 CSTREAM_H
00029 #define CSTREAM_H
00030
00031 #include <mrpt/utils/utils_defs.h>
00032 #include <mrpt/utils/CUncopiable.h>
00033
00034 namespace mrpt
00035 {
00036 namespace utils
00037 {
00038 class MRPTDLLIMPEXP CSerializable;
00039 struct MRPTDLLIMPEXP TRuntimeClassId;
00040
00042 typedef stlplus::smart_ptr_clone<CSerializable> CSerializablePtr;
00043
00044
00055 class MRPTDLLIMPEXP CStream
00056 {
00057 public:
00060 enum TSeekOrigin
00061 {
00062 sFromBeginning = 0,
00063 sFromCurrent = 1,
00064 sFromEnd = 2
00065 };
00066
00067 protected:
00070 virtual size_t Read(void *Buffer, size_t Count) = 0;
00071
00075 virtual size_t Write(const void *Buffer, size_t Count) = 0;
00076 public:
00077
00078
00079 CStream() { }
00080
00081
00082
00083 virtual ~CStream();
00084
00088 size_t ReadBuffer(void *Buffer, size_t Count);
00089
00093 void WriteBuffer (const void *Buffer, size_t Count);
00094
00097 size_t CopyFrom(CStream* Source, size_t Count);
00098
00106 virtual size_t Seek(long Offset, CStream::TSeekOrigin Origin = sFromBeginning) = 0;
00107
00110 virtual size_t getTotalBytesCount() = 0;
00111
00114 virtual size_t getPosition() =0;
00115
00116
00119 CStream& operator << (const CSerializablePtr& pObj);
00122 CStream& operator << (const CSerializable &obj);
00123
00126 CStream& operator >> (CSerializablePtr &pObj);
00127
00130 CStream& operator >> (CSerializable &obj);
00131
00132
00135 void WriteObject( const CSerializable *o );
00136
00140 CSerializablePtr ReadObject();
00141
00146 void ReadObject(CSerializable *existingObj);
00147
00151 virtual void printf(const char *fmt,...) MRPT_printf_format_check(2,3);
00152
00154 template <typename T>
00155 void printf_vector(const char *fmt, const std::vector<T> &V )
00156 {
00157 this->printf("[");
00158 size_t N = V.size();
00159 for (size_t i=0;i<N;i++)
00160 {
00161 this->printf(fmt,V[i]);
00162 if (i!=(N-1)) this->printf(",");
00163 }
00164 this->printf("]");
00165 }
00166
00167 };
00168
00169
00170
00171 #define DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( T ) \
00172 MRPTDLLIMPEXP CStream& operator<<(CStream&out, const T &a); \
00173 MRPTDLLIMPEXP CStream& operator>>(CStream&in, T &a);
00174
00175
00176 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( bool )
00177 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( uint8_t )
00178 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( int8_t )
00179 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( uint16_t )
00180 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( int16_t )
00181 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( uint32_t )
00182 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( int32_t )
00183 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( uint64_t )
00184 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( int64_t )
00185 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( float )
00186 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( double )
00187 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( long double )
00188
00189
00190 MRPTDLLIMPEXP CStream& operator << (CStream&, const char *a);
00191 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_int &a);
00192 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_uint &a);
00193 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_word &a);
00194 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_long &a);
00195 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_float &a);
00196 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_double &a);
00197 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_byte &a);
00198 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_bool &a);
00199 MRPTDLLIMPEXP CStream& operator << (CStream&, const std::string &str);
00200
00201 MRPTDLLIMPEXP CStream& operator>>(CStream&in, char *a);
00202 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_int &a);
00203 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_uint &a);
00204 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_word &a);
00205 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_long &a);
00206 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_double &a);
00207 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_float &a);
00208 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_byte &a);
00209 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_bool &a);
00210 MRPTDLLIMPEXP CStream& operator>>(CStream&in, std::string &str);
00211
00212
00214 template <typename T>
00215 void printf_vector(const char *fmt, const std::vector<T> &V )
00216 {
00217 std::cout << "[";
00218 size_t N = V.size();
00219 for (size_t i=0;i<N;i++)
00220 {
00221 std::cout << format(fmt,V[i]);
00222 if (i!=(N-1)) std::cout << ",";
00223 }
00224 std::cout << "]";
00225 }
00226
00227 }
00228 }
00229
00230 #endif