add pup support
[charm.git] / src / util / pup.h
index 9b8d18a34d9c1b091cf8c83d3349c1947760741c..1a16fb7f366e2d3cbe887fbe020c76e3017b80b9 100644 (file)
@@ -151,6 +151,7 @@ class er {
   enum {IS_SIZING   =0x0100,
        IS_PACKING  =0x0200,
         IS_UNPACKING=0x0400,
+       IS_CHECKING=0x0800,  // If set, it is checking the match of 2 checkpoints
         TYPE_MASK   =0xFF00
   };
   unsigned int PUP_er_state;
@@ -165,6 +166,7 @@ class er {
   CmiBool isSizing(void) const {return (PUP_er_state&IS_SIZING)!=0?CmiTrue:CmiFalse;}
   CmiBool isPacking(void) const {return (PUP_er_state&IS_PACKING)!=0?CmiTrue:CmiFalse;}
   CmiBool isUnpacking(void) const {return (PUP_er_state&IS_UNPACKING)!=0?CmiTrue:CmiFalse;}
+  CmiBool isChecking(void) const {return (PUP_er_state&IS_CHECKING)!=0?CmiTrue:CmiFalse;}
   const char *  typeString() const;
   unsigned int getStateFlags(void) const {return PUP_er_state;}
 
@@ -216,7 +218,10 @@ class er {
     {bytes((void *)a,nItems,sizeof(signed char),Tchar);}
 #if CMK_SIGNEDCHAR_DIFF_CHAR
   void operator()(char *a,int nItems)
-    {bytes((void *)a,nItems,sizeof(char),Tchar);}
+    {
+               //printf("pup char data\n");
+               bytes((void *)a,nItems,sizeof(char),Tchar);
+       }
 #endif
   void operator()(short *a,int nItems)
     {bytes((void *)a,nItems,sizeof(short),Tshort);}
@@ -239,7 +244,9 @@ class er {
   void operator()(float *a,int nItems)
     {bytes((void *)a,nItems,sizeof(float),Tfloat);}
   void operator()(double *a,int nItems)
-    {bytes((void *)a,nItems,sizeof(double),Tdouble);}
+    {
+               bytes((void *)a,nItems,sizeof(double),Tdouble);
+       }
 
 #if CMK_LONG_DOUBLE_DEFINED
   void operator()(long double *a,int nItems)
@@ -308,6 +315,11 @@ class er {
 
   virtual int size(void) const { return 0; }
   
+  virtual void setAccuracy(double _accuracy){}
+  virtual void skipNext(){}
+  virtual void skip(){}
+  virtual void resume(){}
+
   //For seeking (pack/unpack in different orders)
   virtual void impl_startSeek(seekBlock &s); /*Begin a seeking block*/
   virtual int impl_tell(seekBlock &s); /*Give the current offset*/
@@ -396,6 +408,37 @@ class mem : public er { //Memory-buffer packers and unpackers
   int size(void) const {return buf-origBuf;}
 };
 
+class checker : public er {
+ protected:
+  virtual void bytes(void *p,int n,size_t itemSize,dataType t);
+  myByte * origBuf;
+  myByte * buf;
+  double accuracy;
+  bool _skip;
+  bool result;
+  bool reset;
+ public:
+       checker(void * Abuf, void * Bbuf):er(IS_CHECKING),origBuf((myByte *)Abuf),buf((myByte *)Bbuf),_skip(false),accuracy(0.0),result(true),reset(false) {}
+       virtual void setAccuracy(double _accuracy) {
+               accuracy = _accuracy;
+               //printf("set accuracy %lf\n",accuracy);
+       }
+       virtual void skipNext() {
+               _skip = true;
+               reset = true;
+               //printf("skip\n");
+       }
+       virtual void skip() {
+               _skip = true;
+               reset = false;
+       }
+       virtual void resume() {
+               _skip = false;
+       }
+
+       bool getResult() {return result;}       
+};
+
 //For packing into a preallocated, presized memory buffer
 class toMem : public mem {
  protected:
@@ -430,6 +473,7 @@ inline void fromMemBuf(T &t,void *buf,int len) {
                "This means your pup routine doesn't match during packing and unpacking");
 }
 
+
 /********** PUP::er -- Binary disk file pack/unpack *********/
 class disk : public er {
  protected: