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