00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef STATIC_COVERAGE_HH
00026 #define STATIC_COVERAGE_HH
00027
00028 #include "coverage.hh"
00029 #include "dynamic-coverage.hh"
00030 #include "inline-macro.hh"
00031
00032 #include <list>
00033
00034 namespace GMap3d
00035 {
00036
00043 template <int Ai>
00044 class CTemplateStaticCoverage1 : public CCoverage
00045 {
00046 private:
00047
00048
00049
00051 CDart* FDart1;
00052
00054 CDart* FDart2;
00055
00057 bool FDoContinue;
00058
00060 bool FDart1Active;
00061
00062
00063
00064 public:
00065
00066
00067
00069 CTemplateStaticCoverage1(CGMapBasic* AGMap, const CDart* ADart1);
00071 virtual ~CTemplateStaticCoverage1();
00072
00073
00074
00075
00076
00077
00078 void reinit();
00079 void operator++();
00080 CDart* operator++(int);
00081 bool cont();
00082 CDart* operator*();
00083 int type() const;
00084
00085
00086 };
00087
00088
00095 template <int Ai, int Aj>
00096 class CTemplateStaticCoverage2a : public CCoverage
00097 {
00098 private:
00099
00101
00103 CDart* FDart[4];
00104
00106 int FIndex;
00107
00109
00110 public:
00111
00112
00113
00115 CTemplateStaticCoverage2a(CGMapBasic* AGMap, const CDart* ADart1);
00117 virtual ~CTemplateStaticCoverage2a();
00118
00119
00120
00121
00122
00123
00124 void reinit();
00125 void operator++();
00126 CDart* operator++(int);
00127 bool cont();
00128 CDart* operator*();
00129 int type() const;
00130
00131
00132 };
00133
00134
00140 class CGenericStaticCoverage : public CCoverage
00141 {
00142 protected:
00143
00144
00145
00146 std::list<CDart*> FAllDarts;
00147 std::list<CDart*>::iterator FIt;
00148
00149
00150
00151 public:
00152
00153
00154
00155
00156 CGenericStaticCoverage(CGMapBasic* AGMap);
00157
00158 virtual ~CGenericStaticCoverage();
00159
00160
00161
00162
00163
00164
00165 void reinit();
00166 void operator++();
00167 CDart* operator++(int);
00168 bool cont();
00169 CDart* operator*();
00170
00171
00172 };
00173
00174
00181 template <int Ai, int Aj>
00182 class CTemplateStaticCoverage2b : public CGenericStaticCoverage
00183 {
00184 public:
00185
00186
00187
00188
00189 CTemplateStaticCoverage2b(CGMapBasic* AGMap, const CDart* ADart1);
00190
00191 virtual ~CTemplateStaticCoverage2b();
00192
00193
00194
00195
00196
00197 int type() const;
00198
00199
00200 };
00201
00202
00209 template <int Ai, int Aj, int Ak>
00210 class CTemplateStaticCoverage3a : public CGenericStaticCoverage
00211 {
00212 public:
00213
00214
00215
00216
00217 CTemplateStaticCoverage3a(CGMapBasic* AGMap, const CDart* ADart1);
00218
00219 virtual ~CTemplateStaticCoverage3a();
00220
00221
00222
00223
00224
00225 int type() const;
00226
00227
00228 };
00229
00230
00237 template <int Ai, int Aj, int Ak>
00238 class CTemplateStaticCoverage3b : public CGenericStaticCoverage
00239 {
00240 public:
00241
00242
00243
00244
00245 CTemplateStaticCoverage3b(CGMapBasic* AGMap, const CDart* ADart1);
00246
00247
00248 virtual ~CTemplateStaticCoverage3b();
00249
00250
00251
00252
00253
00254 int type() const;
00255
00256
00257 };
00258
00259
00266 class CTemplateStaticCoverage4 : public CGenericStaticCoverage
00267 {
00268 public:
00269
00270
00271
00273 CTemplateStaticCoverage4(CGMapBasic* AGMap, const CDart* ADart1);
00275 virtual ~CTemplateStaticCoverage4();
00276
00277
00278
00279
00280
00281 int type() const;
00282
00283
00284 };
00285
00286
00292 class CStaticCoverageAll : public CGenericStaticCoverage
00293 {
00294 public:
00295
00296
00297
00299 CStaticCoverageAll(CGMapBasic* AGMap);
00300
00302 virtual ~CStaticCoverageAll();
00303
00304
00305
00306
00307
00308 int type() const;
00309
00310
00311 };
00312
00313
00319 class CStaticBorderCoverage : public CGenericStaticCoverage
00320 {
00321 public:
00322
00323
00324
00326 CStaticBorderCoverage(CGMapBasic* AGMap, const CDart* ADart1, int);
00327
00329 virtual ~CStaticBorderCoverage();
00330
00331
00332
00333
00334
00335 int type() const;
00336
00337
00338 };
00339
00340
00341
00342
00343
00344 class CTemplateDynamicCoverage0;
00345
00346 typedef CTemplateDynamicCoverage0 CTemplateStaticCoverage0;
00347 typedef CTemplateStaticCoverage0 CStaticCoverageSelf;
00348
00349 typedef CTemplateStaticCoverage1<0> CStaticCoverage0;
00350 typedef CTemplateStaticCoverage1<1> CStaticCoverage1;
00351 typedef CTemplateStaticCoverage1<2> CStaticCoverage2;
00352 typedef CTemplateStaticCoverage1<3> CStaticCoverage3;
00353
00354 typedef CTemplateStaticCoverage2a<0,2> CStaticCoverage02;
00355 typedef CTemplateStaticCoverage2a<0,3> CStaticCoverage03;
00356 typedef CTemplateStaticCoverage2a<1,3> CStaticCoverage13;
00357
00358 typedef CTemplateStaticCoverage2b<0,1> CStaticCoverage01;
00359 typedef CTemplateStaticCoverage2b<1,2> CStaticCoverage12;
00360 typedef CTemplateStaticCoverage2b<2,3> CStaticCoverage23;
00361
00362 typedef CTemplateStaticCoverage3a<0,1,3> CStaticCoverage013;
00363 typedef CTemplateStaticCoverage3a<2,3,0> CStaticCoverage023;
00364
00365 typedef CTemplateStaticCoverage3b<0,1,2> CStaticCoverage012;
00366 typedef CTemplateStaticCoverage3b<1,2,3> CStaticCoverage123;
00367
00368 typedef CTemplateStaticCoverage4 CStaticCoverage0123;
00369
00371 typedef CStaticCoverage123 CStaticCoverageVertex;
00372 typedef CStaticCoverage023 CStaticCoverageEdge;
00373 typedef CStaticCoverage013 CStaticCoverageFace;
00374 typedef CStaticCoverage012 CStaticCoverageVolume;
00375 typedef CStaticCoverage0123 CStaticCoverageCC;
00376
00377
00378
00379
00380
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390 #include "g-map-basic.hh"
00391 #include "dynamic-coverage.hh"
00392 #include <cassert>
00393
00394 namespace GMap3d
00395 {
00396
00397
00398
00399 template <int Ai>
00400 inline
00401 void CTemplateStaticCoverage1<Ai>::reinit()
00402 {
00403 FDoContinue = true;
00404 FDart1Active = true;
00405 }
00406
00407 template <int Ai>
00408 inline
00409 CTemplateStaticCoverage1<Ai>::CTemplateStaticCoverage1(CGMapBasic* AGMap,
00410 const CDart* ADart1) :
00411 CCoverage(AGMap), FDart1((CDart*) ADart1)
00412 {
00413 if (AGMap->isFree(FDart1, Ai))
00414 FDart2 = NULL;
00415 else
00416 FDart2 = AGMap->alpha(FDart1, Ai);
00417
00418 reinit();
00419 }
00420
00421 template <int Ai>
00422 inline
00423 CTemplateStaticCoverage1<Ai>::~CTemplateStaticCoverage1()
00424 {
00425 }
00426
00427 template <int Ai>
00428 inline
00429 bool CTemplateStaticCoverage1<Ai>::cont()
00430 {
00431 return FDoContinue;
00432 }
00433
00434
00435 template <int Ai>
00436 inline
00437 void CTemplateStaticCoverage1<Ai>::operator++()
00438 {
00439 if (! FDart1Active || FMap->isFree(FDart1, Ai))
00440 FDoContinue = false;
00441 else
00442 FDart1Active = false;
00443 }
00444
00445 template <int Ai>
00446 inline
00447 CDart* CTemplateStaticCoverage1<Ai>::operator*()
00448 {
00449 assert(cont());
00450
00451 if (FDart1Active)
00452 return FDart1;
00453 else
00454 return FDart2;
00455 }
00456
00457 template <int Ai>
00458 inline
00459 CDart* CTemplateStaticCoverage1<Ai>::operator ++(int)
00460 {
00461 CDart* tmp = operator*();
00462 operator++();
00463 return tmp;
00464 }
00465
00466 template <int Ai>
00467 inline
00468 int CTemplateStaticCoverage1<Ai>::type() const
00469 {
00470 return COVERAGE1;
00471 }
00472
00473
00474
00475 template <int Ai, int Aj>
00476 inline
00477 void CTemplateStaticCoverage2a<Ai,Aj>::reinit()
00478 {
00479 FIndex = 0;
00480 }
00481
00482 template <int Ai, int Aj>
00483 inline
00484 CTemplateStaticCoverage2a<Ai,Aj>::CTemplateStaticCoverage2a(CGMapBasic* AGMap,
00485 const CDart* ADart1)
00486 : CCoverage(AGMap)
00487 {
00488 int i = 0;
00489 CTemplateDynamicCoverage2a<Ai,Aj> it(AGMap, ADart1);
00490
00491 while (it.cont())
00492 FDart[i++] = it++;
00493
00494 while (i<4)
00495 FDart[i++] = NULL;
00496
00497 reinit();
00498 }
00499
00500 template <int Ai, int Aj>
00501 inline
00502 CTemplateStaticCoverage2a<Ai,Aj>::~CTemplateStaticCoverage2a()
00503 {
00504 }
00505
00506 template <int Ai, int Aj>
00507 inline
00508 bool CTemplateStaticCoverage2a<Ai,Aj>::cont()
00509 {
00510 if (FIndex > 3)
00511 return false;
00512 else
00513 return FDart[FIndex] != NULL;
00514 }
00515
00516 template <int Ai, int Aj>
00517 inline
00518 void CTemplateStaticCoverage2a<Ai,Aj>::operator++()
00519 {
00520 assert (cont());
00521 ++ FIndex;
00522 }
00523
00524 template <int Ai, int Aj>
00525 inline
00526 CDart* CTemplateStaticCoverage2a<Ai,Aj>::operator*()
00527 {
00528 assert(cont());
00529 return FDart[FIndex];
00530 }
00531
00532 template <int Ai, int Aj>
00533 inline
00534 CDart* CTemplateStaticCoverage2a<Ai,Aj>::operator ++(int)
00535 {
00536 CDart* tmp = operator *();
00537 operator++();
00538 return tmp;
00539 }
00540
00541 template <int Ai, int Aj>
00542 inline
00543 int CTemplateStaticCoverage2a<Ai,Aj>::type() const
00544 {
00545 return COVERAGE2A;
00546 }
00547
00548
00549
00550 inline
00551 void CGenericStaticCoverage::reinit()
00552 {
00553 FIt = FAllDarts.begin();
00554 }
00555
00556 inline
00557 CGenericStaticCoverage::CGenericStaticCoverage(CGMapBasic* AGMap) :
00558 CCoverage(AGMap)
00559 {
00560 }
00561
00562 inline
00563 CGenericStaticCoverage::~CGenericStaticCoverage()
00564 {
00565 }
00566
00567 inline
00568 bool CGenericStaticCoverage::cont()
00569 {
00570 return FIt != FAllDarts.end();
00571 }
00572
00573 inline
00574 void CGenericStaticCoverage::operator++()
00575 {
00576 assert(cont());
00577
00578 ++ FIt;
00579 }
00580
00581 inline
00582 CDart* CGenericStaticCoverage::operator*()
00583 {
00584 assert(cont());
00585
00586 return * FIt;
00587 }
00588
00589 inline
00590 CDart* CGenericStaticCoverage::operator++(int)
00591 {
00592 CDart* tmp = operator *();
00593 operator ++();
00594 return tmp;
00595 }
00596
00597
00598
00599 template <int Ai, int Aj>
00600 inline
00601 CTemplateStaticCoverage2b<Ai,Aj>::CTemplateStaticCoverage2b(CGMapBasic* AGMap,
00602 const CDart* ADart1)
00603 : CGenericStaticCoverage(AGMap)
00604 {
00605 CTemplateDynamicCoverage2b<Ai,Aj> it(AGMap, ADart1);
00606
00607 while (it.cont())
00608 FAllDarts.push_back(it++);
00609
00610 reinit();
00611 }
00612
00613 template <int Ai, int Aj>
00614 inline
00615 CTemplateStaticCoverage2b<Ai,Aj>::~CTemplateStaticCoverage2b()
00616 {
00617 }
00618
00619 template <int Ai, int Aj>
00620 inline
00621 int CTemplateStaticCoverage2b<Ai,Aj>::type() const
00622 {
00623 return COVERAGE2B;
00624 }
00625
00626
00627
00628 template <int Ai, int Aj, int Ak>
00629 inline
00630 CTemplateStaticCoverage3a<Ai,Aj,Ak>::
00631 CTemplateStaticCoverage3a(CGMapBasic* AGMap, const CDart* ADart1) :
00632 CGenericStaticCoverage(AGMap)
00633 {
00634 CTemplateDynamicCoverage3a<Ai,Aj,Ak> it(AGMap, ADart1);
00635
00636 while (it.cont())
00637 FAllDarts.push_back(it++);
00638
00639 reinit();
00640 }
00641
00642 template <int Ai, int Aj, int Ak>
00643 inline
00644 CTemplateStaticCoverage3a<Ai,Aj,Ak>::~CTemplateStaticCoverage3a()
00645 {
00646 }
00647
00648 template <int Ai, int Aj, int Ak>
00649 inline
00650 int CTemplateStaticCoverage3a<Ai,Aj,Ak>::type() const
00651 {
00652 return COVERAGE3A;
00653 }
00654
00655
00656
00657 template <int Ai, int Aj, int Ak>
00658 inline
00659 CTemplateStaticCoverage3b<Ai,Aj,Ak>::
00660 CTemplateStaticCoverage3b(CGMapBasic* AGMap, const CDart* ADart1) :
00661 CGenericStaticCoverage(AGMap)
00662 {
00663 int markNumber = AGMap->getNewMark();
00664 CTemplateBasicDynamicCoverage3b<Ai,Aj,Ak> it(AGMap, ADart1, markNumber);
00665
00666 while (it.cont())
00667 FAllDarts.push_back(it++);
00668
00669 FIt = FAllDarts.begin();
00670
00671 while (FIt != FAllDarts.end())
00672 {
00673 AGMap->unsetMark(* FIt, markNumber);
00674 ++ FIt;
00675 }
00676
00677 AGMap->freeMark(markNumber);
00678
00679 reinit();
00680 }
00681
00682 template <int Ai, int Aj, int Ak>
00683 inline
00684 CTemplateStaticCoverage3b<Ai,Aj,Ak>::~CTemplateStaticCoverage3b()
00685 {
00686 }
00687
00688 template <int Ai, int Aj, int Ak>
00689 inline
00690 int CTemplateStaticCoverage3b<Ai,Aj,Ak>::type() const
00691 {
00692 return COVERAGE3B;
00693 }
00694
00695
00696
00697 inline
00698 CTemplateStaticCoverage4::CTemplateStaticCoverage4(CGMapBasic* AGMap,
00699 const CDart* ADart1) :
00700 CGenericStaticCoverage(AGMap)
00701 {
00702 int markNumber = AGMap->getNewMark();
00703 CTemplateBasicDynamicCoverage4 it(AGMap, ADart1, markNumber);
00704
00705 while (it.cont())
00706 FAllDarts.push_back(it++);
00707
00708 FIt = FAllDarts.begin();
00709
00710 while (FIt != FAllDarts.end())
00711 {
00712 AGMap->unsetMark(* FIt, markNumber);
00713 ++ FIt;
00714 }
00715
00716 AGMap->freeMark(markNumber);
00717
00718 reinit();
00719 }
00720
00721 inline
00722 CTemplateStaticCoverage4::~CTemplateStaticCoverage4()
00723 {
00724 }
00725
00726 inline
00727 int CTemplateStaticCoverage4::type() const
00728 {
00729 return COVERAGE4;
00730 }
00731
00732
00733
00734 inline
00735 CStaticCoverageAll::CStaticCoverageAll(CGMapBasic* AGMap)
00736 : CGenericStaticCoverage(AGMap)
00737 {
00738 CDynamicCoverageAll it(AGMap);
00739
00740 while (it.cont())
00741 FAllDarts.push_back(it++);
00742
00743 reinit();
00744 }
00745
00746 inline
00747 CStaticCoverageAll::~CStaticCoverageAll()
00748 {
00749 }
00750
00751 inline
00752 int CStaticCoverageAll::type() const
00753 {
00754 return COVERAGE_ALL;
00755 }
00756
00757
00758
00759 inline
00760 CStaticBorderCoverage::CStaticBorderCoverage(CGMapBasic* AGMap,
00761 const CDart* ADart1,
00762 int ADimension) :
00763 CGenericStaticCoverage(AGMap)
00764 {
00765 int markNumber = AGMap->getNewMark();
00766 CBasicBorderCoverage it(AGMap, ADart1, markNumber, ADimension);
00767
00768 while (it.cont())
00769 FAllDarts.push_back(it++);
00770
00771 FIt = FAllDarts.begin();
00772
00773 while (FIt != FAllDarts.end())
00774 {
00775 AGMap->unsetMark(* FIt, markNumber);
00776 ++ FIt;
00777 }
00778
00779 AGMap->freeMark(markNumber);
00780
00781 reinit();
00782 }
00783
00784 inline
00785 CStaticBorderCoverage::~CStaticBorderCoverage()
00786 {
00787 }
00788
00789 inline
00790 int CStaticBorderCoverage::type() const
00791 {
00792 return COVERAGE_BORDER;
00793 }
00794
00795 }
00796
00797 #endif // STATIC_COVERAGE_HH
00798