00001
00002
00003
00004
00005
00006
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
00072
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
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 };
00193
00194
00195
00196
00197
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
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 };
00629
00630
00631 }
00632
00633 #endif