00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00029 #ifndef __PackBuf_h
00030 #define __PackBuf_h
00031
00032 #ifdef __GNUC__
00033 #pragma interface
00034 #endif
00035
00036 #include "utilib_dll.h"
00037
00038 typedef unsigned char unsigned_char;
00039 typedef unsigned short unsigned_short;
00040 typedef unsigned int unsigned_int;
00041 typedef unsigned long unsigned_long;
00042
00043
00044
00045
00046
00047
00048
00049
00050 class UTILIB_API PackBuffer {
00051
00052 public:
00053
00055 PackBuffer(int size_=1024) {index=0; size=size_; buffer = new char [size_];}
00057 ~PackBuffer() {if (buffer) delete buffer;}
00058
00060 const char* buf() {return buffer;}
00062 int len() {return index;}
00064 void reset() {index=0;}
00065
00067 void pack(const int* data, const int num=1);
00069 void pack(const unsigned_int* data, const int num=1);
00071 void pack(const long* data, const int num=1);
00073 void pack(const unsigned_long* data, const int num=1);
00075 void pack(const short* data, const int num=1);
00077 void pack(const unsigned_short* data, const int num=1);
00079 void pack(const char* data, const int num=1);
00081 void pack(const unsigned_char* data, const int num=1);
00083 void pack(const double* data, const int num=1);
00085 void pack(const float* data, const int num=1);
00087 void pack(const bool* data, const int num=1);
00088
00090 void pack(const int data) {pack(&data);}
00092 void pack(const unsigned_int data) {pack(&data);}
00094 void pack(const long data) {pack(&data);}
00096 void pack(const unsigned_long data) {pack(&data);}
00098 void pack(const short data) {pack(&data);}
00100 void pack(const unsigned_short data) {pack(&data);}
00102 void pack(const char data) {pack(&data);}
00104 void pack(const unsigned_char data) {pack(&data);}
00106 void pack(const double data) {pack(&data);}
00108 void pack(const float data) {pack(&data);}
00110 void pack(const bool data) {pack(&data);}
00111
00112 protected:
00113
00115 char* buffer;
00117 int index;
00119 int size;
00121 void resize(const int newsize);
00122
00123 };
00124
00125
00126
00127 inline PackBuffer& operator<< (PackBuffer& buff, const int data)
00128 {buff.pack(data); return buff;}
00129 inline PackBuffer& operator<< (PackBuffer& buff, const unsigned_int data)
00130 {buff.pack(data); return buff;}
00131 inline PackBuffer& operator<< (PackBuffer& buff, const long data)
00132 {buff.pack(data); return buff;}
00133 inline PackBuffer& operator<< (PackBuffer& buff, const unsigned_long data)
00134 {buff.pack(data); return buff;}
00135 inline PackBuffer& operator<< (PackBuffer& buff, const short data)
00136 {buff.pack(data); return buff;}
00137 inline PackBuffer& operator<< (PackBuffer& buff, const unsigned_short data)
00138 {buff.pack(data); return buff;}
00139 inline PackBuffer& operator<< (PackBuffer& buff, const char data)
00140 {buff.pack(data); return buff;}
00141 inline PackBuffer& operator<< (PackBuffer& buff, const unsigned_char data)
00142 {buff.pack(data); return buff;}
00143 inline PackBuffer& operator<< (PackBuffer& buff, const double data)
00144 {buff.pack(data); return buff;}
00145 inline PackBuffer& operator<< (PackBuffer& buff, const float data)
00146 {buff.pack(data); return buff;}
00147 inline PackBuffer& operator<< (PackBuffer& buff, const bool data)
00148 {buff.pack(data); return buff;}
00149
00150
00151
00152
00153
00154
00155
00156
00157 class UTILIB_API UnPackBuffer {
00158
00159 public:
00160
00162 void setup(char* buf_, int size_, int flag=0);
00163
00165 UnPackBuffer() : buffer(0), own_flag(0)
00166 {setup(0,0,0);}
00168 UnPackBuffer(int size_) : buffer(0), own_flag(0)
00169 {setup(new char [size_],size_,1);}
00171 UnPackBuffer(char* buf_, int size_, int flag=0) : buffer(0), own_flag(0)
00172 {setup(buf_,size_,flag);}
00174 ~UnPackBuffer() {if (buffer && own_flag) delete buffer;}
00175
00177 void resize(const int newsize);
00179 const char* buf() {return buffer;}
00181 int len() {return size;}
00183 int curr() {return index;}
00185 void reset() {index=0;}
00186
00188 void unpack(int* data, const int num=1);
00190 void unpack(unsigned_int* data, const int num=1);
00192 void unpack(long* data, const int num=1);
00194 void unpack(unsigned_long* data, const int num=1);
00196 void unpack(short* data, const int num=1);
00198 void unpack(unsigned_short* data, const int num=1);
00200 void unpack(char* data, const int num=1);
00202 void unpack(unsigned_char* data, const int num=1);
00204 void unpack(double* data, const int num=1);
00206 void unpack(float* data, const int num=1);
00208 void unpack(bool* data, const int num=1);
00209
00211 void unpack(int& data) {unpack(&data);}
00213 void unpack(unsigned_int& data) {unpack(&data);}
00215 void unpack(long& data) {unpack(&data);}
00217 void unpack(unsigned_long& data) {unpack(&data);}
00219 void unpack(short& data) {unpack(&data);}
00221 void unpack(unsigned_short& data) {unpack(&data);}
00223 void unpack(char& data) {unpack(&data);}
00225 void unpack(unsigned_char& data) {unpack(&data);}
00227 void unpack(double& data) {unpack(&data);}
00229 void unpack(float& data) {unpack(&data);}
00231 void unpack(bool& data) {unpack(&data);}
00232
00233 protected:
00234
00236 char* buffer;
00238 int index;
00240 int size;
00242 int own_flag;
00243
00244 };
00245
00246
00247
00248 inline UnPackBuffer& operator>> (UnPackBuffer& buff, int& data)
00249 {buff.unpack(data); return buff;}
00250 inline UnPackBuffer& operator>> (UnPackBuffer& buff, unsigned_int& data)
00251 {buff.unpack(data); return buff;}
00252 inline UnPackBuffer& operator>> (UnPackBuffer& buff, long& data)
00253 {buff.unpack(data); return buff;}
00254 inline UnPackBuffer& operator>> (UnPackBuffer& buff, unsigned_long& data)
00255 {buff.unpack(data); return buff;}
00256 inline UnPackBuffer& operator>> (UnPackBuffer& buff, short& data)
00257 {buff.unpack(data); return buff;}
00258 inline UnPackBuffer& operator>> (UnPackBuffer& buff, unsigned_short& data)
00259 {buff.unpack(data); return buff;}
00260 inline UnPackBuffer& operator>> (UnPackBuffer& buff, char& data)
00261 {buff.unpack(data); return buff;}
00262 inline UnPackBuffer& operator>> (UnPackBuffer& buff, unsigned_char& data)
00263 {buff.unpack(data); return buff;}
00264 inline UnPackBuffer& operator>> (UnPackBuffer& buff, double& data)
00265 {buff.unpack(data); return buff;}
00266 inline UnPackBuffer& operator>> (UnPackBuffer& buff, float& data)
00267 {buff.unpack(data); return buff;}
00268 inline UnPackBuffer& operator>> (UnPackBuffer& buff, bool& data)
00269 {buff.unpack(data); return buff;}
00270
00271
00272
00273
00274
00275
00276
00277
00278 int PackSize(const int& data, const int num=1);
00279 int PackSize(const unsigned_int& data, const int num=1);
00280 int PackSize(const long& data, const int num=1);
00281 int PackSize(const unsigned_long& data, const int num=1);
00282 int PackSize(const short& data, const int num=1);
00283 int PackSize(const unsigned_short& data, const int num=1);
00284 int PackSize(const char& data, const int num=1);
00285 int PackSize(const unsigned_char& data, const int num=1);
00286 int PackSize(const double& data, const int num=1);
00287 int PackSize(const float& data, const int num=1);
00288 int PackSize(const bool& data, const int num=1);
00289
00290
00291 #endif // __PackBuf_h