Moka kernel
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
static-coverage.hh
Go to the documentation of this file.
1 /*
2  * lib-gmapkernel : Un noyau de 3-G-cartes et des opérations.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of lib-gmapkernel
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 //******************************************************************************
25 #ifndef STATIC_COVERAGE_HH
26 #define STATIC_COVERAGE_HH
27 //******************************************************************************
28 #include "coverage.hh"
29 #include "dynamic-coverage.hh"
30 #include "inline-macro.hh"
31 
32 #include <list>
33 //******************************************************************************
34 namespace GMap3d
35 {
36  //----------------------------------------------------------------------------
43  template <int Ai>
45  {
46  private:
47  // @name Champs privés
48  // @{
49 
51  CDart* FDart1;
52 
54  CDart* FDart2;
55 
57  bool FDoContinue;
58 
60  bool FDart1Active;
61 
62  // @}
63 
64  public:
65  // @name Constructeur et destructeur
66  // @{
67 
69  CTemplateStaticCoverage1(CGMapBasic* AGMap, const CDart* ADart1);
71  virtual ~CTemplateStaticCoverage1();
72 
73  // @}
74 
75  // @name Opérateurs de parcours (voir CCoverage)
76  // @{
77 
78  void reinit();
79  void operator++();
80  CDart* operator++(int);
81  bool cont();
82  CDart* operator*();
83  int type() const;
84 
85  // @}
86  };
87 
88  //----------------------------------------------------------------------------
95  template <int Ai, int Aj>
97  {
98  private:
99  // @name Champs privés
101 
103  CDart* FDart[4];
104 
106  int FIndex;
107 
109 
110  public:
111  // @name Constructeur et destructeur
112  // @{
113 
115  CTemplateStaticCoverage2a(CGMapBasic* AGMap, const CDart* ADart1);
117  virtual ~CTemplateStaticCoverage2a();
118 
119  // @}
120 
121  // @name Opérateurs de parcours (voir CCoverage)
122  // @{
123 
124  void reinit();
125  void operator++();
126  CDart* operator++(int);
127  bool cont();
128  CDart* operator*();
129  int type() const;
130 
131  // @}
132  };
133 
134  //----------------------------------------------------------------------------
141  {
142  protected:
143  // @name Champs protégés
144  // @{
145 
146  std::list<CDart*> FAllDarts;
147  std::list<CDart*>::iterator FIt;
148 
149  // @}
150 
151  public:
152  // @name Constructeurs et destructeur
153  // @{
154 
155  // Constructeur
157  // Destructeur
158  virtual ~CGenericStaticCoverage();
159 
160  // @}
161 
162  // @name Opérateurs de parcours (voir CCoverage)
163  // @{
164 
165  void reinit();
166  void operator++();
167  CDart* operator++(int);
168  bool cont();
169  CDart* operator*();
170 
171  // @}
172  };
173 
174  //----------------------------------------------------------------------------
181  template <int Ai, int Aj>
183  {
184  public:
185  //@name Constructeurs et destructeur
186  // @{
187 
188  // Constructeur
189  CTemplateStaticCoverage2b(CGMapBasic* AGMap, const CDart* ADart1);
190  // Destructeur
191  virtual ~CTemplateStaticCoverage2b();
192 
193  // @}
194 
195  // @name Opérateurs de parcours (voir CCoverage)
196  // @{
197  int type() const;
198  // @}
199 
200  };
201 
202  //----------------------------------------------------------------------------
209  template <int Ai, int Aj, int Ak>
211  {
212  public:
213  // @name Constructeur et destructeur
214  // @{
215 
216  // Constructeur
217  CTemplateStaticCoverage3a(CGMapBasic* AGMap, const CDart* ADart1);
218  // Destructeur
219  virtual ~CTemplateStaticCoverage3a();
220 
221  // @}
222 
223  // @name Opérateurs de parcours (voir CCoverage)
224  // @{
225  int type() const;
226  // @}
227 
228  };
229 
230  //----------------------------------------------------------------------------
237  template <int Ai, int Aj, int Ak>
239  {
240  public:
241  // @name Constructeur et destructeur
242  // @{
243 
244  // Constructeur
245  CTemplateStaticCoverage3b(CGMapBasic* AGMap, const CDart* ADart1);
246 
247  // Destructeur
248  virtual ~CTemplateStaticCoverage3b();
249 
250  // @}
251 
252  // @name Opérateurs de parcours (voir CCoverage)
253  // @{
254  int type() const;
255  // @}
256 
257  };
258 
259  //----------------------------------------------------------------------------
267  {
268  public:
269  // @name Constructeur et destructeur
270  // @{
271 
273  CTemplateStaticCoverage4(CGMapBasic* AGMap, const CDart* ADart1);
275  virtual ~CTemplateStaticCoverage4();
276 
277  // @}
278 
279  // @name Opérateurs de parcours (voir CCoverage)
280  // @{
281  int type() const;
282  // @}
283 
284  };
285 
286  //----------------------------------------------------------------------------
293  {
294  public:
295  // @name Constructeur et destructeur
296  // @{
297 
300 
302  virtual ~CStaticCoverageAll();
303 
304  // @}
305 
306  // @name Opérateurs de parcours (voir CCoverage)
307  // @{
308  int type() const;
309  // @}
310 
311  };
312 
313  //----------------------------------------------------------------------------
320  {
321  public:
322  // @name Constructeur et destructeur
323  // @{
324 
326  CStaticBorderCoverage(CGMapBasic* AGMap, const CDart* ADart1, int);
327 
329  virtual ~CStaticBorderCoverage();
330 
331  // @}
332 
333  // @name Opérateurs de parcours (voir CCoverage)
334  // @{
335  int type() const;
336  // @}
337 
338  };
339 
340  //----------------------------------------------------------------------------
341  // @name Noms usuels des itérateurs
342  // @{
343 
345 
348 
353 
357 
361 
364 
367 
369 
376 
377  // Autres itérateurs définis directement :
378  // CStaticCoverageAll(CGMapBasic*)
379  // CStaticBorderCoverage(CGMapBasic*, CDart*, int dim)
380 
381 } // namespace GMap3d
382 
383 //******************************************************************************
384 //******************************************************************************
385 //******************************************************************************
386 //- INLINE CODE
387 //******************************************************************************
388 //******************************************************************************
389 //******************************************************************************
390 #include "g-map-basic.hh"
391 #include "dynamic-coverage.hh"
392 #include <cassert>
393 //******************************************************************************
394 namespace GMap3d
395 {
396 //******************************************************************************
397 // CTemplateStaticCoverage1
398 //******************************************************************************
399 template <int Ai>
400 inline
402 {
403  FDoContinue = true;
404  FDart1Active = true;
405 }
406 //******************************************************************************
407 template <int Ai>
408 inline
410  const CDart* ADart1) :
411  CCoverage(AGMap), FDart1((CDart*) ADart1)
412 {
413  if (AGMap->isFree(FDart1, Ai))
414  FDart2 = NULL;
415  else
416  FDart2 = AGMap->alpha(FDart1, Ai);
417 
418  reinit();
419 }
420 //******************************************************************************
421 template <int Ai>
422 inline
424 {
425 }
426 //******************************************************************************
427 template <int Ai>
428 inline
430 {
431  return FDoContinue;
432 }
433 
434 //******************************************************************************
435 template <int Ai>
436 inline
438 {
439  if (! FDart1Active || FMap->isFree(FDart1, Ai))
440  FDoContinue = false;
441  else
442  FDart1Active = false;
443 }
444 //******************************************************************************
445 template <int Ai>
446 inline
448 {
449  assert(cont());
450 
451  if (FDart1Active)
452  return FDart1;
453  else
454  return FDart2;
455 }
456 //******************************************************************************
457 template <int Ai>
458 inline
460 {
461  CDart* tmp = operator*();
462  operator++();
463  return tmp;
464 }
465 //******************************************************************************
466 template <int Ai>
467 inline
469 {
470  return COVERAGE1;
471 }
472 //******************************************************************************
473 // CTemplateStaticCoverage2a
474 //******************************************************************************
475 template <int Ai, int Aj>
476 inline
478 {
479  FIndex = 0;
480 }
481 //******************************************************************************
482 template <int Ai, int Aj>
483 inline
485  const CDart* ADart1)
486  : CCoverage(AGMap)
487 {
488  int i = 0;
489  CTemplateDynamicCoverage2a<Ai,Aj> it(AGMap, ADart1);
490 
491  while (it.cont())
492  FDart[i++] = it++;
493 
494  while (i<4)
495  FDart[i++] = NULL;
496 
497  reinit();
498 }
499 //******************************************************************************
500 template <int Ai, int Aj>
501 inline
503 {
504 }
505 //******************************************************************************
506 template <int Ai, int Aj>
507 inline
509 {
510  if (FIndex > 3)
511  return false;
512  else
513  return FDart[FIndex] != NULL;
514 }
515 //******************************************************************************
516 template <int Ai, int Aj>
517 inline
519 {
520  assert (cont());
521  ++ FIndex;
522 }
523 //******************************************************************************
524 template <int Ai, int Aj>
525 inline
527 {
528  assert(cont());
529  return FDart[FIndex];
530 }
531 //******************************************************************************
532 template <int Ai, int Aj>
533 inline
535 {
536  CDart* tmp = operator *();
537  operator++();
538  return tmp;
539 }
540 //******************************************************************************
541 template <int Ai, int Aj>
542 inline
544 {
545  return COVERAGE2A;
546 }
547 //******************************************************************************
548 // CGenericStaticCoverage
549 //******************************************************************************
550 inline
552 {
553  FIt = FAllDarts.begin();
554 }
555 //******************************************************************************
556 inline
558  CCoverage(AGMap)
559 {
560 }
561 //******************************************************************************
562 inline
564 {
565 }
566 //******************************************************************************
567 inline
569 {
570  return FIt != FAllDarts.end();
571 }
572 //******************************************************************************
573 inline
575 {
576  assert(cont());
577 
578  ++ FIt;
579 }
580 //******************************************************************************
581 inline
583 {
584  assert(cont());
585 
586  return * FIt;
587 }
588 //******************************************************************************
589 inline
591 {
592  CDart* tmp = operator *();
593  operator ++();
594  return tmp;
595 }
596 //******************************************************************************
597 // CTemplateStaticCoverage2b
598 //******************************************************************************
599 template <int Ai, int Aj>
600 inline
602  const CDart* ADart1)
603  : CGenericStaticCoverage(AGMap)
604 {
605  CTemplateDynamicCoverage2b<Ai,Aj> it(AGMap, ADart1);
606 
607  while (it.cont())
608  FAllDarts.push_back(it++);
609 
610  reinit();
611 }
612 //******************************************************************************
613 template <int Ai, int Aj>
614 inline
616 {
617 }
618 //******************************************************************************
619 template <int Ai, int Aj>
620 inline
622 {
623  return COVERAGE2B;
624 }
625 //******************************************************************************
626 // CTemplateStaticCoverage3a
627 //******************************************************************************
628 template <int Ai, int Aj, int Ak>
629 inline
633 {
634  CTemplateDynamicCoverage3a<Ai,Aj,Ak> it(AGMap, ADart1);
635 
636  while (it.cont())
637  FAllDarts.push_back(it++);
638 
639  reinit();
640 }
641 //******************************************************************************
642 template <int Ai, int Aj, int Ak>
643 inline
645 {
646 }
647 //******************************************************************************
648 template <int Ai, int Aj, int Ak>
649 inline
651 {
652  return COVERAGE3A;
653 }
654 //******************************************************************************
655 // CTemplateStaticCoverage3b
656 //******************************************************************************
657 template <int Ai, int Aj, int Ak>
658 inline
662 {
663  int markNumber = AGMap->getNewMark();
664  CTemplateBasicDynamicCoverage3b<Ai,Aj,Ak> it(AGMap, ADart1, markNumber);
665 
666  while (it.cont())
667  FAllDarts.push_back(it++);
668 
669  FIt = FAllDarts.begin();
670 
671  while (FIt != FAllDarts.end())
672  {
673  AGMap->unsetMark(* FIt, markNumber);
674  ++ FIt;
675  }
676 
677  AGMap->freeMark(markNumber);
678 
679  reinit();
680 }
681 //******************************************************************************
682 template <int Ai, int Aj, int Ak>
683 inline
685 {
686 }
687 //******************************************************************************
688 template <int Ai, int Aj, int Ak>
689 inline
691 {
692  return COVERAGE3B;
693 }
694 //******************************************************************************
695 // CTemplateStaticCoverage4
696 //******************************************************************************
697 inline
699  const CDart* ADart1) :
701 {
702  int markNumber = AGMap->getNewMark();
703  CTemplateBasicDynamicCoverage4 it(AGMap, ADart1, markNumber);
704 
705  while (it.cont())
706  FAllDarts.push_back(it++);
707 
708  FIt = FAllDarts.begin();
709 
710  while (FIt != FAllDarts.end())
711  {
712  AGMap->unsetMark(* FIt, markNumber);
713  ++ FIt;
714  }
715 
716  AGMap->freeMark(markNumber);
717 
718  reinit();
719 }
720 //******************************************************************************
721 inline
723 {
724 }
725 //******************************************************************************
726 inline
728 {
729  return COVERAGE4;
730 }
731 //******************************************************************************
732 // CStaticCoverageAll
733 //******************************************************************************
734 inline
736  : CGenericStaticCoverage(AGMap)
737 {
738  CDynamicCoverageAll it(AGMap);
739 
740  while (it.cont())
741  FAllDarts.push_back(it++);
742 
743  reinit();
744 }
745 //******************************************************************************
746 inline
748 {
749 }
750 //******************************************************************************
751 inline
753 {
754  return COVERAGE_ALL;
755 }
756 //******************************************************************************
757 // CStaticBorderCoverage
758 //******************************************************************************
759 inline
761  const CDart* ADart1,
762  int ADimension) :
764 {
765  int markNumber = AGMap->getNewMark();
766  CBasicBorderCoverage it(AGMap, ADart1, markNumber, ADimension);
767 
768  while (it.cont())
769  FAllDarts.push_back(it++);
770 
771  FIt = FAllDarts.begin();
772 
773  while (FIt != FAllDarts.end())
774  {
775  AGMap->unsetMark(* FIt, markNumber);
776  ++ FIt;
777  }
778 
779  AGMap->freeMark(markNumber);
780 
781  reinit();
782 }
783 //******************************************************************************
784 inline
786 {
787 }
788 //******************************************************************************
789 inline
791 {
792  return COVERAGE_BORDER;
793 }
794 //******************************************************************************
795 } // namespace GMap3d
796 //******************************************************************************
797 #endif // STATIC_COVERAGE_HH
798 //******************************************************************************