Open
Graph Drawing
Framework

 v.2007.11
 

CombinatorialEmbedding.h

Go to the documentation of this file.
00001 /*
00002  * $Revision: 1.9 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2007-11-08 16:10:37 +0100 (Do, 08 Nov 2007) $ 
00007  ***************************************************************/
00008  
00052 #ifdef _MSC_VER
00053 #pragma once
00054 #endif
00055 
00056 #ifndef OGDF_COMBINATORIAL_EMBEDDING_H
00057 #define OGDF_COMBINATORIAL_EMBEDDING_H
00058 
00059 
00060 #include <ogdf/basic/AdjEntryArray.h>
00061 
00062 
00063 namespace ogdf {
00064 
00065 class ConstCombinatorialEmbedding;
00066 
00067 typedef FaceElement *face;
00068 
00072 class FaceElement : private GraphElement
00073 {
00074     friend class ConstCombinatorialEmbedding;
00075     friend class CombinatorialEmbedding;
00076     friend class GraphList<FaceElement>;
00077 
00078     adjEntry m_adjFirst; 
00079     int m_id;   
00080     int m_size; 
00081 
00082 #ifdef OGDF_DEBUG
00083     const ConstCombinatorialEmbedding *m_pEmbedding;
00084 #endif
00085 
00086     // constructor
00087 #ifdef OGDF_DEBUG
00088     FaceElement(const ConstCombinatorialEmbedding *pEmbedding,
00089         adjEntry adjFirst,
00090         int id) :
00091         m_adjFirst(adjFirst), m_id(id), m_size(0), m_pEmbedding(pEmbedding) { }
00092 #else
00094     FaceElement(adjEntry adjFirst, int id) :
00095         m_adjFirst(adjFirst), m_id(id), m_size(0) { }
00096 #endif
00097 
00098 public:
00100     int index() const { return m_id; }
00101 
00103     adjEntry firstAdj() const { return m_adjFirst; }
00104 
00106     int size() const { return m_size; }
00107 
00109     face succ() const { return (face)m_next; }
00110 
00112     face pred() const { return (face)m_prev; }
00113 
00115     adjEntry nextFaceEdge(adjEntry adj) const {
00116         adj = adj->faceCycleSucc();
00117         return (adj != m_adjFirst) ? adj : 0;
00118     }
00119 
00120 #ifdef OGDF_DEBUG
00121     const ConstCombinatorialEmbedding *embeddingOf() const { return m_pEmbedding; }
00122 #endif
00123 
00124     OGDF_NEW_DELETE
00125 }; // class FaceElement
00126 
00127 
00128 class FaceArrayBase;
00129 template<class T>class FaceArray;
00130 
00131 
00141 class ConstCombinatorialEmbedding
00142 {
00143 protected:
00144     const Graph *m_cpGraph; 
00145 
00146     GraphList<FaceElement> m_faces; 
00147     int m_nFaces; 
00148     int m_faceIdCount; 
00149     int m_faceArrayTableSize; 
00150 
00151     AdjEntryArray<face> m_rightFace; 
00152     face m_externalFace; 
00153 
00154     mutable ListPure<FaceArrayBase*> m_regFaceArrays; 
00155 
00156 public:
00160     ConstCombinatorialEmbedding();
00161 
00168     explicit ConstCombinatorialEmbedding(const Graph &G);
00169 
00170 
00172     ConstCombinatorialEmbedding(const ConstCombinatorialEmbedding &C);
00173 
00175     ConstCombinatorialEmbedding &operator=(const ConstCombinatorialEmbedding &C);
00176 
00180     const Graph &getGraph() const { return *m_cpGraph; }
00181 
00183     operator const Graph &() const { return *m_cpGraph; }
00184 
00188     face firstFace() const { return m_faces.begin(); }
00189 
00191     face lastFace() const { return m_faces.rbegin(); }
00192 
00194     int numberOfFaces() const { return m_nFaces; }
00195 
00200     face rightFace(adjEntry adj) const { return m_rightFace[adj]; }
00201 
00206     face leftFace(adjEntry adj) const { return m_rightFace[adj->twin()]; }
00207 
00211     int maxFaceIndex() const { return m_faceIdCount-1; }
00212 
00214     int faceArrayTableSize() const { return m_faceArrayTableSize; }
00215 
00219     face chooseFace() const;
00220 
00222     face maximalFace() const;
00223 
00227     face externalFace() const {
00228         return m_externalFace;
00229     }
00230 
00235     void setExternalFace(face f) {
00236         OGDF_ASSERT(f->embeddingOf() == this);
00237         m_externalFace = f;
00238     }
00239 
00240     bool isBridge(edge e) const {
00241         return m_rightFace[e->adjSource()] == m_rightFace[e->adjTarget()];
00242     }
00243 
00250     void init(const Graph &G);
00251 
00253     void computeFaces();
00254     
00255 
00259     bool consistencyCheck();
00260 
00261 
00267     ListIterator<FaceArrayBase*> registerArray(FaceArrayBase *pFaceArray) const;
00268 
00274     void unregisterArray(ListIterator<FaceArrayBase*> it) const;
00275 
00278 protected:
00280     face createFaceElement(adjEntry adjFirst);
00281 
00283     void reinitArrays();
00284 
00285 }; // class ConstCombinatorialEmbedding
00286 
00287 
00288 
00295 class CombinatorialEmbedding : public ConstCombinatorialEmbedding
00296 {
00297     Graph *m_pGraph; 
00298 
00299     // the following methods are private in order to make them unusable
00300     // It is not clear which meaning copying of a comb. embedding should
00301     // have since we only store a pointer to the topology (Graph)
00302     CombinatorialEmbedding(const CombinatorialEmbedding &) { }
00303     CombinatorialEmbedding &operator=(const CombinatorialEmbedding &) {
00304         return *this;
00305     }
00306 
00307 public:
00311     CombinatorialEmbedding() : ConstCombinatorialEmbedding() {
00312         m_pGraph = 0;
00313     }
00314 
00321     explicit CombinatorialEmbedding(Graph &G) : ConstCombinatorialEmbedding(G) {
00322         m_pGraph = &G;
00323     }
00324 
00326 
00330 
00334     const Graph &getGraph() const { return *m_cpGraph; }
00335     
00336     Graph &getGraph() { return *m_pGraph; }
00337 
00338     operator const Graph &() const { return *m_cpGraph; }
00339 
00340     operator Graph &() { return *m_pGraph; }
00341 
00342 
00344 
00348 
00355     void init(Graph &G) {
00356         ConstCombinatorialEmbedding::init(G);
00357         m_pGraph = &G;
00358     }
00359 
00363     void clear();
00364 
00365 
00367 
00371 
00377     edge split(edge e);
00378 
00384     void unsplit(edge eIn, edge eOut);
00385 
00404     node splitNode(adjEntry adjStartLeft, adjEntry adjStartRight);
00405 
00411     node contract(edge e);
00412 
00421     edge splitFace(adjEntry adjSrc, adjEntry adjTgt);
00422 
00423     // incremental stuff
00424 
00425     //special version of the above function doing a pushback of the new edge
00426     //on the adjacency list of v making it possible to insert new degree 0
00427     //nodes into a face
00428     edge splitFace(node v, adjEntry adjTgt);
00429     edge splitFace(adjEntry adjSrc, node v);
00430 
00436     face joinFaces(edge e);
00437 
00439     void reverseEdge(edge e);
00440 
00441     void moveBridge(adjEntry adjBridge, adjEntry adjBefore);
00442 
00443     void removeDeg1(node v);
00444 
00446     void updateMerger(edge e, face fRight, face fLeft);
00447 
00448 
00451 }; // class CombinatorialEmbedding
00452 
00453 
00454 //---------------------------------------------------------
00455 // iteration macros
00456 //---------------------------------------------------------
00457 
00459 #define forall_faces(f,E) for((f)=(E).firstFace(); (f); (f)=(f)->succ())
00460 
00461 
00463 #define forall_rev_faces(f,E) for((f)=(E).lastFace(); (f); (f)=(f)->pred())
00464 
00477 #define forall_face_adj(adj,f) for((adj)=(f)->firstAdj(); (adj); (adj)=(f)->nextFaceEdge(adj))
00478 
00479 
00480 } // end namespace ogdf
00481 
00482 
00483 #endif


© 1999-2007 by oreas GmbH, © 2005-2007 by University Dortmund and University Cologne.

Generated on Thu Nov 22 19:40:00 2007 by doxygen 1.5.4.