Moka kernel
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dart.icc
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 #include "attribute.hh"
26 #include "embedding.hh"
27 
28 #include <cassert>
29 //******************************************************************************
30 namespace GMap3d
31 {
32 //******************************************************************************
33 // Constructeurs
34 // On initialise pas les champs FMarks et FUsedOrbits car tout les bits sont
35 // initialisées à faux par défaut (constructeur de bitset).
36 INLINE
38  FFirstEmbedding(NULL),
39  FPrev (NULL),
40  FNext (NULL)
41 {
42  FAlpha[0] = this;
43  FAlpha[1] = this;
44  FAlpha[2] = this;
45  FAlpha[3] = this;
46 }
47 //******************************************************************************
48 INLINE
49 CDart::CDart(const CDart& ADart) :
50  FFirstEmbedding(NULL),
51  FMarks (ADart.FMarks),
52  FUsedOrbits (ADart.FUsedOrbits),
53  FPrev (NULL),
54  FNext (NULL)
55 {
56  FAlpha[0] = this;
57  FAlpha[1] = this;
58  FAlpha[2] = this;
59  FAlpha[3] = this;
60 }
61 //******************************************************************************
62 INLINE
63 CDart::CDart(const std::bitset<NB_MARKS>& AMarks) :
64  FFirstEmbedding(NULL),
65  FMarks (AMarks),
66  FPrev (NULL),
67  FNext (NULL)
68 {
69  FAlpha[0] = this;
70  FAlpha[1] = this;
71  FAlpha[2] = this;
72  FAlpha[3] = this;
73 }
74 //******************************************************************************
75 // Destructeur
76 // Attention, si le brin n'a pas été préalablement décousu alors ses brins
77 // voisins pointent désormais vers une adresse invalide.
78 INLINE
80 {
81  CEmbedding* E = FFirstEmbedding;
82 
83  // Destruction de tout les embedding de la liste
84  while(E != NULL)
85  {
86  CEmbedding* tmp = E;
87  E = E->getNext();
88  delete tmp;
89  }
90 }
91 //******************************************************************************
92 INLINE
94 {
95  return FFirstEmbedding;
96 }
97 //******************************************************************************
98 INLINE
100 {
101  FFirstEmbedding = AEmbedding;
102 }
103 //******************************************************************************
104 INLINE
106 {
107  return FAlpha[0];
108 }
109 //******************************************************************************
110 INLINE
112 {
113  return FAlpha[1];
114 }
115 //******************************************************************************
116 INLINE
118 {
119  return FAlpha[2];
120 }
121 //******************************************************************************
122 INLINE
124 {
125  return FAlpha[3];
126 }
127 //******************************************************************************
128 INLINE
129 CDart* CDart::getAlpha(int ADimension) const
130 {
131  assert(0<=ADimension && ADimension<=3);
132 
133  return FAlpha[ADimension];
134 }
135 //******************************************************************************
136 INLINE
138 {
139  assert(ADart != NULL);
140 
141  FAlpha[0] = ADart;
142 }
143 //******************************************************************************
144 INLINE
146 {
147  assert(ADart != NULL);
148 
149  FAlpha[1] = ADart;
150 }
151 //******************************************************************************
152 INLINE
154 {
155  assert(ADart != NULL);
156 
157  FAlpha[2] = ADart;
158 }
159 //******************************************************************************
160 INLINE
162 {
163  assert(ADart != NULL);
164 
165  FAlpha[3] = ADart;
166 }
167 //******************************************************************************
168 INLINE
169 void CDart::setAlpha(CDart* ADart, int ADimension)
170 {
171  assert(ADart != NULL);
172  assert(0<=ADimension && ADimension<=3);
173 
174  FAlpha[ADimension] = ADart;
175 }
176 //******************************************************************************
177 INLINE
178 bool CDart::isFree0() const
179 {
180  return FAlpha[0] == this;
181 }
182 //******************************************************************************
183 INLINE
184 bool CDart::isFree1() const
185 {
186  return FAlpha[1] == this;
187 }
188 //******************************************************************************
189 INLINE
190 bool CDart::isFree2() const
191 {
192  return FAlpha[2] == this;
193 }
194 //******************************************************************************
195 INLINE
196 bool CDart::isFree3() const
197 {
198  return FAlpha[3] == this;
199 }
200 //******************************************************************************
201 INLINE
202 bool CDart::isFree(int ADimension) const
203 {
204  assert(0<=ADimension && ADimension<=3);
205 
206  return FAlpha[ADimension] == this;
207 }
208 //******************************************************************************
209 INLINE
211 {
212  FAlpha[0] = this;
213 }
214 //******************************************************************************
215 INLINE
217 {
218  FAlpha[1] = this;
219 }
220 //******************************************************************************
221 INLINE
223 {
224  FAlpha[2]=this;
225 }
226 //******************************************************************************
227 INLINE
229 {
230  FAlpha[3] = this;
231 }
232 //******************************************************************************
233 INLINE
234 void CDart::setFree(int ADimension)
235 {
236  assert(0<=ADimension && ADimension<=3);
237 
238  FAlpha[ADimension] = this;
239 }
240 //******************************************************************************
241 INLINE
242 void* CDart::getDirectInfo(int ADirectIndex) const
243 {
244  assert(0<=ADirectIndex && ADirectIndex<NB_DIRECT_INFO);
245 
246  return FDirectInfo[ADirectIndex];
247 }
248 //******************************************************************************
249 INLINE
250 void CDart::setDirectInfo(int ADirectIndex, void* AValue)
251 {
252  assert(0<=ADirectIndex && ADirectIndex<NB_DIRECT_INFO);
253 
254  FDirectInfo[ADirectIndex] = AValue;
255 }
256 //******************************************************************************
257 INLINE
258 bool CDart::getMark(int AMarkNumber) const
259 {
260  assert(0<=AMarkNumber && AMarkNumber<NB_MARKS);
261 
262  return FMarks[AMarkNumber];
263 }
264 //******************************************************************************
265 INLINE
266 void CDart::setMark(int AMarkNumber, bool AValue)
267 {
268  assert(0<=AMarkNumber && AMarkNumber<NB_MARKS);
269 
270  FMarks.set(AMarkNumber, AValue);
271 }
272 //******************************************************************************
273 INLINE
274 std::bitset<NB_MARKS> CDart::getMarks() const
275 {
276  return FMarks;
277 }
278 //******************************************************************************
279 INLINE
280 void CDart::setMarks(const std::bitset<NB_MARKS>& AMarks)
281 {
282  this->FMarks = AMarks;
283 }
284 //******************************************************************************
285 INLINE
287 {
288  assert(ORBIT_SELF<=AOrbit && AOrbit<=ORBIT_0123);
289 
290  FUsedOrbits.set(static_cast<int>(AOrbit), true);
291 }
292 //******************************************************************************
293 INLINE
295 {
296  assert(ORBIT_SELF<=AOrbit && AOrbit<=ORBIT_0123);
297 
298  FUsedOrbits.set(static_cast<int>(AOrbit), false);
299 }
300 //******************************************************************************
301 INLINE
302 bool CDart::isOrbitUsed(TOrbit AOrbit) const
303 {
304  assert(ORBIT_SELF<=AOrbit && AOrbit<=ORBIT_0123);
305 
306  return FUsedOrbits[static_cast<int>(AOrbit)];
307 }
308 //******************************************************************************
309 INLINE
311 {
312  return FPrev;
313 }
314 //******************************************************************************
315 INLINE
316 void CDart::setPrev(CDart* ADart)
317 {
318  FPrev = ADart;
319 }
320 //******************************************************************************
321 INLINE
323 {
324  return FNext;
325 }
326 //******************************************************************************
327 INLINE
328 void CDart::setNext(CDart* ADart)
329 {
330  FNext = ADart;
331 }
332 //******************************************************************************
333 INLINE
335 {
336  if (isOrbitUsed(AOrbit))
337  {
339 
340  while (E != NULL)
341  {
342  if (E->getOrbit() == AOrbit)
343  return E;
344 
345  E = E->getNext();
346  }
347  }
348 
349  return NULL;
350 }
351 //******************************************************************************
352 INLINE
354 {
355  assert(AEmbedding != NULL);
356  assert(AEmbedding->getPrev() == NULL && AEmbedding->getNext() == NULL);
357  assert(getEmbedding(AEmbedding->getOrbit()) == NULL);
358 
359  setOrbitUsed(AEmbedding->getOrbit());
360 
361  if (getFirstEmbedding() != NULL)
362  {
363  // Insertion dans la liste :
364  getFirstEmbedding()->setPrev(AEmbedding);
365  AEmbedding->setNext(getFirstEmbedding());
366  }
367 
368  setFirstEmbedding(AEmbedding);
369 }
370 //******************************************************************************
371 INLINE
373 {
374  assert(AEmbedding != NULL);
375 
376  if (getFirstEmbedding() == AEmbedding)
377  {
378  assert(AEmbedding->getPrev() == NULL);
379  setFirstEmbedding(AEmbedding->getNext());
380  }
381  else
382  {
383  assert(AEmbedding->getPrev() != NULL);
384  AEmbedding->getPrev()->setNext(AEmbedding->getNext());
385  }
386 
387  if (AEmbedding->getNext() != NULL)
388  AEmbedding->getNext()->setPrev(AEmbedding->getPrev());
389 
390  return AEmbedding;
391 }
392 //******************************************************************************
393 INLINE
395 {
396  CEmbedding* E = getEmbedding(AOrbit);
397 
398  if (E == NULL)
399  return NULL;
400 
401  unsetOrbitUsed(AOrbit);
402  return removeEmbedding(E);
403 }
404 //******************************************************************************
405 INLINE
407 {
408  assert(AEmbedding != NULL);
409 
410  delete removeEmbedding(AEmbedding);
411 }
412 //******************************************************************************
413 INLINE
415 {
416  delete removeEmbedding(AOrbit); // car delete NULL marche et ne fait rien
417 }
418 //******************************************************************************
419 INLINE
421 {
422  CEmbedding* E = getEmbedding(AOrbit);
423 
424  if (E == NULL)
425  return NULL;
426 
427  return E->getAttribute(AAttribType);
428 }
429 //******************************************************************************
430 INLINE
431 void CDart::addAttribute(TOrbit AOrbit, CAttribute* AAttribute)
432 {
433  assert(AAttribute != NULL);
434 
435  CEmbedding* E = getEmbedding(AOrbit);
436 
437  if (E == NULL)
438  { // Le brin n'a pas d'embedding pour cette orbite et donc on en créé un.
439  E = new CEmbedding(AOrbit);
440  addEmbedding(E);
441  }
442 
443  E->addAttribute(AAttribute);
444 }
445 //******************************************************************************
446 INLINE
448 {
449  assert(AEmbedding != NULL);
450 
451  CEmbedding* E = getEmbedding(AEmbedding->getOrbit());
452 
453  if (E == NULL)
454  { // Le brin n'a pas d'embedding pour cette orbite et donc on en créé un
455  // et on prend tout les attributs de AEmbedding sans test.
456  E = new CEmbedding(AEmbedding->getOrbit());
457  addEmbedding(E);
458  E->setFirstAttribute(AEmbedding->getFirstAttribute());
459  AEmbedding->setFirstAttribute(NULL);
460  }
461  else // Ici on va seulement prendre les attributs de AEmbedding qu'on n'a pas.
462  E->mergeAttribute(AEmbedding);
463 }
464 //******************************************************************************
465 INLINE
467 {
468  CAttribute* A = NULL;
469  CEmbedding* E = getEmbedding(AOrbit);
470 
471  if (E != NULL)
472  {
473  A = E->removeAttribute(AAttribType);
474 
475  if (E->isEmpty())
476  {
477  deleteEmbedding(E);
478  unsetOrbitUsed(AOrbit);
479  }
480  }
481 
482  return A;
483 }
484 //******************************************************************************
485 INLINE
486 void CDart::deleteAttribute(TOrbit AOrbit, TAttributeId AAttribType)
487 {
488  delete removeAttribute(AOrbit, AAttribType);
489 }
490 //******************************************************************************
491 } // namespace GMap3d
492 //******************************************************************************