Go to the documentation of this file.00001
00002
00003
00004
00005
00006
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
00074
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
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 };
00195
00196
00197
00198
00199
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
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
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 };
00635
00636
00637 }
00638
00639 #endif