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 #include <mrpt/utils/exceptions.h>
00034
00035 namespace mrpt
00036 {
00037 namespace utils
00038 {
00039 class MRPTDLLIMPEXP CSerializable;
00040 struct MRPTDLLIMPEXP TRuntimeClassId;
00041
00042
00043 typedef stlplus::smart_ptr_clone<CSerializable> CSerializablePtr;
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 class MRPTDLLIMPEXP CStream
00057 {
00058 public:
00059
00060
00061 enum TSeekOrigin
00062 {
00063 sFromBeginning = 0,
00064 sFromCurrent = 1,
00065 sFromEnd = 2
00066 };
00067
00068 protected:
00069
00070
00071 virtual size_t Read(void *Buffer, size_t Count) = 0;
00072
00073
00074
00075
00076 virtual size_t Write(const void *Buffer, size_t Count) = 0;
00077 public:
00078
00079
00080 CStream() { }
00081
00082
00083
00084 virtual ~CStream();
00085
00086
00087
00088
00089 size_t ReadBuffer(void *Buffer, size_t Count);
00090
00091
00092
00093
00094 void WriteBuffer (const void *Buffer, size_t Count);
00095
00096
00097
00098 size_t CopyFrom(CStream* Source, size_t Count);
00099
00100
00101
00102
00103
00104
00105
00106
00107 virtual size_t Seek(long Offset, CStream::TSeekOrigin Origin = sFromBeginning) = 0;
00108
00109
00110
00111 virtual size_t getTotalBytesCount() = 0;
00112
00113
00114
00115 virtual size_t getPosition() =0;
00116
00117
00118
00119
00120 CStream& operator << (const CSerializablePtr& pObj);
00121
00122
00123 CStream& operator << (const CSerializable &obj);
00124
00125
00126
00127 CStream& operator >> (CSerializablePtr &pObj);
00128
00129
00130
00131 CStream& operator >> (CSerializable &obj);
00132
00133
00134
00135
00136 void WriteObject( const CSerializable *o );
00137
00138
00139
00140
00141
00142 CSerializablePtr ReadObject();
00143
00144
00145
00146
00147
00148
00149 void ReadObject(CSerializable *existingObj);
00150
00151
00152
00153
00154 virtual int printf(const char *fmt,...) MRPT_printf_format_check(2,3);
00155
00156
00157 template <typename T>
00158 void printf_vector(const char *fmt, const std::vector<T> &V )
00159 {
00160 this->printf("[");
00161 size_t N = V.size();
00162 for (size_t i=0;i<N;i++)
00163 {
00164 this->printf(fmt,V[i]);
00165 if (i!=(N-1)) this->printf(",");
00166 }
00167 this->printf("]");
00168 }
00169
00170 };
00171
00172
00173
00174 #define DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( T ) \
00175 MRPTDLLIMPEXP CStream& operator<<(CStream&out, const T &a); \
00176 MRPTDLLIMPEXP CStream& operator>>(CStream&in, T &a);
00177
00178
00179 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( bool )
00180 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( uint8_t )
00181 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( int8_t )
00182 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( uint16_t )
00183 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( int16_t )
00184 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( uint32_t )
00185 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( int32_t )
00186 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( uint64_t )
00187 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( int64_t )
00188 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( float )
00189 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( double )
00190 DECLARE_CSTREAM_READ_WRITE_SIMPLE_TYPE( long double )
00191
00192
00193 MRPTDLLIMPEXP CStream& operator << (CStream&, const char *a);
00194 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_int &a);
00195 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_uint &a);
00196 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_word &a);
00197 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_long &a);
00198 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_float &a);
00199 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_double &a);
00200 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_byte &a);
00201 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_bool &a);
00202 MRPTDLLIMPEXP CStream& operator << (CStream&, const std::string &str);
00203
00204 MRPTDLLIMPEXP CStream& operator>>(CStream&in, char *a);
00205 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_int &a);
00206 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_uint &a);
00207 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_word &a);
00208 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_long &a);
00209 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_double &a);
00210 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_float &a);
00211 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_byte &a);
00212 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_bool &a);
00213 MRPTDLLIMPEXP CStream& operator>>(CStream&in, std::string &str);
00214
00215
00216
00217 template <typename T>
00218 void printf_vector(const char *fmt, const std::vector<T> &V )
00219 {
00220 std::cout << "[";
00221 size_t N = V.size();
00222 for (size_t i=0;i<N;i++)
00223 {
00224 std::cout << format(fmt,V[i]);
00225 if (i!=(N-1)) std::cout << ",";
00226 }
00227 std::cout << "]";
00228 }
00229
00230 }
00231 }
00232
00233 #endif