00001
00002
00003
00004
00005 #ifndef BALL_STRUCTURE_GRAPHVERTEX_H
00006 #define BALL_STRUCTURE_GRAPHVERTEX_H
00007
00008 #ifndef BALL_COMMON_H
00009 # include <BALL/common.h>
00010 #endif
00011
00012 #ifndef BALL_DATATYPE_HASHSET_H
00013 # include <BALL/DATATYPE/hashSet.h>
00014 #endif
00015
00016 namespace BALL
00017 {
00018
00019 template <typename Vertex, typename Edge, typename Face>
00020 class GraphEdge;
00021
00022 template <typename Vertex, typename Edge, typename Face>
00023 class GraphFace;
00024
00025 template <typename Vertex, typename Edge, typename Face>
00026 class GraphTriangle;
00027
00031 template <typename Vertex, typename Edge, typename Face>
00032 class GraphVertex
00033 {
00034 public:
00035
00043 friend class GraphEdge<Vertex,Edge,Face>;
00044 friend class GraphFace<Vertex,Edge,Face>;
00045 friend class GraphTriangle<Vertex,Edge,Face>;
00046
00047 BALL_CREATE(GraphVertex)
00048
00049
00052
00053 typedef typename HashSet<Edge*>::Iterator EdgeIterator;
00054 typedef typename HashSet<Edge*>::ConstIterator ConstEdgeIterator;
00055 typedef typename HashSet<Face*>::Iterator FaceIterator;
00056 typedef typename HashSet<Face*>::ConstIterator ConstFaceIterator;
00057
00059
00062
00066 GraphVertex()
00067 ;
00068
00076 GraphVertex(const GraphVertex<Vertex,Edge,Face>& vertex, bool deep = false)
00077 ;
00078
00082 virtual ~GraphVertex()
00083 ;
00085
00089
00097 void set(const GraphVertex<Vertex,Edge,Face>& vertex, bool deep = false)
00098 ;
00099
00105 GraphVertex<Vertex,Edge,Face>& operator =
00106 (const GraphVertex<Vertex,Edge,Face>& vertex)
00107 ;
00108
00110
00113
00117 void insert(Edge* edge)
00118 ;
00119
00123 void insert(Face* face)
00124 ;
00125
00129 void remove(Edge* edge)
00130 ;
00131
00135 void remove(Face* face)
00136 ;
00137
00141 Position numberOfEdges() const
00142 ;
00143
00147 Position numberOfFaces() const
00148 ;
00149
00153 void setIndex(Index index)
00154 ;
00155
00159 Index getIndex() const
00160 ;
00161
00168 bool join(const Vertex& vertex)
00169 ;
00170
00177 bool substitute(Vertex* vertex)
00178 ;
00179
00180
00182
00185
00189 virtual bool operator == (const Vertex&) const
00190 ;
00191
00195 virtual bool operator != (const Vertex&) const
00196 ;
00197
00201 virtual bool operator *= (const Vertex&) const
00202 ;
00203
00208 Face* has(Face* face) const
00209 ;
00210
00215 Edge* has(Edge* edge) const
00216 ;
00217
00220 bool hasEdges() const
00221 ;
00222
00225 bool hasFaces() const
00226 ;
00227
00229
00232
00233 EdgeIterator beginEdge()
00234 ;
00235 ConstEdgeIterator beginEdge() const
00236 ;
00237 EdgeIterator endEdge()
00238 ;
00239 ConstEdgeIterator endEdge() const
00240 ;
00241 FaceIterator beginFace()
00242 ;
00243 ConstFaceIterator beginFace() const
00244 ;
00245 FaceIterator endFace()
00246 ;
00247 ConstFaceIterator endFace() const
00248 ;
00249
00251
00252 protected:
00253
00254
00255
00257
00258
00259
00260 HashSet<Edge*> edges_;
00261
00262
00263 HashSet<Face*> faces_;
00264
00265
00266 Index index_;
00267
00269
00270 };
00271
00272
00273
00274 template <typename Vertex, typename Edge, typename Face>
00275 GraphVertex<Vertex,Edge,Face>::GraphVertex()
00276
00277 : edges_(),
00278 faces_(),
00279 index_(-1)
00280 {
00281 }
00282
00283
00284 template <typename Vertex, typename Edge, typename Face>
00285 GraphVertex<Vertex,Edge,Face>::GraphVertex
00286 (const GraphVertex<Vertex,Edge,Face>& vertex, bool deep)
00287
00288 : edges_(),
00289 faces_(),
00290 index_(vertex.index_)
00291 {
00292 if (deep)
00293 {
00294 edges_ = vertex.edges_;
00295 faces_ = vertex.faces_;
00296 }
00297 }
00298
00299
00300 template <typename Vertex, typename Edge, typename Face>
00301 GraphVertex<Vertex,Edge,Face>::~GraphVertex()
00302
00303 {
00304 }
00305
00306
00307 template <typename Vertex, typename Edge, typename Face>
00308 void GraphVertex<Vertex,Edge,Face>::set
00309 (const GraphVertex<Vertex,Edge,Face>& vertex, bool deep)
00310
00311 {
00312 if (this != &vertex)
00313 {
00314 if (deep)
00315 {
00316 edges_ = vertex.edges_;
00317 faces_ = vertex.faces_;
00318 }
00319 index_ = vertex.index_;
00320 }
00321 }
00322
00323
00324 template <typename Vertex, typename Edge, typename Face>
00325 GraphVertex<Vertex,Edge,Face>& GraphVertex<Vertex,Edge,Face>::operator =
00326 (const GraphVertex<Vertex,Edge,Face>& vertex)
00327
00328 {
00329 if (this != &vertex)
00330 {
00331 edges_ = vertex.edges_;
00332 faces_ = vertex.faces_;
00333 index_ = vertex.index_;
00334 }
00335 return *this;
00336 }
00337
00338
00339 template <typename Vertex, typename Edge, typename Face>
00340 void GraphVertex<Vertex,Edge,Face>::insert(Edge* edge)
00341
00342 {
00343 edges_.insert(edge);
00344 }
00345
00346
00347 template <typename Vertex, typename Edge, typename Face>
00348 void GraphVertex<Vertex,Edge,Face>::insert(Face* face)
00349
00350 {
00351 faces_.insert(face);
00352 }
00353
00354
00355 template <typename Vertex, typename Edge, typename Face>
00356 void GraphVertex<Vertex,Edge,Face>::remove(Edge* edge)
00357
00358 {
00359 edges_.erase(edge);
00360 }
00361
00362
00363 template <typename Vertex, typename Edge, typename Face>
00364 void GraphVertex<Vertex,Edge,Face>::remove(Face* face)
00365
00366 {
00367 faces_.erase(face);
00368 }
00369
00370
00371 template <typename Vertex, typename Edge, typename Face>
00372 Position GraphVertex<Vertex,Edge,Face>::numberOfEdges() const
00373
00374 {
00375 return edges_.size();
00376 }
00377
00378
00379 template <typename Vertex, typename Edge, typename Face>
00380 Position GraphVertex<Vertex,Edge,Face>::numberOfFaces() const
00381
00382 {
00383 return faces_.size();
00384 }
00385
00386
00387 template <typename Vertex, typename Edge, typename Face>
00388 void GraphVertex<Vertex,Edge,Face>::setIndex(Index index)
00389
00390 {
00391 index_ = index;
00392 }
00393
00394
00395 template <typename Vertex, typename Edge, typename Face>
00396 Index GraphVertex<Vertex,Edge,Face>::getIndex() const
00397
00398 {
00399 return index_;
00400 }
00401
00402
00403 template <typename Vertex, typename Edge, typename Face>
00404 bool GraphVertex<Vertex,Edge,Face>::substitute(Vertex* vertex)
00405
00406 {
00407 if (*this *= *vertex)
00408 {
00409 typename HashSet<Edge*>::Iterator e;
00410 for (e = edges_.begin(); e != edges_.end(); e++)
00411 {
00412 (*e)->substitute((Vertex*)this,vertex);
00413 }
00414 typename HashSet<Face*>::Iterator f;
00415 for (f = faces_.begin(); f != faces_.end(); f++)
00416 {
00417 (*f)->substitute((Vertex*)this,vertex);
00418 }
00419 return true;
00420 }
00421 return false;
00422 }
00423
00424
00425 template <typename Vertex, typename Edge, typename Face>
00426 bool GraphVertex<Vertex,Edge,Face>::join(const Vertex& vertex)
00427
00428 {
00429 if (*this *= vertex)
00430 {
00431 typename HashSet<Edge*>::ConstIterator e;
00432 for (e = vertex.edges_.begin(); e != vertex.edges_.end(); e++)
00433 {
00434 edges_.insert(*e);
00435 }
00436 typename HashSet<Face*>::ConstIterator f;
00437 for (f = vertex.faces_.begin(); f != vertex.faces_.end(); f++)
00438 {
00439 faces_.insert(*f);
00440 }
00441 return true;
00442 }
00443 else
00444 {
00445 return false;
00446 }
00447 }
00448
00449
00450 template <typename Vertex, typename Edge, typename Face>
00451 Face* GraphVertex<Vertex,Edge,Face>::has(Face* face) const
00452
00453 {
00454 typename HashSet<Face*>::ConstIterator f;
00455 for (f = faces_.begin(); f != faces_.end(); f++)
00456 {
00457 if (*(*f) == *face)
00458 {
00459 return *f;
00460 }
00461 }
00462 return NULL;
00463 }
00464
00465
00466 template <typename Vertex, typename Edge, typename Face>
00467 Edge* GraphVertex<Vertex,Edge,Face>::has(Edge* edge) const
00468
00469 {
00470 typename HashSet<Edge*>::ConstIterator e;
00471 for (e = edges_.begin(); e != edges_.end(); e++)
00472 {
00473 if (*(*e) == *edge)
00474 {
00475 return *e;
00476 }
00477 }
00478 return NULL;
00479 }
00480
00481
00482 template <typename Vertex, typename Edge, typename Face>
00483 bool GraphVertex<Vertex,Edge,Face>::hasEdges() const
00484
00485 {
00486 return !edges_.isEmpty();
00487 }
00488
00489
00490 template <typename Vertex, typename Edge, typename Face>
00491 bool GraphVertex<Vertex,Edge,Face>::hasFaces() const
00492
00493 {
00494 return !faces_.isEmpty();
00495 }
00496
00497
00498 template <typename Vertex, typename Edge, typename Face>
00499 typename GraphVertex<Vertex,Edge,Face>::EdgeIterator
00500 GraphVertex<Vertex,Edge,Face>::beginEdge()
00501
00502 {
00503 return edges_.begin();
00504 }
00505
00506
00507 template <typename Vertex, typename Edge, typename Face>
00508 typename GraphVertex<Vertex,Edge,Face>::ConstEdgeIterator
00509 GraphVertex<Vertex,Edge,Face>::beginEdge() const
00510
00511 {
00512 return edges_.begin();
00513 }
00514
00515
00516 template <typename Vertex, typename Edge, typename Face>
00517 typename GraphVertex<Vertex,Edge,Face>::EdgeIterator
00518 GraphVertex<Vertex,Edge,Face>::endEdge()
00519
00520 {
00521 return edges_.end();
00522 }
00523
00524
00525 template <typename Vertex, typename Edge, typename Face>
00526 typename GraphVertex<Vertex,Edge,Face>::ConstEdgeIterator
00527 GraphVertex<Vertex,Edge,Face>::endEdge() const
00528
00529 {
00530 return edges_.end();
00531 }
00532
00533
00534 template <typename Vertex, typename Edge, typename Face>
00535 typename GraphVertex<Vertex,Edge,Face>::FaceIterator
00536 GraphVertex<Vertex,Edge,Face>::beginFace()
00537
00538 {
00539 return faces_.begin();
00540 }
00541
00542
00543 template <typename Vertex, typename Edge, typename Face>
00544 typename GraphVertex<Vertex,Edge,Face>::ConstFaceIterator
00545 GraphVertex<Vertex,Edge,Face>::beginFace() const
00546
00547 {
00548 return faces_.begin();
00549 }
00550
00551
00552 template <typename Vertex, typename Edge, typename Face>
00553 typename GraphVertex<Vertex,Edge,Face>::FaceIterator
00554 GraphVertex<Vertex,Edge,Face>::endFace()
00555
00556 {
00557 return faces_.end();
00558 }
00559
00560
00561 template <typename Vertex, typename Edge, typename Face>
00562 typename GraphVertex<Vertex,Edge,Face>::ConstFaceIterator
00563 GraphVertex<Vertex,Edge,Face>::endFace() const
00564
00565 {
00566 return faces_.end();
00567 }
00568
00569
00570 template <typename Vertex, typename Edge, typename Face>
00571 bool GraphVertex<Vertex,Edge,Face>::operator == (const Vertex&) const
00572
00573 {
00574 return true;
00575 }
00576
00577
00578 template <typename Vertex, typename Edge, typename Face>
00579 bool GraphVertex<Vertex,Edge,Face>::operator != (const Vertex&) const
00580
00581 {
00582 return false;
00583 }
00584
00585
00586 template <typename Vertex, typename Edge, typename Face>
00587 bool GraphVertex<Vertex,Edge,Face>::operator *= (const Vertex&) const
00588
00589 {
00590 return true;
00591 }
00592
00593 }
00594
00595 #endif // BALL_STRUCTURE_GRAPHVERTEX_H