Open
Graph Drawing
Framework

 v.2012.05
 

GraphCopy.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  
00043 #ifdef _MSC_VER
00044 #pragma once
00045 #endif
00046 
00047 #ifndef OGDF_GRAPH_COPY_H
00048 #define OGDF_GRAPH_COPY_H
00049 
00050 
00051 #include <ogdf/basic/NodeArray.h>
00052 #include <ogdf/basic/EdgeArray.h>
00053 #include <ogdf/basic/SList.h>
00054 #include <ogdf/basic/CombinatorialEmbedding.h>
00055 
00056 
00057 namespace ogdf {
00058 
00059 class OGDF_EXPORT FaceSetPure;
00060 
00061 
00062 //---------------------------------------------------------
00063 // GraphCopySimple
00064 // simple graph copies (no support for edge splitting)
00065 //---------------------------------------------------------
00079 class OGDF_EXPORT GraphCopySimple : public Graph {
00080 
00081     const Graph *m_pGraph;   
00082     NodeArray<node> m_vOrig; 
00083     NodeArray<node> m_vCopy; 
00084     EdgeArray<edge> m_eOrig; 
00085     EdgeArray<edge> m_eCopy; 
00086 
00087 public:
00088     // construction
00089 
00091     GraphCopySimple(const Graph &G);
00092 
00094     GraphCopySimple(const GraphCopySimple &GC);
00095 
00096     virtual ~GraphCopySimple() {};
00097 
00099     const Graph &original() const { return *m_pGraph; }
00100 
00107     node original(node v) const { return m_vOrig[v]; }
00108 
00115     edge original(edge e) const { return m_eOrig[e]; }
00116 
00122     node copy(node v) const { return m_vCopy[v]; }
00123 
00129     edge copy(edge e) const { return m_eCopy[e]; }
00130 
00135     bool isDummy(node v) const { return (m_vOrig[v] == 0); }
00136 
00141     bool isDummy(edge e) const { return (m_eOrig[e] == 0); }
00142 
00144     GraphCopySimple &operator=(const GraphCopySimple &GC);
00145 
00146 
00148     node newNode() {
00149         return Graph::newNode();
00150     }
00151 
00157     node newNode(node vOrig) {
00158         OGDF_ASSERT(vOrig != 0 && vOrig->graphOf() == m_pGraph);
00159         node v = Graph::newNode();
00160         m_vCopy[m_vOrig[v] = vOrig] = v;
00161         return v;
00162     }
00163 
00165     edge newEdge(node v, node w) {
00166         return Graph::newEdge(v,w);
00167     }
00168 
00174     edge newEdge(edge eOrig) {
00175         OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
00176         edge e = Graph::newEdge(m_vCopy[eOrig->source()], m_vCopy[eOrig->target()]);
00177         m_eCopy[m_eOrig[e] = eOrig] = e;
00178         return e;
00179     }
00180 
00181 private:
00182     void initGC(const GraphCopySimple &GC, NodeArray<node> &vCopy,
00183         EdgeArray<edge> &eCopy);
00184 }; // class GraphCopySimple
00185 
00186 
00187 //---------------------------------------------------------
00188 // GraphCopy
00189 // graph copies (support for edge splitting)
00190 //---------------------------------------------------------
00225 class OGDF_EXPORT GraphCopy : public Graph {
00226 protected:
00227 
00228     const Graph *m_pGraph;   
00229     NodeArray<node> m_vOrig; 
00230     EdgeArray<edge> m_eOrig; 
00231     EdgeArray<ListIterator<edge> > m_eIterator; 
00232 
00233     NodeArray<node> m_vCopy; 
00234     EdgeArray<List<edge> > m_eCopy; 
00235 
00236 public:
00238 
00243     GraphCopy(const Graph &G);
00244 
00246     GraphCopy() : Graph() { }
00247 
00249 
00253     GraphCopy(const GraphCopy &GC);
00254 
00255     virtual ~GraphCopy() {};
00256 
00257 
00262 
00264     const Graph &original() const { return *m_pGraph; }
00265 
00272     node original(node v) const { return m_vOrig[v]; }
00273 
00280     edge original(edge e) const { return m_eOrig[e]; }
00281 
00287     node copy(node v) const { return m_vCopy[v]; }
00288 
00294     const List<edge> &chain(edge e) const { return m_eCopy[e]; }
00295 
00296     // returns first edge in chain(e)
00303     edge copy(edge e) const { return m_eCopy[e].front(); }
00304 
00309     bool isDummy(node v) const { return (m_vOrig[v] == 0); }
00310 
00315     bool isDummy(edge e) const { return (m_eOrig[e] == 0); }
00316 
00321     bool isReversed (edge e) const {
00322         return e->source() != original(copy(e)->source());
00323     }
00324 
00325     
00330 
00332     node newNode() {
00333         return Graph::newNode();
00334     }
00335 
00341     node newNode(node vOrig) {
00342         OGDF_ASSERT(vOrig != 0 && vOrig->graphOf() == m_pGraph);
00343         node v = Graph::newNode();
00344         m_vCopy[m_vOrig[v] = vOrig] = v;
00345         return v;
00346     }
00347 
00354     void delCopy(node v);
00355 
00362     void delCopy(edge e);
00363 
00364 
00369     virtual edge split(edge e);
00370 
00371 
00380     void unsplit(edge eIn, edge eOut);
00381 
00383     edge newEdge(edge eOrig);
00384 
00386 
00395     edge newEdge(edge eOrig, adjEntry adjSrc, node w);
00396 
00398 
00407     edge newEdge(edge eOrig, node v, adjEntry adjTgt);
00408 
00409     edge newEdge(node v, node w)                   { return Graph::newEdge(v, w); }
00410     edge newEdge(adjEntry adjSrc, adjEntry adjTgt) { return Graph::newEdge(adjSrc, adjTgt); }
00411     edge newEdge(node v, adjEntry adjTgt)          { return Graph::newEdge(v, adjTgt); }
00412     edge newEdge(adjEntry adjSrc, node w)          { return Graph::newEdge(adjSrc, w); }
00413 
00415 
00419     void setEdge(edge eOrig, edge eCopy);
00420     
00422 
00431     void insertEdgePath(edge eOrig, const SList<adjEntry> &crossedEdges);
00432 
00433     //for FixedEmbeddingUpwardEdgeInserter only
00434     void insertEdgePath(node srcOrig, node tgtOrig, const SList<adjEntry> &crossedEdges);
00435     
00436 
00438 
00441     void removeEdgePath(edge eOrig);
00442 
00444 
00449     edge insertCrossing(edge& crossingEdge,
00450                         edge crossedEdge,
00451                         bool topDown);
00452 
00453 
00458 
00460 
00474     edge newEdge(node v, adjEntry adj, edge eOrig, CombinatorialEmbedding &E);
00475 
00481     void setOriginalEmbedding();
00482 
00484 
00503     void insertEdgePathEmbedded(
00504         edge eOrig,
00505         CombinatorialEmbedding &E,
00506         const SList<adjEntry> &crossedEdges);
00507     
00515     void removeEdgePathEmbedded(
00516         CombinatorialEmbedding &E,
00517         edge                    eOrig,
00518         FaceSetPure            &newFaces);
00519 
00520 
00522 
00526 
00528     bool consistencyCheck() const;
00529 
00531 
00563     void createEmpty(const Graph &G);
00564 
00566 
00582     void initByNodes(const List<node> &nodes, EdgeArray<edge> &eCopy);
00583 
00585 
00597     void initByActiveNodes(const List<node> &nodes, 
00598         const NodeArray<bool> &activeNodes, EdgeArray<edge> &eCopy);
00599 
00601 
00605 
00607 
00615     GraphCopy &operator=(const GraphCopy &GC);
00616 
00617 
00619 
00620 private:
00621     void initGC(const GraphCopy &GC,
00622         NodeArray<node> &vCopy, EdgeArray<edge> &eCopy);
00623 
00624 }; // class GraphCopy
00625 
00626 
00627 } // end namespace ogdf
00628 
00629 #endif