Open
Graph Drawing
Framework

 v.2010.10
 

GraphCopy.h

Go to the documentation of this file.
00001 /*
00002  * $Revision: 2027 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2010-09-01 11:55:17 +0200 (Wed, 01 Sep 2010) $ 
00007  ***************************************************************/
00008  
00053 #ifdef _MSC_VER
00054 #pragma once
00055 #endif
00056 
00057 #ifndef OGDF_GRAPH_COPY_H
00058 #define OGDF_GRAPH_COPY_H
00059 
00060 
00061 #include <ogdf/basic/NodeArray.h>
00062 #include <ogdf/basic/EdgeArray.h>
00063 #include <ogdf/basic/SList.h>
00064 #include <ogdf/basic/CombinatorialEmbedding.h>
00065 
00066 
00067 namespace ogdf {
00068 
00069 class OGDF_EXPORT FaceSetPure;
00070 
00071 
00072 //---------------------------------------------------------
00073 // GraphCopySimple
00074 // simple graph copies (no support for edge splitting)
00075 //---------------------------------------------------------
00089 class OGDF_EXPORT GraphCopySimple : public Graph {
00090 
00091     const Graph *m_pGraph;   
00092     NodeArray<node> m_vOrig; 
00093     NodeArray<node> m_vCopy; 
00094     EdgeArray<edge> m_eOrig; 
00095     EdgeArray<edge> m_eCopy; 
00096 
00097 public:
00098     // construction
00099 
00101     GraphCopySimple(const Graph &G);
00102 
00104     GraphCopySimple(const GraphCopySimple &GC);
00105 
00106     virtual ~GraphCopySimple() {};
00107 
00109     const Graph &original() const { return *m_pGraph; }
00110 
00117     node original(node v) const { return m_vOrig[v]; }
00118 
00125     edge original(edge e) const { return m_eOrig[e]; }
00126 
00132     node copy(node v) const { return m_vCopy[v]; }
00133 
00139     edge copy(edge e) const { return m_eCopy[e]; }
00140 
00145     bool isDummy(node v) const { return (m_vOrig[v] == 0); }
00146 
00151     bool isDummy(edge e) const { return (m_eOrig[e] == 0); }
00152 
00154     GraphCopySimple &operator=(const GraphCopySimple &GC);
00155 
00156 
00158     node newNode() {
00159         return Graph::newNode();
00160     }
00161 
00167     node newNode(node vOrig) {
00168         OGDF_ASSERT(vOrig != 0 && vOrig->graphOf() == m_pGraph);
00169         node v = Graph::newNode();
00170         m_vCopy[m_vOrig[v] = vOrig] = v;
00171         return v;
00172     }
00173 
00175     edge newEdge(node v, node w) {
00176         return Graph::newEdge(v,w);
00177     }
00178 
00184     edge newEdge(edge eOrig) {
00185         OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
00186         edge e = Graph::newEdge(m_vCopy[eOrig->source()], m_vCopy[eOrig->target()]);
00187         m_eCopy[m_eOrig[e] = eOrig] = e;
00188         return e;
00189     }
00190 
00191 private:
00192     void initGC(const GraphCopySimple &GC, NodeArray<node> &vCopy,
00193         EdgeArray<edge> &eCopy);
00194 }; // class GraphCopySimple
00195 
00196 
00197 //---------------------------------------------------------
00198 // GraphCopy
00199 // graph copies (support for edge splitting)
00200 //---------------------------------------------------------
00235 class OGDF_EXPORT GraphCopy : public Graph {
00236 protected:
00237 
00238     const Graph *m_pGraph;   
00239     NodeArray<node> m_vOrig; 
00240     EdgeArray<edge> m_eOrig; 
00241     EdgeArray<ListIterator<edge> > m_eIterator; 
00242 
00243     NodeArray<node> m_vCopy; 
00244     EdgeArray<List<edge> > m_eCopy; 
00245 
00246 public:
00248 
00253     GraphCopy(const Graph &G);
00254 
00256     GraphCopy() : Graph() { }
00257 
00259 
00263     GraphCopy(const GraphCopy &GC);
00264 
00265     virtual ~GraphCopy() {};
00266 
00267 
00272 
00274     const Graph &original() const { return *m_pGraph; }
00275 
00282     node original(node v) const { return m_vOrig[v]; }
00283 
00290     edge original(edge e) const { return m_eOrig[e]; }
00291 
00297     node copy(node v) const { return m_vCopy[v]; }
00298 
00304     const List<edge> &chain(edge e) const { return m_eCopy[e]; }
00305 
00306     // returns first edge in chain(e)
00313     edge copy(edge e) const { return m_eCopy[e].front(); }
00314 
00319     bool isDummy(node v) const { return (m_vOrig[v] == 0); }
00320 
00325     bool isDummy(edge e) const { return (m_eOrig[e] == 0); }
00326 
00331     bool isReversed (edge e) const {
00332         return e->source() != original(copy(e)->source());
00333     }
00334 
00335     
00340 
00342     node newNode() {
00343         return Graph::newNode();
00344     }
00345 
00351     node newNode(node vOrig) {
00352         OGDF_ASSERT(vOrig != 0 && vOrig->graphOf() == m_pGraph);
00353         node v = Graph::newNode();
00354         m_vCopy[m_vOrig[v] = vOrig] = v;
00355         return v;
00356     }
00357 
00364     void delCopy(node v);
00365 
00372     void delCopy(edge e);
00373 
00374 
00379     virtual edge split(edge e);
00380 
00381 
00390     void unsplit(edge eIn, edge eOut);
00391 
00393     edge newEdge(edge eOrig);
00394 
00396 
00405     edge newEdge(edge eOrig, adjEntry adjSrc, node w);
00406 
00408 
00417     edge newEdge(edge eOrig, node v, adjEntry adjTgt);
00418 
00419     edge newEdge(node v, node w)                   { return Graph::newEdge(v, w); }
00420     edge newEdge(adjEntry adjSrc, adjEntry adjTgt) { return Graph::newEdge(adjSrc, adjTgt); }
00421     edge newEdge(node v, adjEntry adjTgt)          { return Graph::newEdge(v, adjTgt); }
00422     edge newEdge(adjEntry adjSrc, node w)          { return Graph::newEdge(adjSrc, w); }
00423 
00425 
00429     void setEdge(edge eOrig, edge eCopy);
00430     
00432 
00441     void insertEdgePath(edge eOrig, const SList<adjEntry> &crossedEdges);
00442 
00443     //for FixedEmbeddingUpwardEdgeInserter only
00444     void insertEdgePath(node srcOrig, node tgtOrig, const SList<adjEntry> &crossedEdges);
00445     
00446 
00448 
00451     void removeEdgePath(edge eOrig);
00452 
00454 
00459     edge insertCrossing(edge& crossingEdge,
00460                         edge crossedEdge,
00461                         bool topDown);
00462 
00463 
00468 
00470 
00484     edge newEdge(node v, adjEntry adj, edge eOrig, CombinatorialEmbedding &E);
00485 
00491     void setOriginalEmbedding();
00492 
00494 
00513     void insertEdgePathEmbedded(
00514         edge eOrig,
00515         CombinatorialEmbedding &E,
00516         const SList<adjEntry> &crossedEdges);
00517     
00525     void removeEdgePathEmbedded(
00526         CombinatorialEmbedding &E,
00527         edge                    eOrig,
00528         FaceSetPure            &newFaces);
00529 
00530 
00532 
00536 
00538     bool consistencyCheck() const;
00539 
00541 
00573     void createEmpty(const Graph &G);
00574 
00576 
00592     void initByNodes(const List<node> &nodes, EdgeArray<edge> &eCopy);
00593 
00595 
00607     void initByActiveNodes(const List<node> &nodes, 
00608         const NodeArray<bool> &activeNodes, EdgeArray<edge> &eCopy);
00609 
00611 
00615 
00617 
00625     GraphCopy &operator=(const GraphCopy &GC);
00626 
00627 
00629 
00630 private:
00631     void initGC(const GraphCopy &GC,
00632         NodeArray<node> &vCopy, EdgeArray<edge> &eCopy);
00633 
00634 }; // class GraphCopy
00635 
00636 
00637 } // end namespace ogdf
00638 
00639 #endif