Def.hpp

00001 #ifndef __DEF_HPP__
00002 #define __DEF_HPP__
00003 #define PI 3.141592653589793238462643383279502884197169399375105820974944592308
00004 #define PIf 3.141592653589793238462643383279502884197169399375105820974944592308f
00005 #define FOR(i,i0,i1) for((i)=i0;(i)<=(i1);(i)++)
00006 //------------------------------------------
00007 inline float  fgt0(float  x){return (x>1.e-25f?x:1.e-25f);}
00008 inline double fgt0(double x){return (x>1.e-25f?x:1.e-25f);}
00009 inline int fnot0(int x){return (x==0?1:x);}
00010 inline long fnot0(long x){return (x==0?1:x);}
00011 inline unsigned int fnot0(unsigned int x){return (x==0?1:x);}
00012 inline unsigned long fnot0(unsigned long x){return (x==0?1:x);}
00013 inline float  fnot0(float  x){return (x>1.e-25f||x<-1.e-25f?x:x>=0?1.e-25f:-1.e-25f);}
00014 inline double fnot0(double x){return (x>1.e-25f||x<-1.e-25f?x:x>=0?1.e-25f:-1.e-25f);}
00015 inline void *wnew(int n){return (void*) new char[n];}
00016 //------------------------------------------
00017 inline void clear_string_end(char *s)
00018 {while(*s){if(*s=='\n'){*s='\0';break;}; s++;}}
00019 inline int clear_string_end_with_bells(char *str)
00020 {char *s;if(str==NULL)return(0);
00021  if((s=strchr(str,'\n'))!=NULL) *s='\0';
00022  if(s==NULL)s=str+strlen(str); if(s==NULL)return(0);
00023  while(s>str && s[-1]==' ') *(--s)='\0';
00024         return(s!=str);
00025 } 
00026 //------------------------------------------
00027 inline void ADD_PTR(void **&ptr, int &n)
00028   {int i,id;
00029    //if(n==0 && ptr!=NULL) throw 0;
00030    n++;
00031    for(i=0,id=1;i<30;i++,id*=2)
00032     {
00033       //if(id<=0) throw 0;
00034       if( n<id ) goto l1;
00035       if( n==id )
00036        {
00037         void **tmp;
00038         tmp = (void**)wnew(sizeof(void*)*(n*2)); //if(tmp==NULL) throw 0;
00039         if(n>1) memcpy(tmp,ptr, (n-1)*sizeof(void*));
00040         if(ptr) delete ptr; ptr=tmp;
00041         goto l1; 
00042        }
00043     }
00044    //throw 0;
00045 l1:;
00046   }
00047 //------------------------------------------
00048 inline void ADD_PTRL(void **&ptr, long &n)
00049   {long i,id;
00050    //if(n==0 && ptr!=NULL) throw 0;
00051    n++;
00052    for(i=0,id=1;i<30;i++,id*=2)
00053     {
00054       //if(id<=0) throw 0;
00055       if( n<id ) goto l1;
00056       if( n==id )
00057        {
00058         void **tmp;
00059         tmp = (void**)wnew(sizeof(void*)*(n*2)); //if(tmp==NULL) throw 0;
00060         if(n>1) memcpy(tmp,ptr, (n-1)*sizeof(void*));
00061         if(ptr) delete ptr; ptr=tmp;
00062         goto l1; 
00063        }
00064     }
00065    //throw 0;
00066 l1:;
00067   }
00068 //------------------------------------------
00069 inline void ADD_ARRAY(void *&ptr, int &n, int size)
00070   {int i,id;
00071    //if(n==0 && ptr!=NULL) throw 0;
00072    n++;
00073    for(i=0,id=1;i<30;i++,id*=2)
00074     {
00075       //if(id<=0) throw 0;
00076       if( n<id ) goto l1;
00077       if( n==id )
00078        {
00079         void *tmp;
00080         tmp = (void*)wnew((n*2*size)); //if(tmp==NULL) throw 0;
00081         if(n>1) memcpy(tmp,ptr, (n-1)*size);
00082         if(ptr) delete (char*)ptr; ptr=tmp;
00083         goto l1; 
00084        }
00085     }
00086    //throw 0;
00087 l1:;
00088   }
00089 //------------------------------------------
00090 inline void ADD_ARRAYL(void *&ptr, long &n, int size)
00091   {long i,id;
00092    //if(n==0 && ptr!=NULL) throw 0;
00093    n++;
00094    for(i=0,id=1;i<30;i++,id*=2)
00095     {
00096       //if(id<=0) throw 0;
00097       if( n<id ) goto l1;
00098       if( n==id )
00099        {
00100         void *tmp;
00101         tmp = (void*)wnew(n*2*size); //if(tmp==NULL) throw 0;
00102         if(n>1) memcpy(tmp,ptr, (n-1)*size);
00103         if(ptr) delete (char*)ptr; ptr=tmp;
00104         goto l1; 
00105        }
00106     }
00107    //throw 0;
00108 l1:;
00109   }
00110 //------------------------------------------
00111 #ifndef ABS
00112 #define ABS(x) ((x)>=0?(x):-(x))
00113 #endif
00114 #define SIGN(x) ((x)>=0?(1):-(1))
00115 inline  int float_eq(double x,double y){ if(ABS(x-y) <= (ABS(x)+ABS(y))*1.e-5) return(1); else return(0);}
00116 inline  int double_eq(double x,double y){ if(ABS(x-y) <= (ABS(x)+ABS(y))*1.e-10) return(1); else return(0);}
00117 inline void swap(long &i0,long &i1){static long i;i=i0;i0=i1;i1=i;}
00118 inline void swap(float &i0,float &i1){static float i;i=i0;i0=i1;i1=i;}
00119 inline void swap(int &i0,int &i1){static int i;i=i0;i0=i1;i1=i;}
00120 #define SWAP(x,y,z) {(z)=(x);(x)=(y);(y)=(z);}
00121 inline int Round(float x){if(x>=0) return (int)(x+0.5f); else return (int)(x-0.5f);}
00122 //------------------------------------
00123 class AutoSet
00124 {public:
00125 int *set;
00126  AutoSet(){set=NULL;}
00127  ~AutoSet(){if(set)*set=0;}
00128  int &operator()(){return *set;}
00129  void Set(int &x){set=&x; *set=1;}
00130 };
00131 class AutoSetM
00132 {public:
00133 int *set;
00134  AutoSetM(){set=NULL;}
00135  ~AutoSetM(){if(set)(*set)--;}
00136  int &operator()(){return *set;}
00137  void Set(int &x){set=&x; (*set)++;}
00138 };
00139 //------------------------------------
00140 template <class Type> class AutoFree
00141 {
00142  public:
00143   AutoFree():ptr(NULL){};
00144   AutoFree(Type *p):ptr(p){};
00145   ~AutoFree()
00146    {
00147     if(ptr)
00148      {
00149       delete [] ptr;
00150       ptr=NULL;
00151      };
00152    };
00153   void own(Type *p)
00154    {
00155     ptr=p;
00156    };
00157  private:
00158   Type *ptr;
00159 };
00160 //------------------------------------
00161 template <class Type> class AAutoFree
00162 {
00163  public:
00164   AAutoFree():ptr(NULL){};
00165   AAutoFree(Type *&p){ptr=&p;};
00166   ~AAutoFree()
00167    {
00168     if(ptr&&*ptr)
00169      {
00170       delete [] (*ptr);
00171       ptr=NULL;
00172      };
00173    };
00174   void own(Type *&p)
00175    {
00176     ptr=&p;
00177    };
00178  private:
00179   Type **ptr;
00180 };
00181 //------------------------------------
00182 char **allocate_2D_Array(int m,int n, int size_of_element,int set_clear=0);
00183 char **allocate_2D_Array_with_frame(int m,int n, int size_of_element,int set_clear=0);
00184 char ***allocate_3D_Array(int m,int n, int **k, int size_of_element,int set_clear=0);
00185 char ***allocate_3D_Array(int m,int n, int k, int size_of_element,int set_clear=0);
00186 //------------------------------------
00187 #ifndef MAX
00188 #define MAX(x,y) ((x)>(y)?(x):(y))
00189 #define MIN(x,y) ((x)<(y)?(x):(y))
00190 #endif
00191 #ifndef MAX3
00192 #define MAX3(x,y,z) ( (x)>(y)? ((x)>(z)?(x):(z)) : ((y)>(z)?(y):(z)) )
00193 #define MIN3(x,y,z) ( (x)<(y)? ((x)<(z)?(x):(z)) : ((y)<(z)?(y):(z)) )
00194 #define MAX4(x,y,z,w) ( (x)>(y)? ((z)>(w)?MAX(x,z):MAX(x,w)) : ((z)>(w)?MAX(y,z):MAX(y,w)) )
00195 #define MIN4(x,y,z,w) ( (x)<(y)? ((z)<(w)?MIN(x,z):MIN(x,w)) : ((z)<(w)?MIN(y,z):MIN(y,w)) )
00196 #endif
00197 inline int RoundNot0(float x){if(x<0.00001f && x>-0.00001f)return 0; if(x>=0) return MAX(1,(int)(x+0.5f)); else return MIN(-1,(int)(x-0.5f));}
00198 //------------------------------------
00199 class CWTViewSet1
00200 {public:
00201  int *set;
00202  CWTViewSet1(int *set){this->set=set; *set=1;}
00203  ~CWTViewSet1(){*set=0;}
00204 } ;
00205 //------------------------------------
00206 inline void PrepareStr0(char *s,int l)
00207 {
00208  for(int i=0;i<l;i++)s[i]=-1;
00209 }
00210 inline void CleanStr0(char *s,int l)
00211 {int i;
00212  for(i=0;i<l;i++)if(s[i]==0)s[i]=' ';
00213  for(i=0;i<l;i++)if(s[i]==-1)s[i]=0;
00214 }
00215 inline char *fgetsPrepareClean0(char *s,int l,FILE *f)
00216 {char *ss;
00217  PrepareStr0(s,l);
00218  if((ss=fgets(s,l,f))==NULL)return NULL;
00219  CleanStr0(s,l);
00220  clear_string_end_with_bells(s);
00221  return ss;
00222 }
00223 //------------------------------------
00224 class FOpenClose;
00225 class AutoFClose
00226 {public:
00227  FILE *f;
00228  FOpenClose *FCloseMember;
00229  AutoFClose(FILE *f){this->f=f;FCloseMember=NULL;}
00230  AutoFClose(FILE *f,FOpenClose *FCloseMember){this->f=f;this->FCloseMember=FCloseMember;}
00231  void fclose();
00232  ~AutoFClose();//{if(f)fclose(f);}
00233 };
00234 //------------------------------------
00235 inline int isspacer(unsigned char c){if(c==' '||c==9)return(1); else return(0);}
00236 inline int isdigitr(unsigned char c){if(c>='0' && c<='9')return(1); else return(0);}
00237 //------------------------------------
00238 extern int N_WDEBUG_NEW;
00239 #define WDEBUG_NEW new(THIS_FILE, N_WDEBUG_NEW++)
00240 #define NCollectorDataMax 100
00241 //------------------------------------
00242 #define SET_INDEX(CClass, ptr, index, index_max) \
00243  if((index)>=index_max)\
00244  {\
00245   CClass *ptr2=new CClass[(index)*2+10];\
00246   if(ptr)\
00247    for(int i12387=0;i12387<(index_max);i12387++)ptr2[i12387]=(ptr)[i12387];\
00248   index_max=2*(index)+9;\
00249   delete[] (ptr);\
00250   ptr=ptr2;\
00251  }
00252 //------------------------------------
00253 #define SET_INDEX2(CClass, ptr, index, index_max) \
00254  if((index)>=index_max)\
00255  {\
00256   CClass *ptr2=new CClass[(index)*2+10];\
00257   if(ptr)\
00258   for(int i43253=0;i43253<(index_max);i43253++){ptr2[i43253][0]=ptr[i43253][0];ptr2[i43253][1]=ptr[i43253][1];}\
00259   index_max=2*(index)+9;\
00260   delete[] ptr;\
00261   ptr=ptr2;\
00262  }
00263 //------------------------------------
00264 inline int LinesNumber(const char *sf)
00265 {char str[1024];int n=0;if(sf && sf[0]){FILE *f=fopen(sf,"r"); if(f){while(fgets(str,1023,f))n++; fclose(f);}}return n;}
00266 //#include "output.h"
00267 //------------------------------------
00268 template<class TYPE> TYPE QFindStat(TYPE *A,int p,int q,int k)
00269 {int l,i,j;TYPE x,Atmp; 
00270  if(q-p<1) return A[p];
00271  i=p; j=q; l=p+(rand())%(q-p);  SWAP(A[p],A[l],Atmp);  x=A[i];
00272  for(;;)
00273  {
00274     while(A[i]<x)i++;  while(A[j]>x)j--;
00275     if(i<j){SWAP(A[i],A[j],Atmp);}
00276     else 
00277       {if(k<=j)
00278         return QFindStat (A, p, j, k );
00279         else return QFindStat (A, j+1, q, k ) ;
00280       }
00281     i++; j--;
00282  }
00283 }
00284 
00285 template<class TYPE>TYPE QFindStat(TYPE *A,int k,int N)
00286 { if(k<0)k=0; if(k>=N)k=N-1; return   QFindStat(A,0,N-1,k);}
00287 //------------------------------------
00288 #define FIRST_TIME static FirstTime___=1; FirstTime___--; if(FirstTime___==0)
00289 //------------------------------------
00290 template<class CType> CType **Allocate2DArray(int m,int n)
00291 {CType **p=NULL;CType *p2=NULL; 
00292  p=new CType*[(m+1)];
00293  p2=new CType[(m+1)*n];
00294         p[0]=p2;
00295         for(int i=1;i<m;i++)
00296         {
00297                 p[i]=p[i-1]+n;
00298         }
00299 return p;
00300 }
00301 //------------
00302 template<class CType> void Delete2DArray(CType **v)
00303 {
00304  if(v)
00305  {
00306   delete[] v[0]; delete[] v;
00307  }
00308 }
00309 //------------------------------------
00310 #define MB(xxx) QMessageBox::information(this,"",xxx);
00311 #define MB_(xxx) QMessageBox::information(NULL,"",xxx);
00312 #define MB1(xxx,yyy) {QString s; s.sprintf(xxx,yyy);QMessageBox::information(this,"",s);}
00313 #define MB1_(xxx,yyy) {QString s; s.sprintf(xxx,yyy);QMessageBox::information(NULL,"",s);}
00314 //------------------------------------
00315 inline int FileExists(const char*sf){FILE *f=fopen(sf,"r"); if(f){fclose(f);return 1;} return 0;}
00316 //------------------------------------
00317 //------------------------------------
00318 #endif
00319 

Generated on Thu Nov 15 16:34:53 2007 for wgr.kdevelop by  doxygen 1.4.7