Open
Graph Drawing
Framework

 v.2012.05
 

CombinatorialEmbedding.h
Go to the documentation of this file.
00001 /*
00002  * $Revision: 2299 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2012-05-07 15:57:08 +0200 (Mon, 07 May 2012) $ 
00007  ***************************************************************/
00008  
00044 #ifdef _MSC_VER
00045 #pragma once
00046 #endif
00047 
00048 #ifndef OGDF_COMBINATORIAL_EMBEDDING_H
00049 #define OGDF_COMBINATORIAL_EMBEDDING_H
00050 
00051 
00052 #include <ogdf/basic/AdjEntryArray.h>
00053 
00054 
00055 namespace ogdf {
00056 
00057 class OGDF_EXPORT ConstCombinatorialEmbedding;
00058 
00059 typedef FaceElement *face;
00060 
00064 class OGDF_EXPORT FaceElement : private GraphElement
00065 {
00066     friend class ConstCombinatorialEmbedding;
00067     friend class CombinatorialEmbedding;
00068     friend class GraphList<FaceElement>;
00069 
00070     adjEntry m_adjFirst; 
00071     int m_id;   
00072     int m_size; 
00073 
00074 #ifdef OGDF_DEBUG
00075     const ConstCombinatorialEmbedding *m_pEmbedding;
00076 #endif
00077 
00078     // constructor
00079 #ifdef OGDF_DEBUG
00080     FaceElement(const ConstCombinatorialEmbedding *pEmbedding,
00081         adjEntry adjFirst,
00082         int id) :
00083         m_adjFirst(adjFirst), m_id(id), m_size(0), m_pEmbedding(pEmbedding) { }
00084 #else
00085 
00086     FaceElement(adjEntry adjFirst, int id) :
00087         m_adjFirst(adjFirst), m_id(id), m_size(0) { }
00088 #endif
00089 
00090 public:
00092     int index() const { return m_id; }
00093 
00095     adjEntry firstAdj() const { return m_adjFirst; }
00096 
00098     int size() const { return m_size; }
00099 
00101     face succ() const { return (face)m_next; }
00102 
00104     face pred() const { return (face)m_prev; }
00105 
00107     adjEntry nextFaceEdge(adjEntry adj) const {
00108         adj = adj->faceCycleSucc();
00109         return (adj != m_adjFirst) ? adj : 0;
00110     }
00111 
00112 #ifdef OGDF_DEBUG
00113     const ConstCombinatorialEmbedding *embeddingOf() const { return m_pEmbedding; }
00114 #endif
00115 
00116     OGDF_NEW_DELETE
00117 }; // class FaceElement
00118 
00119 
00120 class FaceArrayBase;
00121 template<class T>class FaceArray;
00122 
00123 
00139 class OGDF_EXPORT ConstCombinatorialEmbedding
00140 {
00141 protected:
00142     const Graph *m_cpGraph; 
00143 
00144     GraphList<FaceElement> m_faces; 
00145     int m_nFaces; 
00146     int m_faceIdCount; 
00147     int m_faceArrayTableSize; 
00148 
00149     AdjEntryArray<face> m_rightFace; 
00150     face m_externalFace; 
00151 
00152     mutable ListPure<FaceArrayBase*> m_regFaceArrays; 
00153 
00154 public:
00158     ConstCombinatorialEmbedding();
00159 
00166     explicit ConstCombinatorialEmbedding(const Graph &G);
00167 
00168 
00170     ConstCombinatorialEmbedding(const ConstCombinatorialEmbedding &C);
00171 
00173     ConstCombinatorialEmbedding &operator=(const ConstCombinatorialEmbedding &C);
00174 
00178     const Graph &getGraph() const { return *m_cpGraph; }
00179 
00181     operator const Graph &() const { return *m_cpGraph; }
00182 
00186     face firstFace() const { return m_faces.begin(); }
00187 
00189     face lastFace() const { return m_faces.rbegin(); }
00190 
00192     int numberOfFaces() const { return m_nFaces; }
00193 
00198     face rightFace(adjEntry adj) const { return m_rightFace[adj]; }
00199 
00204     face leftFace(adjEntry adj) const { return m_rightFace[adj->twin()]; }
00205 
00209     int maxFaceIndex() const { return m_faceIdCount-1; }
00210 
00212     int faceArrayTableSize() const { return m_faceArrayTableSize; }
00213 
00217     face chooseFace() const;
00218 
00220     face maximalFace() const;
00221 
00225     face externalFace() const {
00226         return m_externalFace;
00227     }
00228 
00233     void setExternalFace(face f) {
00234         OGDF_ASSERT(f->embeddingOf() == this);
00235         m_externalFace = f;
00236     }
00237 
00238     bool isBridge(edge e) const {
00239         return m_rightFace[e->adjSource()] == m_rightFace[e->adjTarget()];
00240     }
00241 
00248     void init(const Graph &G);
00249 
00250     void init();
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 OGDF_EXPORT 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 &) : ConstCombinatorialEmbedding() { }
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