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
00030 n++;
00031 for(i=0,id=1;i<30;i++,id*=2)
00032 {
00033
00034 if( n<id ) goto l1;
00035 if( n==id )
00036 {
00037 void **tmp;
00038 tmp = (void**)wnew(sizeof(void*)*(n*2));
00039 if(n>1) memcpy(tmp,ptr, (n-1)*sizeof(void*));
00040 if(ptr) delete ptr; ptr=tmp;
00041 goto l1;
00042 }
00043 }
00044
00045 l1:;
00046 }
00047
00048 inline void ADD_PTRL(void **&ptr, long &n)
00049 {long i,id;
00050
00051 n++;
00052 for(i=0,id=1;i<30;i++,id*=2)
00053 {
00054
00055 if( n<id ) goto l1;
00056 if( n==id )
00057 {
00058 void **tmp;
00059 tmp = (void**)wnew(sizeof(void*)*(n*2));
00060 if(n>1) memcpy(tmp,ptr, (n-1)*sizeof(void*));
00061 if(ptr) delete ptr; ptr=tmp;
00062 goto l1;
00063 }
00064 }
00065
00066 l1:;
00067 }
00068
00069 inline void ADD_ARRAY(void *&ptr, int &n, int size)
00070 {int i,id;
00071
00072 n++;
00073 for(i=0,id=1;i<30;i++,id*=2)
00074 {
00075
00076 if( n<id ) goto l1;
00077 if( n==id )
00078 {
00079 void *tmp;
00080 tmp = (void*)wnew((n*2*size));
00081 if(n>1) memcpy(tmp,ptr, (n-1)*size);
00082 if(ptr) delete (char*)ptr; ptr=tmp;
00083 goto l1;
00084 }
00085 }
00086
00087 l1:;
00088 }
00089
00090 inline void ADD_ARRAYL(void *&ptr, long &n, int size)
00091 {long i,id;
00092
00093 n++;
00094 for(i=0,id=1;i<30;i++,id*=2)
00095 {
00096
00097 if( n<id ) goto l1;
00098 if( n==id )
00099 {
00100 void *tmp;
00101 tmp = (void*)wnew(n*2*size);
00102 if(n>1) memcpy(tmp,ptr, (n-1)*size);
00103 if(ptr) delete (char*)ptr; ptr=tmp;
00104 goto l1;
00105 }
00106 }
00107
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();
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
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