Moka kernel
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dynamic-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 DYNAMIC_COVERAGE_HH
26 #define DYNAMIC_COVERAGE_HH
27 //******************************************************************************
28 #include "coverage.hh"
29 #include "inline-macro.hh"
30 
31 #include <list>
32 #include <queue>
33 #include <stack>
34 //******************************************************************************
35 namespace GMap3d
36 {
37  class CDart;
38  class CGMapBasic;
39 
40  //----------------------------------------------------------------------------
48  {
49  private:
50  // @name Champs privés
51  // @{
52 
54  CDart* FSelf;
55 
57  bool FDoContinue;
58 
59  // @}
60 
61  public:
62  // @name Constructeurs et destructeur
63  // @{
64 
66  CTemplateDynamicCoverage0(CGMapBasic* AGMap, const CDart* ADart);
69 
70  // @}
71  // @name Opérations de parcours (voir CCoverage)
72  // @{
73 
74  void reinit();
75  void operator++();
76  CDart* operator++(int);
77  bool cont();
78  CDart* operator*();
80  int type() const;
81 
83  };
84 
85  //----------------------------------------------------------------------------
91  template <int Ai>
93  {
94  private:
95  // @name Champs privés
96  // @{
97 
99  CDart* FDart1;
100 
102  bool FDoContinue;
103 
105  bool FDart1Active;
106 
107  // @}
108 
109  public:
110  // @name Constructeurs et destructeur
111  // @{
112 
114  CTemplateDynamicCoverage1(CGMapBasic* AGMap, const CDart* ADart);
116  virtual ~CTemplateDynamicCoverage1();
117 
118  // @}
119 
120  // @name Opérateurs de parcours (voir CCoverage)
121  // @{
122 
123  void reinit();
124  void operator++();
125  CDart* operator++(int);
126  bool cont();
127  CDart* operator*();
129  int type() const;
130 
131  // @}
132  };
133 
134  //----------------------------------------------------------------------------
141  template <int Ai, int Aj>
143  {
144  private:
145  // @name Champs privés
146  // @{
147 
149  CDart* FDart1;
151  CDart* FDartCurrent;
152 
157  bool FEven;
158 
160  TOperationState FPrevOp;
161 
162  // @}
163 
164  public:
165  // @name Constructeur et destructeur
166  // @{
167 
169  CTemplateDynamicCoverage2a(CGMapBasic* AGMap, const CDart* ADart);
171  virtual ~CTemplateDynamicCoverage2a();
172 
173  // @}
174 
175  // @name Opérateurs de parcours (voir CCoverage)
176  // @{
177 
178  void reinit();
179  void operator++();
180  CDart* operator++(int);
181  bool cont();
182  CDart* operator*();
184  int type() const;
185 
186  // @}
187  };
188 
189  //----------------------------------------------------------------------------
196  template <int Ai, int Aj>
198  {
199  private:
200  // @name Champs privés
201  // @{
202 
204  CDart* FDart1;
206  CDart* FDartCurrent;
207 
217  bool FFirstDirection;
218 
223  bool FNextTryAi;
224 
226  TOperationState FPrevOp;
227 
228  // @}
229 
230  public:
231  // @name Constructeur et destructeurs
232  // @{
233 
235  CTemplateDynamicCoverage2b(CGMapBasic* AGMap, const CDart* ADart);
237  virtual ~CTemplateDynamicCoverage2b();
238 
239  // @}
240 
241  // @name Opérateurs de parcours (voir CCoverage)
242  // @{
243 
244  void reinit();
245  void operator++();
246  CDart* operator++(int);
247  bool cont();
248  CDart* operator*();
250  int type() const;
251 
252  // @}
253  };
254 
255  //----------------------------------------------------------------------------
262  template <int Ai, int Aj, int Ak>
264  {
265  private:
266  // @name Champs privés
267  // @{
268 
271 
273  bool FAkExist;
274 
276  bool FFirstBorder;
277 
279  bool FPrevAk;
280 
282  TOperationState FPrevOp;
283 
284  // @}
285 
286  public:
287  // @name Constructeurs et destructeur
288  // @{
289 
291  CTemplateDynamicCoverage3a(CGMapBasic* AGMap, const CDart* ADart);
293  virtual ~CTemplateDynamicCoverage3a();
294 
295  // @}
296 
297  // @name Opérateurs de parcours (voir CCoverage)
298  // @{
299 
300  void reinit();
301  void operator++();
302  CDart* operator++(int);
303  bool cont();
304  CDart* operator*();
306  int type() const;
307 
308  // @}
309  };
310 
311  //----------------------------------------------------------------------------
319  template <int Ai, int Aj, int Ak>
321  {
322  private:
323  // @name Champs privés
324  // @{
325 
327  CDart* FDartCurrent;
328 
330  int FMarkNumber;
331 
333  std::queue<CDart*> FToTreat;
334 
336  TOperationState FPrevOp;
337 
338  // @}
339 
340  public:
341  // @name Constructeurs et destructeur
342  // @{
343 
346  const CDart* ADart, int AMarkNumber);
349 
350  // @}
351 
352  // @name Opérateurs de parcours (voir CCoverage)
353  // @{
354 
355  void reinit();
356  void operator++();
357  CDart* operator++(int);
358  bool cont();
359  CDart* operator*();
361  int type() const;
362 
363  // @}
364  };
365 
366  //----------------------------------------------------------------------------
375  {
376  private:
377  // @name Champs privés
378  // @{
379 
381  CDart* FDartCurrent;
382 
384  int FMarkNumber;
385 
387  std::queue<CDart*> FToTreat;
388 
390  TOperationState FPrevOp;
391 
392  // @}
393 
394  public:
395  // @name Constructeurs et destructeur
396  // @{
397 
399  CTemplateBasicDynamicCoverage4(CGMapBasic* AGMap, const CDart* ADart,
400  int AMarkNumber);
403 
404  // @}
405 
406  // @name Opérateurs de parcours (voir CCoverage)
407  // @{
408 
409  void reinit();
410  void operator++();
411  CDart* operator++(int);
412  bool cont();
413  CDart* operator*();
415  int type() const;
416 
417  // @}
418  };
419 
420  //----------------------------------------------------------------------------
427  template <int Ai, int Aj, int Ak>
429  {
430  private:
431  // @name Champs privés
432  // @{
433 
435  CDart* FDart1;
436 
438  int FMarkNumber;
439 
442 
443  // @}
444 
445  public:
446  // @name Constructeurs et destructeur
447  // @{
448 
450  CTemplateDynamicCoverage3b(CGMapBasic* AGMap, const CDart* ADart);
452  virtual ~CTemplateDynamicCoverage3b();
453 
454  // @}
455 
456  // @name Opérateurs de parcours (voir CCoverage)
457  // @{
458 
459  void reinit();
460  void operator++();
461  CDart* operator++(int);
462  bool cont();
463  CDart* operator*();
465  int type() const;
466 
467  // @}
468  };
469 
470  //----------------------------------------------------------------------------
478  {
479  private:
480  // @name Champs privés
481  // @{
482 
484  CDart* FDart1;
485 
487  int FMarkNumber;
488 
491 
492  // @}
493 
494  public:
495  // @name Constructeurs et destructeur
496  // @{
497 
499  CTemplateDynamicCoverage4(CGMapBasic* AGMap, const CDart* ADart);
501  virtual ~CTemplateDynamicCoverage4();
502 
503  // @}
504 
505  // @name Opérateurs de parcours (voir CCoverage)
506  // @{
507 
508  void reinit();
509  void operator++();
510  CDart* operator++(int);
511  bool cont();
512  CDart* operator*();
514  int type() const;
515 
516  // @}
517  };
518 
519  //----------------------------------------------------------------------------
529  template <int Ai, int Aj, int Ak>
531  {
532  private:
534  // @{
535 
537  int FMarkNumber;
538 
541 
543  std::list<CDart*> FAllCoverDarts;
544 
546  std::list<CDart*>::iterator FIt2;
547 
548  // @}
549 
550  public:
551  // @name Constructeurs et destructeur
552  // @{
553 
555  CTemplateMultiDynamicCoverage3b(CGMapBasic* AGMap, const CDart* ADart);
558 
559  // @}
560 
561  // @name Opérateurs de parcours (voir CCoverage)
562  // @{
563 
564  void reinit();
565  void operator++();
566  CDart* operator++(int);
567  bool cont();
568  CDart* operator*();
570  int type() const;
571 
572  // @}
573  };
574 
575  //----------------------------------------------------------------------------
586  {
587  private:
588  // @name Champs privés
589  // @{
590 
592  int FMarkNumber;
593 
596 
598  std::list<CDart*> FAllCoverDarts;
599 
601  std::list<CDart*>::iterator FIt2;
602 
603  // @}
604 
605  public:
606  // @name Constructeurs et destructeur
607  // @{
608 
610  CTemplateMultiDynamicCoverage4(CGMapBasic* AGMap, const CDart* ADart);
613 
614  // @}
615 
616  // @name Opérateurs de parcours (voir CCoverage)
617  // @{
618 
619  void reinit();
620  void operator++();
621  CDart* operator++(int);
622  bool cont();
623  CDart* operator*();
625  int type() const;
626 
627  // @}
628  };
629 
630  //----------------------------------------------------------------------------
637  {
638  private:
639  // @name Champs privés
640  // @{
641 
643  CDart* FCurrent;
644 
645  // @}
646 
647  public:
648  // @name Constructeur et destructeur
649  // @{
650 
654  virtual ~CDynamicCoverageAll();
655 
656  // @}
657 
658  // @name Opérateurs de parcours (voir CCoverage)
659  // @{
660 
661  void reinit();
662  void operator++();
663  CDart* operator++(int);
664  bool cont();
665  CDart* operator*();
667  int type() const;
668 
669  // @}
670  };
671 
672  //----------------------------------------------------------------------------
680  {
681  private:
682  // @name Champs privés
683  // @{
684 
686  CDart* FCurrentDart;
687 
689  int FMarkNumber;
690 
692  int FBorderDim;
693 
695  std::stack<CDart*> FToTreat;
696 
698  TOperationState FPrevOp;
699 
700  // @}
701 
702  public:
703  // @name Constructeur et destructeur
704  // @{
705 
707  CBasicBorderCoverage(CGMapBasic* AGMap, const CDart* ADart, int, int);
709  virtual ~CBasicBorderCoverage();
710 
711  // @}
712 
713  // @name Opérateurs de parcours (voir CCoverage)
714  // @{
715 
716  void reinit();
717  void operator++();
718  CDart* operator++(int);
719  bool cont();
720  CDart* operator*();
722  int type() const;
723 
724  // @}
725  };
726 
727  //----------------------------------------------------------------------------
734  {
735  private:
736  // @name Champs privés
737  // @{
738 
740  CDart* FDart1;
741 
743  int FBorderDim;
744 
746  int FMarkNumber;
747 
750 
751  // @}
752 
753  public:
754  // @name Constructeurs et destructeur
755  // @{
756 
758  CDynamicBorderCoverage(CGMapBasic* AGMap, const CDart* ADart, int);
760  virtual ~CDynamicBorderCoverage();
761 
762  // @}
763 
764  // @name Opérateurs de parcours (voir CCoverage)
765  // @{
766 
767  void reinit();
768  void operator++();
769  CDart* operator++(int);
770  bool cont();
771  CDart* operator*();
773  int type() const;
774 
775  // @}
776  };
777 
778  //----------------------------------------------------------------------------
779  // @name Noms usuels des itérateurs
780  // @{
781 
783 
788 
792 
796 
799 
802 
804 
811 
817 
821 
828 
832 
833  // @}
834 
835 } // namespace GMap3d
836 
837 //******************************************************************************
838 //******************************************************************************
839 //******************************************************************************
840 //- INLINE CODE
841 //******************************************************************************
842 //******************************************************************************
843 //******************************************************************************
844 
845 //******************************************************************************
846 #include "g-map-basic.hh"
847 #include "dart.hh"
848 
849 #include <cassert>
850 //******************************************************************************
851 namespace GMap3d
852 {
853 //******************************************************************************
854 // CTemplateDynamicCoverage0
855 //******************************************************************************
856 inline
858 {
859  FDoContinue = true;
860 }
861 //******************************************************************************
862 inline
864 {
865  return COVERAGE0;
866 }
867 //******************************************************************************
868 inline
870  const CDart* ADart1) :
871  CCoverage(AGMap),
872  FSelf ((CDart*) ADart1)
873 {
874  reinit();
875 }
876 //******************************************************************************
877 inline
879 {
880 }
881 //******************************************************************************
882 inline
884 {
885  return FDoContinue;
886 }
887 //******************************************************************************
888 inline
890 {
891  assert(cont());
892 
893  FDoContinue = false;
894 }
895 //******************************************************************************
896 inline
898 {
899  assert(cont());
900 
901  return FSelf;
902 }
903 //******************************************************************************
904 inline
906 {
907  CDart* tmp = operator*();
908 
909  operator++();
910  return tmp;
911 }
912 //******************************************************************************
913 inline
915 {
916  return FDoContinue ? OP_NONE : OP_END;
917 }
918 //******************************************************************************
919 // CTemplateDynamicCoverage1
920 //******************************************************************************
921 template <int Ai>
922 inline
924 {
925  FDoContinue = true;
926  FDart1Active = true;
927 }
928 //******************************************************************************
929 template <int Ai>
930 inline
932  const CDart* ADart1) :
933  CCoverage(AGMap),
934  FDart1 ((CDart*) ADart1)
935 {
936  reinit();
937 }
938 //******************************************************************************
939 template <int Ai>
940 inline
942 {
943 }
944 //******************************************************************************
945 template <int Ai>
946 inline
948 {
949  return FDoContinue;
950 }
951 //******************************************************************************
952 template <int Ai>
953 inline
955 {
956  assert(cont());
957 
958  if (! FDart1Active || FMap->isFree(FDart1, Ai))
959  FDoContinue = false;
960 
961  FDart1Active = false;
962 }
963 //******************************************************************************
964 template <int Ai>
965 inline
967 {
968  assert(cont());
969 
970  if (FDart1Active)
971  return FDart1;
972  else
973  return FMap->alpha(FDart1, Ai);
974 }
975 //******************************************************************************
976 template <int Ai>
977 inline
979 {
980  CDart* tmp = operator*();
981 
982  operator++();
983  return tmp;
984 }
985 //******************************************************************************
986 template <int Ai>
987 inline
989 {
990  if (FDoContinue)
991  return FDart1Active ? OP_NONE : OP_ALPHAI;
992  else
993  return OP_END;
994 }
995 //******************************************************************************
996 template <int Ai>
997 inline
999 {
1000  return COVERAGE1;
1001 }
1002 //******************************************************************************
1003 // CTemplateDynamicCoverage2a
1004 //******************************************************************************
1005 template <int Ai, int Aj>
1006 inline
1008 {
1009  FDartCurrent = FDart1;
1010  FEven = true;
1011  FPrevOp = OP_NONE;
1012 }
1013 //******************************************************************************
1014 template <int Ai, int Aj>
1015 inline
1018  CCoverage(AGMap),
1019  FDart1 ((CDart*) ADart1)
1020 {
1021  reinit();
1022 }
1023 //******************************************************************************
1024 template <int Ai, int Aj>
1025 inline
1027 {
1028 }
1029 //******************************************************************************
1030 template <int Ai, int Aj>
1031 inline
1033 {
1034  return FPrevOp != OP_END;
1035 }
1036 //******************************************************************************
1037 template <int Ai, int Aj>
1038 inline
1040 {
1041  assert(cont());
1042 
1043  if (FEven)
1044  {
1045  if (FMap->isFree(FDartCurrent, Ai))
1046  {
1047  if (FMap->isFree(FDartCurrent, Aj))
1048  FPrevOp = OP_END;
1049  else
1050  {
1051  FEven = ! FEven; // <=> à FEven = false
1052  FDartCurrent = FMap->alpha(FDartCurrent, Aj);
1053  FPrevOp = OP_ALPHAJ;
1054  }
1055  }
1056  else
1057  {
1058  FEven = ! FEven; // <=> à FEven = false
1059  FDartCurrent = FMap->alpha(FDartCurrent, Ai);
1060  FPrevOp =OP_ALPHAI;
1061  }
1062  }
1063  else
1064  {
1065  if (FMap->alpha(FDartCurrent, Ai) == FDart1)
1066  {
1067  if (! FMap->isFree(FDartCurrent, Aj))
1068  {
1069  FEven = ! FEven; // <=> à FEven = true
1070  FDartCurrent = FMap->alpha(FDartCurrent, Aj);
1071  FPrevOp = OP_ALPHAJ;
1072  }
1073  else
1074  FPrevOp = OP_END;
1075  }
1076  else
1077  FPrevOp = OP_END;
1078  }
1079 }
1080 //******************************************************************************
1081 template <int Ai, int Aj>
1082 inline
1084 {
1085  return FPrevOp;
1086 }
1087 //******************************************************************************
1088 template <int Ai, int Aj>
1089 inline
1091 {
1092  assert(cont());
1093  return FDartCurrent;
1094 }
1095 //******************************************************************************
1096 template <int Ai, int Aj>
1097 inline
1099 {
1100  CDart* tmp = operator*();
1101 
1102  operator++();
1103  return tmp;
1104 }
1105 //******************************************************************************
1106 template <int Ai, int Aj>
1107 inline
1109 {
1110  return COVERAGE2A;
1111 }
1112 //******************************************************************************
1113 // CTemplateDynamicCoverage2b
1114 //******************************************************************************
1115 template <int Ai, int Aj>
1116 inline
1118 {
1119  FDartCurrent = FDart1;
1120  FFirstDirection = true;
1121  FNextTryAi = true;
1122  FPrevOp = OP_NONE;
1123 }
1124 //******************************************************************************
1125 template <int Ai, int Aj>
1126 inline
1129  CCoverage(AGMap),
1130  FDart1 ((CDart*) ADart1)
1131 {
1132  reinit();
1133 }
1134 //******************************************************************************
1135 template <int Ai, int Aj>
1136 inline
1138 {
1139 }
1140 //******************************************************************************
1141 template <int Ai, int Aj>
1142 inline
1144 {
1145  return FPrevOp != OP_END;
1146 }
1147 //******************************************************************************
1148 template <int Ai, int Aj>
1149 inline
1151 {
1152  assert(cont());
1153 
1154  if (FFirstDirection)
1155  {
1156  if (FNextTryAi)
1157  {
1158  if (FMap->isFree(FDartCurrent, Ai))
1159  {
1160  FFirstDirection = false;
1161  if (FMap->isFree(FDart1, Aj))
1162  FPrevOp = OP_END;
1163  else
1164  {
1165  FDartCurrent = FMap->alpha(FDart1, Aj);
1166  FPrevOp = OP_JUMP;
1167  }
1168  }
1169  else
1170  {
1171  FDartCurrent = FMap->alpha(FDartCurrent, Ai);
1172  FNextTryAi = false;
1173  FPrevOp = OP_ALPHAI;
1174  }
1175  }
1176  else
1177  {
1178  if (FMap->isFree(FDartCurrent, Aj))
1179  {
1180  FFirstDirection = false;
1181  if (FMap->isFree(FDart1, Aj))
1182  FPrevOp = OP_END;
1183  else
1184  {
1185  FDartCurrent = FMap->alpha(FDart1, Aj);
1186  FNextTryAi = true;
1187  FPrevOp = OP_JUMP;
1188  }
1189  }
1190  else
1191  {
1192  FDartCurrent = FMap->alpha(FDartCurrent, Aj);
1193  if (FDartCurrent == FDart1)
1194  FPrevOp = OP_END;
1195  else
1196  {
1197  FNextTryAi = true;
1198  FPrevOp = OP_ALPHAJ;
1199  }
1200  }
1201  }
1202  }
1203  else
1204  {
1205  if (FNextTryAi)
1206  {
1207  if (FMap->isFree(FDartCurrent, Ai))
1208  FPrevOp = OP_END;
1209  else
1210  {
1211  FDartCurrent = FMap->alpha(FDartCurrent, Ai);
1212  FNextTryAi = false;
1213  FPrevOp = OP_ALPHAI;
1214  }
1215  }
1216  else
1217  {
1218  if (FMap->isFree(FDartCurrent, Aj))
1219  FPrevOp = OP_END;
1220  else
1221  {
1222  FDartCurrent = FMap->alpha(FDartCurrent, Aj);
1223  FNextTryAi = true;
1224  FPrevOp = OP_ALPHAJ;
1225  }
1226  }
1227  }
1228 }
1229 //******************************************************************************
1230 template <int Ai, int Aj>
1231 inline
1233 {
1234  return FPrevOp;
1235 }
1236 //******************************************************************************
1237 template <int Ai, int Aj>
1238 inline
1240 {
1241  assert(cont());
1242 
1243  return FDartCurrent;
1244 }
1245 //******************************************************************************
1246 template <int Ai, int Aj>
1247 inline
1249 {
1250  CDart* tmp = operator*();
1251  operator++();
1252  return tmp;
1253 }
1254 //******************************************************************************
1255 template <int Ai, int Aj>
1256 inline
1258 {
1259  return COVERAGE2B;
1260 }
1261 //******************************************************************************
1262 // CTemplateDynamicCoverage3a
1263 //******************************************************************************
1264 template <int Ai, int Aj, int Ak>
1265 inline
1267 {
1268  FFirstBorder = true;
1269  FPrevAk = false;
1270  FIt.reinit();
1271 }
1272 //******************************************************************************
1273 template <int Ai, int Aj, int Ak>
1274 inline
1277  CCoverage(AGMap),
1278  FIt (AGMap, ADart1)
1279 {
1280  FAkExist = ! FMap->isFree(ADart1, Ak);
1281  reinit();
1282 }
1283 //******************************************************************************
1284 template <int Ai, int Aj, int Ak>
1285 inline
1287 {
1288 }
1289 //******************************************************************************
1290 template <int Ai, int Aj, int Ak>
1291 inline
1293 {
1294  return FIt.cont();
1295 }
1296 //******************************************************************************
1297 template <int Ai, int Aj, int Ak>
1298 inline
1300 {
1301  assert(cont());
1302 
1303  if (! FAkExist || FPrevAk)
1304  {
1305  ++ FIt;
1306 
1307  if (FIt.cont())
1308  {
1309  if (FIt.prevOperationType() == OP_JUMP)
1310  FFirstBorder = true;
1311 
1312  FPrevAk = false;
1313  }
1314  }
1315  else
1316  {
1317  FPrevAk = true;
1318  FFirstBorder = ! FFirstBorder;
1319  }
1320 }
1321 //******************************************************************************
1322 template <int Ai, int Aj, int Ak>
1323 inline
1325 {
1326  assert(cont());
1327 
1328  if (FFirstBorder)
1329  return * FIt;
1330  else
1331  return FMap->alpha(* FIt, Ak);
1332 }
1333 //******************************************************************************
1334 template <int Ai, int Aj, int Ak>
1335 inline
1337 {
1338  CDart* tmp = operator*();
1339  operator++();
1340  return tmp;
1341 }
1342 //******************************************************************************
1343 template <int Ai, int Aj, int Ak>
1344 inline
1346 {
1347  if (FPrevAk)
1348  return OP_ALPHAK;
1349  else
1350  return FIt.prevOperationType();
1351 }
1352 //******************************************************************************
1353 template <int Ai, int Aj, int Ak>
1354 inline
1356 {
1357  return COVERAGE3A;
1358 }
1359 //******************************************************************************
1360 // CTemplateBasicDynamicCoverage3b
1361 //******************************************************************************
1362 template <int Ai, int Aj, int Ak>
1363 inline
1366  int AMarkNumber) :
1367  CCoverage (AGMap),
1368  FDartCurrent((CDart*) ADart1),
1369  FMarkNumber (AMarkNumber),
1370  FPrevOp (OP_NONE)
1371 {
1372  FMap->setMark(FDartCurrent, FMarkNumber);
1373 }
1374 //******************************************************************************
1375 template <int Ai, int Aj, int Ak>
1376 inline
1378 {
1379 }
1380 //******************************************************************************
1381 template <int Ai, int Aj, int Ak>
1382 inline
1384 {
1385  return FPrevOp != OP_END;
1386 }
1387 //******************************************************************************
1388 template <int Ai, int Aj, int Ak>
1389 inline
1391 {
1392 }
1393 //******************************************************************************
1394 template <int Ai, int Aj, int Ak>
1395 inline
1397 {
1398 #define GET_ALPHAI_AND_MARK(D,AI) \
1399 ( FMap->setMark(FMap->alpha(D,AI), FMarkNumber), FMap->alpha(D,AI) )
1400 
1401 #define IS_UNMARKED(D,AI) \
1402 ( ! FMap->isMarked(FMap->alpha(D,AI), FMarkNumber) )
1403 
1404 #define PUSH_AND_MARK(D,AI) \
1405 ( FToTreat.push(GET_ALPHAI_AND_MARK(D,AI)) )
1406 
1407  assert(cont());
1408 
1409  CDart* nd = NULL;
1410 
1411  if (IS_UNMARKED(FDartCurrent, Ai))
1412  {
1413  nd = GET_ALPHAI_AND_MARK(FDartCurrent, Ai);
1414  FPrevOp = OP_ALPHAI;
1415 
1416  if (IS_UNMARKED(FDartCurrent, Aj))
1417  PUSH_AND_MARK(FDartCurrent, Aj);
1418 
1419  if (IS_UNMARKED(FDartCurrent, Ak))
1420  PUSH_AND_MARK(FDartCurrent, Ak);
1421  }
1422  else if (IS_UNMARKED(FDartCurrent, Aj)) // not marked aj(d)
1423  {
1424  nd = GET_ALPHAI_AND_MARK(FDartCurrent, Aj);
1425  FPrevOp = OP_ALPHAJ;
1426 
1427  if (IS_UNMARKED(FDartCurrent, Ak))
1428  PUSH_AND_MARK(FDartCurrent, Ak);
1429  }
1430  else if (IS_UNMARKED(FDartCurrent, Ak)) // not marked ak(d)
1431  {
1432  nd = GET_ALPHAI_AND_MARK(FDartCurrent, Ak);
1433  FPrevOp = OP_ALPHAK;
1434  }
1435  else if (! FToTreat.empty())
1436  {
1437  nd = FToTreat.front();
1438  FToTreat.pop();
1439  FPrevOp = OP_JUMP;
1440  }
1441  else
1442  FPrevOp = OP_END;
1443 
1444  FDartCurrent = nd;
1445 
1446 #undef PUSH_AND_MARK
1447 #undef IS_SEWED_AND_UNMARKED
1448 }
1449 //******************************************************************************
1450 template <int Ai, int Aj, int Ak>
1451 inline
1453 {
1454  return FPrevOp;
1455 }
1456 //******************************************************************************
1457 template <int Ai, int Aj, int Ak>
1458 inline
1460 {
1461  assert(cont());
1462  return FDartCurrent;
1463 }
1464 //******************************************************************************
1465 template <int Ai, int Aj, int Ak>
1466 inline
1468 {
1469  CDart* tmp = operator*();
1470  operator ++();
1471  return tmp;
1472 }
1473 //******************************************************************************
1474 template <int Ai, int Aj, int Ak>
1475 inline
1477 {
1478  return COVERAGE3B;
1479 }
1480 //******************************************************************************
1481 // CTemplateBasicDynamicCoverage4
1482 //******************************************************************************
1483 inline
1486  int AMarkNumber) :
1487  CCoverage (AGMap),
1488  FDartCurrent((CDart*) ADart1),
1489  FMarkNumber (AMarkNumber),
1490  FPrevOp (OP_NONE)
1491 {
1492  FMap->setMark(FDartCurrent, FMarkNumber);
1493 }
1494 //******************************************************************************
1495 inline
1497 {
1498 }
1499 //******************************************************************************
1500 inline
1502 {
1503  return FPrevOp != OP_END;
1504 }
1505 //******************************************************************************
1506 inline
1508 {
1509 }
1510 //******************************************************************************
1511 inline
1513 {
1514  assert(cont());
1515 
1516  CDart*nd=NULL;
1517 
1518 #define IS_SEWED_AND_UNMARKED(D,AI) \
1519 ! FMap->isFree(D,AI) && ! FMap->isMarked(FMap->alpha(D,AI), FMarkNumber)
1520 
1521  if (IS_SEWED_AND_UNMARKED(FDartCurrent,0))
1522  {
1523  nd = FMap->alpha0(FDartCurrent);
1524  FMap->setMark(nd, FMarkNumber);
1525  FPrevOp = OP_ALPHA0;
1526 
1527  if (IS_SEWED_AND_UNMARKED(FDartCurrent, 1))
1528  {
1529  FToTreat.push(FMap->alpha1(FDartCurrent));
1530  FMap->setMark(FMap->alpha1(FDartCurrent),FMarkNumber);
1531  }
1532 
1533  if (IS_SEWED_AND_UNMARKED(FDartCurrent, 2))
1534  {
1535  FToTreat.push(FMap->alpha2(FDartCurrent));
1536  FMap->setMark(FMap->alpha2(FDartCurrent), FMarkNumber);
1537  }
1538 
1539  if (IS_SEWED_AND_UNMARKED(FDartCurrent, 3))
1540  {
1541  FToTreat.push(FMap->alpha3(FDartCurrent));
1542  FMap->setMark(FMap->alpha3(FDartCurrent), FMarkNumber);
1543  }
1544  }
1545  else if (IS_SEWED_AND_UNMARKED(FDartCurrent, 1))
1546  {
1547  nd = FMap->alpha1(FDartCurrent);
1548  FMap->setMark(nd, FMarkNumber);
1549  FPrevOp = OP_ALPHA1;
1550 
1551  if (IS_SEWED_AND_UNMARKED(FDartCurrent, 2))
1552  {
1553  FToTreat.push(FMap->alpha2(FDartCurrent));
1554  FMap->setMark(FMap->alpha2(FDartCurrent), FMarkNumber);
1555  }
1556 
1557  if (IS_SEWED_AND_UNMARKED(FDartCurrent, 3))
1558  {
1559  FToTreat.push(FMap->alpha3(FDartCurrent));
1560  FMap->setMark(FMap->alpha3(FDartCurrent), FMarkNumber);
1561  }
1562  }
1563  else if (IS_SEWED_AND_UNMARKED(FDartCurrent, 2))
1564  {
1565  nd = FMap->alpha2(FDartCurrent);
1566  FMap->setMark(nd, FMarkNumber);
1567  FPrevOp = OP_ALPHA2;
1568 
1569  if (IS_SEWED_AND_UNMARKED(FDartCurrent, 3))
1570  {
1571  FToTreat.push(FMap->alpha3(FDartCurrent));
1572  FMap->setMark(FMap->alpha3(FDartCurrent), FMarkNumber);
1573  }
1574  }
1575  else if (IS_SEWED_AND_UNMARKED(FDartCurrent, 3))
1576  {
1577  nd = FMap->alpha3(FDartCurrent);
1578  FMap->setMark(nd, FMarkNumber);
1579  FPrevOp = OP_ALPHA3;
1580  }
1581  else if (! FToTreat.empty())
1582  {
1583  nd = FToTreat.front();
1584  FToTreat.pop();
1585  FPrevOp = OP_UNKNOWN;
1586  }
1587  else
1588  FPrevOp = OP_END;
1589 
1590 #undef IS_SEWED_AND_UNMARKED
1591 
1592  FDartCurrent = nd;
1593 }
1594 //******************************************************************************
1595 inline
1597 {
1598  return FPrevOp;
1599 }
1600 //******************************************************************************
1601 inline
1603 {
1604  assert(cont());
1605 
1606  return FDartCurrent;
1607 }
1608 //******************************************************************************
1609 inline
1611 {
1612  CDart* tmp = operator*();
1613 
1614  operator++();
1615  return tmp;
1616 }
1617 //******************************************************************************
1618 inline
1620 {
1621  return COVERAGE4;
1622 }
1623 //******************************************************************************
1624 // CTemplateDynamicCoverage3b
1625 //******************************************************************************
1626 template <int Ai, int Aj, int Ak>
1627 inline
1629 {
1630  if (FIt != NULL)
1631  {
1632  delete FIt;
1633 
1634  FMap->negateMaskMark(FMarkNumber);
1635 
1637  (FMap, FDart1, FMarkNumber);
1638 
1639  while (FIt->cont())
1640  ++ * FIt;
1641 
1642  FMap->negateMaskMark(FMarkNumber);
1643  delete FIt;
1644  }
1645 
1647  (FMap, FDart1, FMarkNumber);
1648 }
1649 //******************************************************************************
1650 template <int Ai, int Aj, int Ak>
1651 inline
1654  CCoverage(AGMap),
1655  FDart1 ((CDart*) ADart1),
1656  FIt (NULL)
1657 {
1658  FMarkNumber = FMap->getNewMark();
1659  reinit();
1660 }
1661 //******************************************************************************
1662 template <int Ai, int Aj, int Ak>
1663 inline
1665 {
1666  delete FIt;
1667 
1668  FMap->negateMaskMark(FMarkNumber);
1669 
1670  FIt =
1671  new CTemplateBasicDynamicCoverage3b<Ai,Aj,Ak>(FMap, FDart1, FMarkNumber);
1672 
1673  while (FIt->cont())
1674  ++ * FIt;
1675 
1676  FMap->negateMaskMark(FMarkNumber);
1677 
1678  delete FIt;
1679 
1680  FMap->freeMark(FMarkNumber);
1681 }
1682 //******************************************************************************
1683 template <int Ai, int Aj, int Ak>
1684 inline
1686 {
1687  return FIt->cont();
1688 }
1689 //******************************************************************************
1690 template <int Ai, int Aj, int Ak>
1691 inline
1693 {
1694  FIt->operator++();
1695 }
1696 //******************************************************************************
1697 template <int Ai, int Aj, int Ak>
1698 inline
1700 {
1701  return FIt->prevOperationType();
1702 }
1703 //******************************************************************************
1704 template <int Ai, int Aj, int Ak>
1705 inline
1707 {
1708  return FIt->operator*();
1709 }
1710 //******************************************************************************
1711 template <int Ai, int Aj, int Ak>
1712 inline
1714 {
1715  CDart* tmp = operator*();
1716  operator++();
1717  return tmp;
1718 }
1719 //******************************************************************************
1720 template <int Ai, int Aj, int Ak>
1721 inline
1723 {
1724  return COVERAGE3B;
1725 }
1726 //******************************************************************************
1727 // CTemplateDynamicCoverage4
1728 //******************************************************************************
1729 inline
1731 {
1732  if (FIt != NULL)
1733  {
1734  delete FIt;
1735 
1736  FMap->negateMaskMark(FMarkNumber);
1737 
1738  FIt = new CTemplateBasicDynamicCoverage4(FMap, FDart1, FMarkNumber);
1739 
1740  while (FIt->cont())
1741  ++ * FIt;
1742 
1743  FMap->negateMaskMark(FMarkNumber);
1744 
1745  delete FIt;
1746  }
1747 
1748  FIt = new CTemplateBasicDynamicCoverage4(FMap, FDart1, FMarkNumber);
1749 }
1750 //******************************************************************************
1751 inline
1753  const CDart* ADart1) :
1754  CCoverage(AGMap),
1755  FDart1 ((CDart*) ADart1),
1756  FIt (NULL)
1757 {
1758  FMarkNumber = FMap->getNewMark();
1759  reinit();
1760 }
1761 //******************************************************************************
1762 inline
1764 {
1765  delete FIt;
1766 
1767  FMap->negateMaskMark(FMarkNumber);
1768 
1769  FIt = new CTemplateBasicDynamicCoverage4(FMap, FDart1, FMarkNumber);
1770 
1771  while (FIt->cont())
1772  ++ * FIt;
1773 
1774  FMap->negateMaskMark(FMarkNumber);
1775 
1776  delete FIt;
1777 
1778  FMap->freeMark(FMarkNumber);
1779 }
1780 //******************************************************************************
1781 inline
1783 {
1784  return FIt->cont();
1785 }
1786 //******************************************************************************
1787 inline
1789 {
1790  FIt->operator++();
1791 }
1792 //******************************************************************************
1793 inline
1795 {
1796  return FIt->prevOperationType();
1797 }
1798 //******************************************************************************
1799 inline
1801 {
1802  return FIt->operator*();
1803 }
1804 //******************************************************************************
1805 inline
1807 {
1808  CDart* tmp = operator*();
1809  operator++();
1810  return tmp;
1811 }
1812 //******************************************************************************
1813 inline
1815 {
1816  return COVERAGE4;
1817 }
1818 //******************************************************************************
1819 // CTemplateMultiDynamicCoverage3b
1820 //******************************************************************************
1821 template <int Ai, int Aj, int Ak>
1822 inline
1824 {
1825  if (FIt1 != NULL)
1826  {
1827  delete FIt1;
1828  FIt1 = NULL;
1829  }
1830 
1831  FIt2 = FAllCoverDarts.begin();
1832 }
1833 //******************************************************************************
1834 template <int Ai, int Aj, int Ak>
1835 inline
1838  CCoverage(AGMap)
1839 {
1840  FMarkNumber = AGMap->getNewMark();
1841  FIt1 = new CTemplateBasicDynamicCoverage3b<Ai,Aj,Ak>(AGMap, ADart1,
1842  FMarkNumber);
1843 }
1844 //******************************************************************************
1845 template <int Ai, int Aj, int Ak>
1846 inline
1848 {
1849  if (FIt1 != NULL)
1850  delete FIt1;
1851 
1852  while (! FAllCoverDarts.empty())
1853  {
1854  FMap->unsetMark(FAllCoverDarts.front(), FMarkNumber);
1855  FAllCoverDarts.pop_front();
1856  }
1857 
1858  FMap->freeMark(FMarkNumber);
1859 }
1860 //******************************************************************************
1861 template <int Ai, int Aj, int Ak>
1862 inline
1864 {
1865  if (FIt1 != NULL)
1866  return FIt1->cont();
1867  else
1868  return FIt2 != FAllCoverDarts.end();
1869 }
1870 //******************************************************************************
1871 template <int Ai, int Aj, int Ak>
1872 inline
1874 {
1875  if (FIt1 != NULL)
1876  FIt1->operator++();
1877  else
1878  ++FIt2;
1879 }
1880 //******************************************************************************
1881 template <int Ai, int Aj, int Ak>
1882 inline
1884 {
1885  if (FIt1 != NULL)
1886  return FIt1->prevOperationType();
1887  else
1888  return OP_UNKNOWN;
1889 }
1890 //******************************************************************************
1891 template <int Ai, int Aj, int Ak>
1892 inline
1894 {
1895  assert(cont());
1896 
1897  if (FIt1 != NULL)
1898  return FIt1->operator*();
1899  else
1900  return * FIt2;
1901 }
1902 //******************************************************************************
1903 template <int Ai, int Aj, int Ak>
1904 inline
1906 {
1907  CDart* tmp = operator*();
1908  operator ++();
1909  return tmp;
1910 }
1911 //******************************************************************************
1912 template <int Ai, int Aj, int Ak>
1913 inline
1915 {
1916  return COVERAGE3B;
1917 }
1918 //******************************************************************************
1919 // CTemplateMultiDynamicCoverage4
1920 //******************************************************************************
1921 inline
1923 {
1924  if (FIt1 != NULL)
1925  {
1926  delete FIt1;
1927  FIt1 = NULL;
1928  }
1929 
1930  FIt2 = FAllCoverDarts.begin();
1931 }
1932 //******************************************************************************
1933 inline
1936  CCoverage(AGMap)
1937 {
1938  FMarkNumber = AGMap->getNewMark();
1939  FIt1 = new CTemplateBasicDynamicCoverage4(AGMap, ADart1, FMarkNumber);
1940 }
1941 //******************************************************************************
1942 inline
1944 {
1945  if (FIt1 != NULL)
1946  delete FIt1;
1947 
1948  while (! FAllCoverDarts.empty())
1949  {
1950  FMap->unsetMark(FAllCoverDarts.front(), FMarkNumber);
1951  FAllCoverDarts.pop_front();
1952  }
1953 
1954  FMap->freeMark(FMarkNumber);
1955 }
1956 //******************************************************************************
1957 inline
1959 {
1960  if (FIt1 != NULL)
1961  return FIt1->cont();
1962  else
1963  return FIt2 != FAllCoverDarts.end();
1964 }
1965 //******************************************************************************
1966 inline
1968 {
1969  assert(cont());
1970 
1971  if (FIt1 != NULL)
1972  FIt1->operator++();
1973  else
1974  ++FIt2;
1975 }
1976 //******************************************************************************
1977 inline
1979 {
1980  if (FIt1 != NULL)
1981  return FIt1->prevOperationType();
1982  else
1983  return OP_UNKNOWN;
1984 }
1985 //******************************************************************************
1986 inline
1988 {
1989  if (FIt1 != NULL)
1990  return FIt1->operator*();
1991  else
1992  return * FIt2;
1993 }
1994 //******************************************************************************
1995 inline
1997 {
1998  CDart* tmp = operator*();
1999  operator++();
2000  return tmp;
2001 }
2002 //******************************************************************************
2003 inline
2005 {
2006  return COVERAGE4;
2007 }
2008 //******************************************************************************
2009 // CDynamicCoverageAll
2010 //******************************************************************************
2011 inline
2013 {
2014  FCurrent = FMap->getFirstDart();
2015 }
2016 //******************************************************************************
2017 inline
2019  : CCoverage(AGMap)
2020 {
2021  reinit();
2022 }
2023 //******************************************************************************
2024 inline
2026 {
2027 }
2028 //******************************************************************************
2029 inline
2031 {
2032  return FCurrent != NULL;
2033 }
2034 //******************************************************************************
2035 inline
2037 {
2038  assert(cont());
2039  FCurrent = FCurrent->getNext();
2040 }
2041 //******************************************************************************
2042 inline
2044 {
2045  assert(cont());
2046 
2047  return FCurrent;
2048 }
2049 //******************************************************************************
2050 inline
2052 {
2053  CDart* tmp = operator*();
2054  operator++();
2055  return tmp;
2056 }
2057 //******************************************************************************
2058 inline
2060 {
2061  return OP_UNKNOWN;
2062 }
2063 //******************************************************************************
2064 inline
2066 {
2067  return COVERAGE_ALL;
2068 }
2069 //******************************************************************************
2070 // CBasicBorderCoverage
2071 //******************************************************************************
2072 inline
2074  const CDart* ADart1,
2075  int AMarkNumber, int ADimension) :
2076  CCoverage (AGMap),
2077  FCurrentDart((CDart*) ADart1),
2078  FMarkNumber (AMarkNumber),
2079  FBorderDim (ADimension),
2080  FPrevOp (OP_NONE)
2081 {
2082  assert(FMap->isFree(ADart1, ADimension));
2083  AGMap->setMark((CDart*) ADart1, FMarkNumber);
2084 }
2085 //******************************************************************************
2086 inline
2088 {
2089 }
2090 //******************************************************************************
2091 inline
2093 {
2094  return FPrevOp != OP_END;
2095 }
2096 //******************************************************************************
2097 inline
2099 {
2100 }
2101 //******************************************************************************
2102 inline
2104 {
2105  assert(cont());
2106 
2107  CDart* n = FCurrentDart;
2108  FPrevOp = OP_JUMP;
2109 
2110  if (FBorderDim != 0)
2111  {
2112  do
2113  n = FMap->alpha(FMap->alpha(n,FBorderDim-1),FBorderDim);
2114  while (! FMap->isFree(n, FBorderDim) &&
2115  ! FMap->isFree(n, FBorderDim-1) && n != FCurrentDart);
2116 
2117  if (! FMap->isMarked(n, FMarkNumber) && FMap->isFree(n, FBorderDim))
2118  {
2119  FToTreat.push(n);
2120  FMap->setMark(n, FMarkNumber);
2121  FPrevOp = OP_TURN_AROUND;
2122  }
2123  }
2124 
2125  for (int i=3; i>=0; --i)
2126  if ((i<FBorderDim-1 || i>FBorderDim+1) &&
2127  ! FMap->isMarked(FMap->alpha(FCurrentDart, i), FMarkNumber))
2128  {
2129  FPrevOp = OP_ALPHA0 + i;
2130  FToTreat.push(FMap->alpha(FCurrentDart, i));
2131  FMap->setMark(FMap->alpha(FCurrentDart, i), FMarkNumber);
2132  }
2133 
2134  if (FToTreat.empty())
2135  FPrevOp = OP_END;
2136  else
2137  {
2138  FCurrentDart = FToTreat.top();
2139  FToTreat.pop();
2140  }
2141 }
2142 //******************************************************************************
2143 inline
2145 {
2146  assert(cont());
2147 
2148  return FCurrentDart;
2149 }
2150 //******************************************************************************
2151 inline
2153 {
2154  CDart* tmp = operator*();
2155  operator++();
2156  return tmp;
2157 }
2158 //******************************************************************************
2159 inline
2161 {
2162  return FPrevOp;
2163 }
2164 //******************************************************************************
2165 inline
2167 {
2168  return COVERAGE_BORDER;
2169 }
2170 //******************************************************************************
2171 // CDynamicBorderCoverage
2172 //******************************************************************************
2173 inline
2175 {
2176  if (FIt != NULL)
2177  {
2178  delete FIt;
2179 
2180  FMap->negateMaskMark(FMarkNumber);
2181 
2182  FIt = new CBasicBorderCoverage(FMap, FDart1, FMarkNumber, FBorderDim);
2183 
2184  while (FIt->cont())
2185  ++ * FIt;
2186 
2187  FMap->negateMaskMark(FMarkNumber);
2188 
2189  delete FIt;
2190  }
2191 
2192  FIt = new CBasicBorderCoverage(FMap, FDart1, FMarkNumber, FBorderDim);
2193 }
2194 //******************************************************************************
2195 inline
2197  const CDart* ADart1, int ADim) :
2198  CCoverage (AGMap),
2199  FDart1 ((CDart*) ADart1),
2200  FBorderDim(ADim),
2201  FIt (NULL)
2202 {
2203  FMarkNumber = FMap->getNewMark();
2204  reinit();
2205 }
2206 //******************************************************************************
2207 inline
2209 {
2210  while (FIt->cont())
2211  ++ * FIt;
2212 
2213  delete FIt;
2214 
2215  FMap->negateMaskMark(FMarkNumber);
2216 
2217  FIt = new CBasicBorderCoverage(FMap, FDart1, FMarkNumber, FBorderDim);
2218 
2219  while (FIt->cont())
2220  ++ * FIt;
2221 
2222  delete FIt;
2223  FMap->negateMaskMark(FMarkNumber);
2224 
2225  FMap->freeMark(FMarkNumber);
2226 }
2227 //******************************************************************************
2228 inline
2230 {
2231  return FIt->cont();
2232 }
2233 //******************************************************************************
2234 inline
2236 {
2237  FIt->operator++();
2238 }
2239 //******************************************************************************
2240 inline
2242 {
2243  return FIt->operator*();
2244 }
2245 //******************************************************************************
2246 inline
2248 {
2249  CDart* tmp = operator*();
2250  operator++();
2251  return tmp;
2252 }
2253 //******************************************************************************
2254 inline
2256 {
2257  return FIt->prevOperationType();
2258 }
2259 //******************************************************************************
2260 inline
2262 {
2263  return COVERAGE_BORDER;
2264 }
2265 //******************************************************************************
2266 } // namespace GMap3d
2267 //******************************************************************************
2268 #endif // DYNAMIC_COVERAGE_HH
2269 //******************************************************************************