PackBuf.h

00001 /*  _________________________________________________________________________
00002  *
00003  *  UTILIB: A utility library for developing portable C++ codes.
00004  *  Copyright (c) 2001, Sandia National Laboratories.
00005  *  This software is distributed under the GNU Lesser General Public License.
00006  *  For more information, see the README file in the top UTILIB directory.
00007  *  _________________________________________________________________________
00008  */
00009 
00010 //
00011 // PackBuf.h
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 // PackBuffer
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 // UnPackBuffer
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 // PackSize
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