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
00194
00195
00196
00197 MRPTDLLIMPEXP CStream& operator << (CStream&, const char *a);
00198 MRPTDLLIMPEXP CStream& operator << (CStream&, const std::string &str);
00199
00200 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_int &a);
00201 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_uint &a);
00202 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_word &a);
00203 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_signed_word &a);
00204 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_long &a);
00205 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_float &a);
00206 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_double &a);
00207 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_byte &a);
00208 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_signed_byte &a);
00209 MRPTDLLIMPEXP CStream& operator << (CStream&, const vector_bool &a);
00210
00211 MRPTDLLIMPEXP CStream& operator>>(CStream&in, char *a);
00212 MRPTDLLIMPEXP CStream& operator>>(CStream&in, std::string &str);
00213 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_int &a);
00214 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_uint &a);
00215 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_word &a);
00216 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_signed_word &a);
00217 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_long &a);
00218 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_double &a);
00219 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_float &a);
00220 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_byte &a);
00221 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_signed_byte &a);
00222 MRPTDLLIMPEXP CStream& operator>>(CStream&in, vector_bool &a);
00223 MRPTDLLIMPEXP CStream &operator<<(CStream &,const std::vector<std::string> &);
00224 MRPTDLLIMPEXP CStream &operator>>(CStream &,std::vector<std::string> &);
00225
00226 }
00227 }
00228
00229 #endif