Go to the documentation of this file.00001
00002
00003
00004
00005
00006
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
00064
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
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 };
00185
00186
00187
00188
00189
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
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
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 };
00625
00626
00627 }
00628
00629 #endif