00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <stdio.h>
00018 #include "tlbitfield.h"
00019
00020 char *prg_name="test-bitfield";
00021
00022
00023 static int DoTestBitFields()
00024 {
00025 int nerr=0;
00026 const size_t size=64*64;
00027 TLStaticBitField<size_t,size> sbfA;
00028 TLStaticBitField<int16,size> sbfB;
00029 TLStaticBitField<size_t,size+21> sbfC;
00030 TLDynamicBitField<size_t> dbfA(size);
00031 TLDynamicBitField<int16> dbfB(size);
00032 TLDynamicBitField<size_t> dbfC(size+21);
00033 char array[size];
00034
00035 fprintf(stderr,
00036 " sA: nents=%d, band=0x%x, bshift=%d, exmask=0x%x\n",
00037 sbfA.nents,sbfA.band,sbfA.bshift,sbfA.exmask);
00038 fprintf(stderr,
00039 " sB: nents=%d, band=0x%x, bshift=%d, exmask=0x%x\n",
00040 sbfB.nents,sbfB.band,sbfB.bshift,sbfB.exmask);
00041 fprintf(stderr,
00042 " sC: nents=%d, band=0x%x, bshift=%d, exmask=0x%x\n",
00043 sbfC.nents,sbfC.band,sbfC.bshift,sbfC.exmask);
00044
00045 fprintf(stderr,
00046 " dA: nents=%d, band=0x%x, bshift=%d, exmask=0x%x\n",
00047 dbfA.nents,dbfA.band,dbfA.bshift,dbfA.exmask);
00048 fprintf(stderr,
00049 " dB: nents=%d, band=0x%x, bshift=%d, exmask=0x%x\n",
00050 dbfB.nents,dbfB.band,dbfB.bshift,dbfB.exmask);
00051 fprintf(stderr,
00052 " dC: nents=%d, band=0x%x, bshift=%d, exmask=0x%x\n",
00053 dbfC.nents,dbfC.band,dbfC.bshift,dbfC.exmask);
00054
00055
00056 sbfA.ClrAll();
00057 sbfB.ClrAll();
00058 sbfC.ClrAll();
00059 dbfA.ClrAll();
00060 dbfB.ClrAll();
00061 dbfC.ClrAll();
00062 for(size_t j=0; j<size; j++) array[j]=0;
00063
00064
00065 fprintf(stderr," SetBit/ClrBit");
00066 for(int i=0; i<200000; i++)
00067 {
00068 int rand_val=rand();
00069 bool val=rand_val&1;
00070 size_t adr=(rand_val>>1)%size;
00071
00072 if(val)
00073 {
00074 sbfA.SetBit(adr);
00075 sbfB.SetBit(adr);
00076 sbfC.SetBit(adr);
00077 dbfA.SetBit(adr);
00078 dbfB.SetBit(adr);
00079 dbfC.SetBit(adr);
00080 array[adr]=1;
00081 if(!sbfA.GetBit(adr) || !sbfB.GetBit(adr) || !sbfC.GetBit(adr))
00082 {
00083 fprintf(stderr," OOPS: adr=%u, val=%d (size=%u, i=%d) [s]\n",
00084 adr,int(val),size,i);
00085 ++nerr; break;
00086 }
00087 if(!dbfA.GetBit(adr) || !dbfB.GetBit(adr) || !dbfC.GetBit(adr))
00088 {
00089 fprintf(stderr," OOPS: adr=%u, val=%d (size=%u, i=%d) [d]\n",
00090 adr,int(val),size,i);
00091 ++nerr; break;
00092 }
00093 }
00094 else
00095 {
00096 sbfA.ClrBit(adr);
00097 sbfB.ClrBit(adr);
00098 sbfC.ClrBit(adr);
00099 dbfA.ClrBit(adr);
00100 dbfB.ClrBit(adr);
00101 dbfC.ClrBit(adr);
00102 array[adr]=0;
00103 if(sbfA.GetBit(adr) || sbfB.GetBit(adr) || sbfC.GetBit(adr))
00104 {
00105 fprintf(stderr," OOPS: adr=%u, val=%d (size=%u, i=%d) [s]\n",
00106 adr,int(val),size,i);
00107 ++nerr; break;
00108 }
00109 if(dbfA.GetBit(adr) || dbfB.GetBit(adr) || dbfC.GetBit(adr))
00110 {
00111 fprintf(stderr," OOPS: adr=%u, val=%d (size=%u, i=%d) [d]\n",
00112 adr,int(val),size,i);
00113 ++nerr; break;
00114 }
00115 }
00116
00117 if(!(rand()%1000))
00118 {
00119 {
00120 size_t sA=sbfA.CountSet();
00121 size_t sB=sbfA.CountSet();
00122 size_t sC=sbfA.CountSet();
00123 size_t dA=dbfA.CountSet();
00124 size_t dB=dbfA.CountSet();
00125 size_t dC=dbfA.CountSet();
00126 size_t sarr=0;
00127 for(size_t j=0; j<size; j++) if(array[j]) ++sarr;
00128 if(sA!=sarr || sB!=sarr || sC!=sarr)
00129 { fprintf(stderr," OOPS: counter: sA=%u, sB=%u, sC=%u, "
00130 "sarr=%u, i=%d, size=%u\n",sA,sB,sC,sarr,i,size);
00131 ++nerr; break; }
00132 if(dA!=sarr || dB!=sarr || dC!=sarr)
00133 { fprintf(stderr," OOPS: counter: dA=%u, dB=%u, dC=%u, "
00134 "sarr=%u, i=%d, size=%u\n",dA,dB,dC,sarr,i,size);
00135 ++nerr; break; }
00136 }
00137 {
00138 ssize_t sA=sbfA.SearchFirstSet();
00139 ssize_t sB=sbfA.SearchFirstSet();
00140 ssize_t sC=sbfA.SearchFirstSet();
00141 ssize_t dA=dbfA.SearchFirstSet();
00142 ssize_t dB=dbfA.SearchFirstSet();
00143 ssize_t dC=dbfA.SearchFirstSet();
00144 ssize_t sarr=-1;
00145 for(size_t j=0; j<size; j++) if(array[j]) { sarr=j; break; }
00146 if(sA!=sarr || sB!=sarr || sC!=sarr)
00147 { fprintf(stderr," OOPS: FirstSet: sA=%u, sB=%u, sC=%u, "
00148 "sarr=%u, i=%d, size=%u\n",sA,sB,sC,sarr,i,size);
00149 ++nerr; break; }
00150 if(dA!=sarr || dB!=sarr || dC!=sarr)
00151 { fprintf(stderr," OOPS: FirstSet: dA=%u, dB=%u, dC=%u, "
00152 "sarr=%u, i=%d, size=%u\n",dA,dB,dC,sarr,i,size);
00153 ++nerr; break; }
00154 }
00155 {
00156 ssize_t sA=sbfA.SearchFirstClr();
00157 ssize_t sB=sbfA.SearchFirstClr();
00158 ssize_t sC=sbfA.SearchFirstClr();
00159 ssize_t dA=dbfA.SearchFirstClr();
00160 ssize_t dB=dbfA.SearchFirstClr();
00161 ssize_t dC=dbfA.SearchFirstClr();
00162 ssize_t sarr=-1;
00163 for(size_t j=0; j<size; j++) if(!array[j]) { sarr=j; break; }
00164 if(sA!=sarr || sB!=sarr || sC!=sarr)
00165 { fprintf(stderr," OOPS: FirstClr: sA=%u, sB=%u, sC=%u, "
00166 "sarr=%u, i=%d, size=%u\n",sA,sB,sC,sarr,i,size);
00167 ++nerr; break; }
00168 if(dA!=sarr || dB!=sarr || dC!=sarr)
00169 { fprintf(stderr," OOPS: FirstClr: dA=%u, dB=%u, dC=%u, "
00170 "sarr=%u, i=%d, size=%u\n",dA,dB,dC,sarr,i,size);
00171 ++nerr; break; }
00172 }
00173 }
00174
00175 if(!(i&0x3fff)) fprintf(stderr,".");
00176 }
00177
00178
00179 fprintf(stderr,"cmp: ");
00180 for(size_t j=0; j<size; j++)
00181 {
00182 bool val=array[j];
00183 if(sbfA.GetBit(j)!=val) ++nerr;
00184 if(sbfB.GetBit(j)!=val) ++nerr;
00185 if(sbfC.GetBit(j)!=val) ++nerr;
00186 if(dbfA.GetBit(j)!=val) ++nerr;
00187 if(dbfB.GetBit(j)!=val) ++nerr;
00188 if(dbfC.GetBit(j)!=val) ++nerr;
00189 }
00190 fprintf(stderr,"%d errors\n",nerr);
00191 if(nerr) return(nerr);
00192
00193
00194
00195 sbfA.ClrAll();
00196 sbfB.ClrAll();
00197 sbfC.ClrAll();
00198 dbfA.ClrAll();
00199 dbfB.ClrAll();
00200 dbfC.ClrAll();
00201 for(size_t j=0; j<size; j++) array[j]=0;
00202
00203 {
00204 ssize_t sA=sbfA.SearchFirstSet();
00205 ssize_t sB=sbfA.SearchFirstSet();
00206 ssize_t sC=sbfA.SearchFirstSet();
00207 ssize_t dA=dbfA.SearchFirstSet();
00208 ssize_t dB=dbfA.SearchFirstSet();
00209 ssize_t dC=dbfA.SearchFirstSet();
00210 ssize_t sarr=-1;
00211 if(sA!=sarr || sB!=sarr || sC!=sarr)
00212 { fprintf(stderr," OOPS: FirstSet: sA=%d, sB=%d, sC=%d, "
00213 "sarr=%d, size=%u\n",sA,sB,sC,sarr,size);
00214 ++nerr; return(nerr); }
00215 if(dA!=sarr || dB!=sarr || dC!=sarr)
00216 { fprintf(stderr," OOPS: FirstSet: dA=%d, dB=%d, dC=%d, "
00217 "sarr=%d, size=%u\n",dA,dB,dC,sarr,size);
00218 ++nerr; return(nerr); }
00219 }
00220
00221 fprintf(stderr," SearchFirstSet");
00222 size_t keepfree=size-1;
00223 while(keepfree>0)
00224 {
00225 int rand_val=rand();
00226 bool val=rand_val&1;
00227 size_t adr=keepfree+(rand_val>>1)%(size-keepfree);
00228
00229 sbfA.AssBit(adr,val);
00230 sbfB.AssBit(adr,val);
00231 sbfC.AssBit(adr,val);
00232 dbfA.AssBit(adr,val);
00233 dbfB.AssBit(adr,val);
00234 dbfC.AssBit(adr,val);
00235 array[adr]=val;
00236
00237 {
00238 ssize_t sA=sbfA.SearchFirstSet();
00239 ssize_t sB=sbfA.SearchFirstSet();
00240 ssize_t sC=sbfA.SearchFirstSet();
00241 ssize_t dA=dbfA.SearchFirstSet();
00242 ssize_t dB=dbfA.SearchFirstSet();
00243 ssize_t dC=dbfA.SearchFirstSet();
00244 ssize_t sarr=-1;
00245 for(size_t j=0; j<size; j++) if(array[j]) { sarr=j; break; }
00246 CritAssert(sarr<0 || size_t(sarr)>=keepfree);
00247 if(sA!=sarr || sB!=sarr || sC!=sarr)
00248 { fprintf(stderr," OOPS: FirstSet: sA=%d, sB=%d, sC=%d, "
00249 "sarr=%d, keepfree=%u, size=%u\n",sA,sB,sC,sarr,keepfree,size);
00250 ++nerr; break; }
00251 if(dA!=sarr || dB!=sarr || dC!=sarr)
00252 { fprintf(stderr," OOPS: FirstSet: dA=%d, dB=%d, dC=%d, "
00253 "sarr=%d, keepfree=%u, size=%u\n",dA,dB,dC,sarr,keepfree,size);
00254 ++nerr; break; }
00255 }
00256
00257 if(!(rand()%5))
00258 {
00259 --keepfree;
00260 if(!(keepfree&127)) fprintf(stderr,".");
00261 }
00262 }
00263 fprintf(stderr,"OK\n");
00264 if(nerr) return(nerr);
00265
00266
00267 sbfA.SetAll();
00268 sbfB.SetAll();
00269 sbfC.SetAll();
00270 dbfA.SetAll();
00271 dbfB.SetAll();
00272 dbfC.SetAll();
00273 for(size_t j=0; j<size; j++) array[j]=1;
00274
00275 {
00276 ssize_t sA=sbfA.SearchFirstClr();
00277 ssize_t sB=sbfA.SearchFirstClr();
00278 ssize_t sC=sbfA.SearchFirstClr();
00279 ssize_t dA=dbfA.SearchFirstClr();
00280 ssize_t dB=dbfA.SearchFirstClr();
00281 ssize_t dC=dbfA.SearchFirstClr();
00282 ssize_t sarr=-1;
00283 if(sA!=sarr || sB!=sarr || sC!=sarr)
00284 { fprintf(stderr," OOPS: FirstClr: sA=%d, sB=%d, sC=%d, "
00285 "sarr=%d, size=%u\n",sA,sB,sC,sarr,size);
00286 ++nerr; return(nerr); }
00287 if(dA!=sarr || dB!=sarr || dC!=sarr)
00288 { fprintf(stderr," OOPS: FirstClr: dA=%d, dB=%d, dC=%d, "
00289 "sarr=%d, size=%u\n",dA,dB,dC,sarr,size);
00290 ++nerr; return(nerr); }
00291 }
00292
00293 fprintf(stderr," SearchFirstClr");
00294 keepfree=size-1;
00295 while(keepfree>0)
00296 {
00297 int rand_val=rand();
00298 bool val=rand_val&1;
00299 size_t adr=keepfree+(rand_val>>1)%(size-keepfree);
00300
00301 sbfA.AssBit(adr,val);
00302 sbfB.AssBit(adr,val);
00303 sbfC.AssBit(adr,val);
00304 dbfA.AssBit(adr,val);
00305 dbfB.AssBit(adr,val);
00306 dbfC.AssBit(adr,val);
00307 array[adr]=val;
00308
00309 {
00310 ssize_t sA=sbfA.SearchFirstClr();
00311 ssize_t sB=sbfA.SearchFirstClr();
00312 ssize_t sC=sbfA.SearchFirstClr();
00313 ssize_t dA=dbfA.SearchFirstClr();
00314 ssize_t dB=dbfA.SearchFirstClr();
00315 ssize_t dC=dbfA.SearchFirstClr();
00316 ssize_t sarr=-1;
00317 for(size_t j=0; j<size; j++) if(!array[j]) { sarr=j; break; }
00318 CritAssert(sarr<0 || size_t(sarr)>=keepfree);
00319 if(sA!=sarr || sB!=sarr || sC!=sarr)
00320 { fprintf(stderr," OOPS: FirstClr: sA=%d, sB=%d, sC=%d, "
00321 "sarr=%d, keepfree=%u, size=%u\n",sA,sB,sC,sarr,keepfree,size);
00322 ++nerr; break; }
00323 if(dA!=sarr || dB!=sarr || dC!=sarr)
00324 { fprintf(stderr," OOPS: FirstClr: dA=%d, dB=%d, dC=%d, "
00325 "sarr=%d, keepfree=%u, size=%u\n",dA,dB,dC,sarr,keepfree,size);
00326 ++nerr; break; }
00327 }
00328
00329 if(!(rand()%5))
00330 {
00331 --keepfree;
00332 if(!(keepfree&127)) fprintf(stderr,".");
00333 }
00334 }
00335 fprintf(stderr,"OK\n");
00336 if(nerr) return(nerr);
00337
00338 return(nerr);
00339 }
00340
00341
00342 int main()
00343 {
00344 fprintf(stderr,"Testing TL*BitField...\n");
00345
00346 int rv=DoTestBitFields();
00347 if(rv)
00348 {
00349 fprintf(stderr,"OOPS: Test failed.\n");
00350 return(1);
00351 }
00352
00353
00354 LMallocUsage lmu;
00355 LMallocGetUsage(&lmu);
00356 fprintf(stderr,"%s: %sAlloc: %u bytes in %d chunks; Peak: %u by,%d chks; "
00357 "(%u/%u/%u)%s\n",
00358 prg_name,
00359 lmu.curr_used ? "*** " : "",
00360 lmu.curr_used,lmu.used_chunks,lmu.max_used,lmu.max_used_chunks,
00361 lmu.malloc_calls,lmu.realloc_calls,lmu.free_calls,
00362 lmu.curr_used ? " ***" : "");
00363 if(lmu.curr_used) return(1);
00364
00365 fprintf(stderr,"TL*BitField test SUCCESSFUL.\n");
00366 return(0);
00367 }