Open
Graph Drawing
Framework

 v.2007.11
 

GraphCopy.h

Go to the documentation of this file.
00001 /*
00002  * $Revision: 1.8 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2007-11-08 18:57:50 +0100 (Do, 08 Nov 2007) $ 
00007  ***************************************************************/
00008  
00051 #ifdef _MSC_VER
00052 #pragma once
00053 #endif
00054 
00055 #ifndef OGDF_GRAPH_COPY_H
00056 #define OGDF_GRAPH_COPY_H
00057 
00058 
00059 #include <ogdf/basic/NodeArray.h>
00060 #include <ogdf/basic/EdgeArray.h>
00061 #include <ogdf/basic/SList.h>
00062 #include <ogdf/basic/CombinatorialEmbedding.h>
00063 
00064 
00065 namespace ogdf {
00066 
00067 class FaceSetPure;
00068 
00069 
00070 //---------------------------------------------------------
00071 // GraphCopySimple
00072 // simple graph copies (no support for edge splitting)
00073 //---------------------------------------------------------
00087 class GraphCopySimple : public Graph {
00088 
00089     const Graph *m_pGraph;   
00090     NodeArray<node> m_vOrig; 
00091     NodeArray<node> m_vCopy; 
00092     EdgeArray<edge> m_eOrig; 
00093     EdgeArray<edge> m_eCopy; 
00094 
00095 public:
00096     // construction
00097 
00099     GraphCopySimple(const Graph &G);
00100 
00102     GraphCopySimple(const GraphCopySimple &GC);
00103 
00104     virtual ~GraphCopySimple() {};
00105 
00107     const Graph &original() const { return *m_pGraph; }
00108 
00115     node original(node v) const { return m_vOrig[v]; }
00116 
00123     edge original(edge e) const { return m_eOrig[e]; }
00124 
00130     node copy(node v) const { return m_vCopy[v]; }
00131 
00137     edge copy(edge e) const { return m_eCopy[e]; }
00138 
00143     bool isDummy(node v) const { return (m_vOrig[v] == 0); }
00144 
00149     bool isDummy(edge e) const { return (m_eOrig[e] == 0); }
00150 
00152     GraphCopySimple &operator=(const GraphCopySimple &GC);
00153 
00154 
00156     node newNode() {
00157         return Graph::newNode();
00158     }
00159 
00165     node newNode(node vOrig) {
00166         OGDF_ASSERT(vOrig != 0 && vOrig->graphOf() == m_pGraph);
00167         node v = Graph::newNode();
00168         m_vCopy[m_vOrig[v] = vOrig] = v;
00169         return v;
00170     }
00171 
00173     edge newEdge(node v, node w) {
00174         return Graph::newEdge(v,w);
00175     }
00176 
00182     edge newEdge(edge eOrig) {
00183         OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
00184         edge e = Graph::newEdge(m_vCopy[eOrig->source()], m_vCopy[eOrig->target()]);
00185         m_eCopy[m_eOrig[e] = eOrig] = e;
00186         return e;
00187     }
00188 
00189 private:
00190     void initGC(const GraphCopySimple &GC, NodeArray<node> &vCopy,
00191         EdgeArray<edge> &eCopy);
00192 }; // class GraphCopySimple
00193 
00194 
00195 //---------------------------------------------------------
00196 // GraphCopy
00197 // graph copies (support for edge splitting)
00198 //---------------------------------------------------------
00233 class GraphCopy : public Graph {
00234 protected:
00235 
00236     const Graph *m_pGraph;   
00237     NodeArray<node> m_vOrig; 
00238     EdgeArray<edge> m_eOrig; 
00239     EdgeArray<ListIterator<edge> > m_eIterator; 
00240 
00241     NodeArray<node> m_vCopy; 
00242     EdgeArray<List<edge> > m_eCopy; 
00243 
00244 public:
00246 
00251     GraphCopy(const Graph &G);
00252 
00254     GraphCopy() : Graph() { }
00255 
00257 
00261     GraphCopy(const GraphCopy &GC);
00262 
00263     virtual ~GraphCopy() {};
00264 
00265 
00270 
00272     const Graph &original() const { return *m_pGraph; }
00273 
00280     node original(node v) const { return m_vOrig[v]; }
00281 
00288     edge original(edge e) const { return m_eOrig[e]; }
00289 
00295     node copy(node v) const { return m_vCopy[v]; }
00296 
00302     const List<edge> &chain(edge e) const { return m_eCopy[e]; }
00303 
00304     // returns first edge in chain(e)
00311     edge copy(edge e) const { return m_eCopy[e].front(); }
00312 
00317     bool isDummy(node v) const { return (m_vOrig[v] == 0); }
00318 
00323     bool isDummy(edge e) const { return (m_eOrig[e] == 0); }
00324 
00329     bool isReversed (edge e) const {
00330         return e->source() != original(copy(e)->source());
00331     }
00332 
00333     
00338 
00340     node newNode() {
00341         return Graph::newNode();
00342     }
00343 
00349     node newNode(node vOrig) {
00350         OGDF_ASSERT(vOrig != 0 && vOrig->graphOf() == m_pGraph);
00351         node v = Graph::newNode();
00352         m_vCopy[m_vOrig[v] = vOrig] = v;
00353         return v;
00354     }
00355 
00362     void delCopy(node v);
00363 
00370     void delCopy(edge e);
00371 
00372 
00377     virtual edge split(edge e);
00378 
00379 
00388     void unsplit(edge eIn, edge eOut);
00389 
00391     edge newEdge(edge eOrig);
00392 
00394 
00403     edge newEdge(edge eOrig, adjEntry adjSrc, node w);
00404 
00406 
00415     edge newEdge(edge eOrig, node v, adjEntry adjTgt);
00416 
00417     edge newEdge(node v, node w)                   { return Graph::newEdge(v, w); }
00418     edge newEdge(adjEntry adjSrc, adjEntry adjTgt) { return Graph::newEdge(adjSrc, adjTgt); }
00419     edge newEdge(node v, adjEntry adjTgt)          { return Graph::newEdge(v, adjTgt); }
00420     edge newEdge(adjEntry adjSrc, node w)          { return Graph::newEdge(adjSrc, w); }
00421 
00423 
00427     void setEdge(edge eOrig, edge eCopy);
00428     
00430 
00439     void insertEdgePath(edge eOrig, const SList<adjEntry> &crossedEdges);
00440 
00442 
00445     void removeEdgePath(edge eOrig);
00446 
00448 
00453     edge insertCrossing(edge& crossingEdge,
00454                         edge crossedEdge,
00455                         bool topDown);
00456 
00457 
00462 
00464 
00478     edge newEdge(node v, adjEntry adj, edge eOrig, CombinatorialEmbedding &E);
00479 
00485     void setOriginalEmbedding();
00486 
00488 
00507     void insertEdgePathEmbedded(
00508         edge eOrig,
00509         CombinatorialEmbedding &E,
00510         const SList<adjEntry> &crossedEdges);
00511     
00519     void removeEdgePathEmbedded(
00520         CombinatorialEmbedding &E,
00521         edge                    eOrig,
00522         FaceSetPure            &newFaces);
00523 
00524 
00526 
00530 
00532     bool consistencyCheck() const;
00533 
00535 
00567     void createEmpty(const Graph &G);
00568 
00570 
00586     void initByNodes(const List<node> &nodes, EdgeArray<edge> &eCopy);
00587 
00589 
00601     void initByActiveNodes(const List<node> &nodes, 
00602         const NodeArray<bool> &activeNodes, EdgeArray<edge> &eCopy);
00603 
00605 
00609 
00611 
00619     GraphCopy &operator=(const GraphCopy &GC);
00620 
00621 
00623 
00624 private:
00625     void initGC(const GraphCopy &GC,
00626         NodeArray<node> &vCopy, EdgeArray<edge> &eCopy);
00627 
00628 }; // class GraphCopy
00629 
00630 
00631 } // end namespace ogdf
00632 
00633 #endif


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

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