gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Several fixes and improvements in list_graph.h. - Fix incorrect or misleading renamings in the code and in the documentation. - Improve the documentation.
0 1 0
default
1 file changed with 166 insertions and 144 deletions:
↑ Collapse diff ↑
Show white space 6 line context
... ...
@@ -113,3 +113,3 @@
113 113

	
114
    void first(Arc& e) const { 
114
    void first(Arc& arc) const { 
115 115
      int n;
... ...
@@ -118,3 +118,3 @@
118 118
	  n = nodes[n].next);
119
      e.id = (n == -1) ? -1 : nodes[n].first_in;
119
      arc.id = (n == -1) ? -1 : nodes[n].first_in;
120 120
    }
... ...
@@ -295,13 +295,15 @@
295 295

	
296
  /// \addtogroup digraphs
296
  /// \addtogroup graphs
297 297
  /// @{
298 298

	
299
  ///A list digraph class.
299
  ///A general directed graph structure. 
300 300

	
301
  ///This is a simple and fast digraph implementation.
301
  ///\ref ListDigraph is a simple and fast <em>directed graph</em> 
302
  ///implementation based on static linked lists that are stored in 
303
  ///\c std::vector structures.   
302 304
  ///
303 305
  ///It conforms to the \ref concepts::Digraph "Digraph concept" and it
304
  ///also provides several additional useful extra functionalities.
305
  ///The most of the member functions and nested classes are
306
  ///documented only in the concept class.
306
  ///also provides several useful additional functionalities.
307
  ///Most of the member functions and nested classes are documented
308
  ///only in the concept class.
307 309
  ///
... ...
@@ -310,3 +312,3 @@
310 312
  ///
311
  ///\sa concepts::Digraph.
313
  ///\sa concepts::Digraph
312 314

	
... ...
@@ -314,5 +316,5 @@
314 316
  private:
315
    ///ListDigraph is \e not copy constructible. Use DigraphCopy() instead.
317
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
316 318
    
317
    ///ListDigraph is \e not copy constructible. Use DigraphCopy() instead.
319
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
318 320
    ///
... ...
@@ -320,6 +322,6 @@
320 322
    ///\brief Assignment of ListDigraph to another one is \e not allowed.
321
    ///Use DigraphCopy() instead.
323
    ///Use copyDigraph() instead.
322 324

	
323 325
    ///Assignment of ListDigraph to another one is \e not allowed.
324
    ///Use DigraphCopy() instead.
326
    ///Use copyDigraph() instead.
325 327
    void operator=(const ListDigraph &) {}
... ...
@@ -337,4 +339,4 @@
337 339
    
338
    /// \return the new node.
339
    ///
340
    ///Add a new node to the digraph.
341
    ///\return the new node.
340 342
    Node addNode() { return Parent::addNode(); }
... ...
@@ -350,5 +352,5 @@
350 352

	
351
    /// Changes the target of \c e to \c n
353
    /// Change the target of \c e to \c n
352 354

	
353
    /// Changes the target of \c e to \c n
355
    /// Change the target of \c e to \c n
354 356
    ///
... ...
@@ -357,2 +359,3 @@
357 359
    ///invalidated.
360
    ///
358 361
    ///\warning This functionality cannot be used together with the Snapshot
... ...
@@ -362,5 +365,5 @@
362 365
    }
363
    /// Changes the source of \c e to \c n
366
    /// Change the source of \c e to \c n
364 367

	
365
    /// Changes the source of \c e to \c n
368
    /// Change the source of \c e to \c n
366 369
    ///
... ...
@@ -369,2 +372,3 @@
369 372
    ///invalidated.
373
    ///
370 374
    ///\warning This functionality cannot be used together with the Snapshot
... ...
@@ -380,2 +384,3 @@
380 384
    ///invalidated.
385
    ///
381 386
    ///\warning This functionality cannot be used together with the Snapshot
... ...
@@ -388,3 +393,5 @@
388 393

	
389
    /// Using this it is possible to avoid the superfluous memory
394
    /// Reserve memory for nodes.
395

	
396
    /// Using this function it is possible to avoid the superfluous memory
390 397
    /// allocation: if you know that the digraph you want to build will
... ...
@@ -396,6 +403,5 @@
396 403

	
397
    /// \brief Using this it is possible to avoid the superfluous memory
398
    /// allocation.
404
    /// Reserve memory for arcs.
399 405

	
400
    /// Using this it is possible to avoid the superfluous memory
406
    /// Using this function it is possible to avoid the superfluous memory
401 407
    /// allocation: if you know that the digraph you want to build will
... ...
@@ -410,3 +416,2 @@
410 416
    ///This function contracts two nodes.
411
    ///
412 417
    ///Node \p b will be removed but instead of deleting
... ...
@@ -416,6 +421,6 @@
416 421
    ///
417
    ///\note The <tt>ArcIt</tt>s
418
    ///referencing a moved arc remain
422
    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
419 423
    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s
420 424
    ///may be invalidated.
425
    ///
421 426
    ///\warning This functionality cannot be used together with the Snapshot
... ...
@@ -454,4 +459,5 @@
454 459
    ///\warning This functionality cannot be used together with the
455
    ///Snapshot feature.  \todo It could be implemented in a bit
456
    ///faster way.
460
    ///Snapshot feature.
461
    ///
462
    ///\todo It could be implemented in a bit faster way.
457 463
    Node split(Node n, bool connect = true) {
... ...
@@ -473,5 +479,7 @@
473 479
    ///b. Finally an arc from \c b to the original target is added.
474
    ///\return The newly created node.  
475
    ///\warning This functionality
476
    ///cannot be used together with the Snapshot feature.
480
    ///
481
    ///\return The newly created node.
482
    ///
483
    ///\warning This functionality cannot be used together with the
484
    ///Snapshot feature.
477 485
    Node split(Arc e) {
... ...
@@ -484,6 +492,5 @@
484 492
    /// \brief Class to make a snapshot of the digraph and restore
485
    /// to it later.
493
    /// it later.
486 494
    ///
487
    /// Class to make a snapshot of the digraph and to restore it
488
    /// later.
495
    /// Class to make a snapshot of the digraph and restore it later.
489 496
    ///
... ...
@@ -492,4 +499,5 @@
492 499
    ///
493
    /// \warning Arc and node deletions cannot be restored. This
494
    /// events invalidate the snapshot. 
500
    /// \warning Arc and node deletions and other modifications (e.g.
501
    /// contracting, splitting, reversing arcs or nodes) cannot be 
502
    /// restored. These events invalidate the snapshot. 
495 503
    class Snapshot {
... ...
@@ -778,5 +786,5 @@
778 786
      Edge (Invalid) { id = -1; }
779
      bool operator==(const Edge& arc) const {return id == arc.id;}
780
      bool operator!=(const Edge& arc) const {return id != arc.id;}
781
      bool operator<(const Edge& arc) const {return id < arc.id;}
787
      bool operator==(const Edge& edge) const {return id == edge.id;}
788
      bool operator!=(const Edge& edge) const {return id != edge.id;}
789
      bool operator<(const Edge& edge) const {return id < edge.id;}
782 790
    };
... ...
@@ -911,6 +919,6 @@
911 919
    void firstInc(Edge &e, bool& d, const Node& v) const {
912
      int de = nodes[v.id].first_out;
913
      if (de != -1 ) {
914
        e.id = de / 2;
915
        d = ((de & 1) == 1);
920
      int a = nodes[v.id].first_out;
921
      if (a != -1 ) {
922
        e.id = a / 2;
923
        d = ((a & 1) == 1);
916 924
      } else {
... ...
@@ -921,6 +929,6 @@
921 929
    void nextInc(Edge &e, bool& d) const {
922
      int de = (arcs[(e.id * 2) | (d ? 1 : 0)].next_out);
923
      if (de != -1 ) {
924
        e.id = de / 2;
925
        d = ((de & 1) == 1);
930
      int a = (arcs[(e.id * 2) | (d ? 1 : 0)].next_out);
931
      if (a != -1 ) {
932
        e.id = a / 2;
933
        d = ((a & 1) == 1);
926 934
      } else {
... ...
@@ -1010,4 +1018,4 @@
1010 1018
    
1011
    void erase(const Edge& arc) {
1012
      int n = arc.id * 2;
1019
    void erase(const Edge& edge) {
1020
      int n = edge.id * 2;
1013 1021
      
... ...
@@ -1091,5 +1099,2 @@
1091 1099

	
1092
//   typedef GraphExtender<UndirDigraphExtender<ListDigraphBase> > 
1093
//   ExtendedListGraphBase;
1094

	
1095 1100
  typedef GraphExtender<ListGraphBase> ExtendedListGraphBase;
... ...
@@ -1097,23 +1102,26 @@
1097 1102

	
1098

	
1099
  /// \addtogroup digraphs
1103
  /// \addtogroup graphs
1100 1104
  /// @{
1101 1105

	
1102
  ///An undirected list digraph class.
1106
  ///A general undirected graph structure.
1103 1107

	
1104
  ///This is a simple and fast undirected digraph implementation.
1108
  ///\ref ListGraph is a simple and fast <em>undirected graph</em> 
1109
  ///implementation based on static linked lists that are stored in 
1110
  ///\c std::vector structures. 
1105 1111
  ///
1106
  ///An important extra feature of this digraph implementation is that
1112
  ///It conforms to the \ref concepts::Graph "Graph concept" and it
1113
  ///also provides several useful additional functionalities.
1114
  ///Most of the member functions and nested classes are documented
1115
  ///only in the concept class.
1116
  ///
1117
  ///An important extra feature of this graph implementation is that
1107 1118
  ///its maps are real \ref concepts::ReferenceMap "reference map"s.
1108 1119
  ///
1109
  ///It conforms to the
1110
  ///\ref concepts::Graph "Graph concept".
1111
  ///
1112
  ///\sa concepts::Graph.
1113
  ///
1120
  ///\sa concepts::Graph
1121

	
1114 1122
  class ListGraph : public ExtendedListGraphBase {
1115 1123
  private:
1116
    ///ListGraph is \e not copy constructible. Use GraphCopy() instead.
1124
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1117 1125

	
1118
    ///ListGraph is \e not copy constructible. Use GraphCopy() instead.
1126
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1119 1127
    ///
... ...
@@ -1121,6 +1129,6 @@
1121 1129
    ///\brief Assignment of ListGraph to another one is \e not allowed.
1122
    ///Use GraphCopy() instead.
1130
    ///Use copyGraph() instead.
1123 1131

	
1124 1132
    ///Assignment of ListGraph to another one is \e not allowed.
1125
    ///Use GraphCopy() instead.
1133
    ///Use copyGraph() instead.
1126 1134
    void operator=(const ListGraph &) {}
... ...
@@ -1135,13 +1143,13 @@
1135 1143

	
1136
    typedef Parent::OutArcIt IncArcIt;
1144
    typedef Parent::OutArcIt IncEdgeIt;
1137 1145

	
1138
    /// \brief Add a new node to the digraph.
1146
    /// \brief Add a new node to the graph.
1139 1147
    ///
1148
    /// Add a new node to the graph.
1140 1149
    /// \return the new node.
1141
    ///
1142 1150
    Node addNode() { return Parent::addNode(); }
1143 1151

	
1144
    /// \brief Add a new edge to the digraph.
1152
    /// \brief Add a new edge to the graph.
1145 1153
    ///
1146
    /// Add a new arc to the digraph with source node \c s
1154
    /// Add a new edge to the graph with source node \c s
1147 1155
    /// and target node \c t.
... ...
@@ -1151,5 +1159,5 @@
1151 1159
    }
1152
    /// \brief Changes the source of \c e to \c n
1160
    /// \brief Change the source of \c e to \c n
1153 1161
    ///
1154
    /// Changes the source of \c e to \c n
1162
    /// This function changes the source of \c e to \c n.
1155 1163
    ///
... ...
@@ -1158,2 +1166,5 @@
1158 1166
    ///valid. However <tt>OutArcIt</tt>s are invalidated.
1167
    ///
1168
    ///\warning This functionality cannot be used together with the
1169
    ///Snapshot feature.
1159 1170
    void changeSource(Edge e, Node n) { 
... ...
@@ -1161,5 +1172,5 @@
1161 1172
    }    
1162
    /// \brief Changes the target of \c e to \c n
1173
    /// \brief Change the target of \c e to \c n
1163 1174
    ///
1164
    /// Changes the target of \c e to \c n
1175
    /// This function changes the target of \c e to \c n.
1165 1176
    ///
... ...
@@ -1167,2 +1178,5 @@
1167 1178
    /// valid. However the other iterators may be invalidated.
1179
    ///
1180
    ///\warning This functionality cannot be used together with the
1181
    ///Snapshot feature.
1168 1182
    void changeTarget(Edge e, Node n) { 
... ...
@@ -1170,6 +1184,6 @@
1170 1184
    }
1171
    /// \brief Changes the source of \c e to \c n
1185
    /// \brief Change the source of \c e to \c n
1172 1186
    ///
1173
    /// Changes the source of \c e to \c n. It changes the proper
1174
    /// node of the represented edge.
1187
    /// This function changes the source of \c e to \c n. 
1188
    /// It also changes the proper node of the represented edge.
1175 1189
    ///
... ...
@@ -1178,2 +1192,5 @@
1178 1192
    ///valid. However <tt>OutArcIt</tt>s are invalidated.
1193
    ///
1194
    ///\warning This functionality cannot be used together with the
1195
    ///Snapshot feature.
1179 1196
    void changeSource(Arc e, Node n) { 
... ...
@@ -1185,6 +1202,6 @@
1185 1202
    }
1186
    /// \brief Changes the target of \c e to \c n
1203
    /// \brief Change the target of \c e to \c n
1187 1204
    ///
1188
    /// Changes the target of \c e to \c n. It changes the proper
1189
    /// node of the represented edge.
1205
    /// This function changes the target of \c e to \c n. 
1206
    /// It also changes the proper node of the represented edge.
1190 1207
    ///
... ...
@@ -1193,2 +1210,5 @@
1193 1210
    ///valid. However <tt>InArcIt</tt>s are invalidated.
1211
    ///
1212
    ///\warning This functionality cannot be used together with the
1213
    ///Snapshot feature.
1194 1214
    void changeTarget(Arc e, Node n) { 
... ...
@@ -1203,3 +1223,2 @@
1203 1223
    /// This function contracts two nodes.
1204
    ///
1205 1224
    /// Node \p b will be removed but instead of deleting
... ...
@@ -1211,5 +1230,8 @@
1211 1230
    /// valid.
1231
    ///
1232
    ///\warning This functionality cannot be used together with the
1233
    ///Snapshot feature.
1212 1234
    void contract(Node a, Node b, bool r = true) {
1213
      for(IncArcIt e(*this, b); e!=INVALID;) {
1214
	IncArcIt f = e; ++f;
1235
      for(IncEdgeIt e(*this, b); e!=INVALID;) {
1236
	IncEdgeIt f = e; ++f;
1215 1237
	if (r && runningNode(e) == a) {
... ...
@@ -1227,7 +1249,6 @@
1227 1249

	
1228
    /// \brief Class to make a snapshot of the digraph and restore
1229
    /// to it later.
1250
    /// \brief Class to make a snapshot of the graph and restore
1251
    /// it later.
1230 1252
    ///
1231
    /// Class to make a snapshot of the digraph and to restore it
1232
    /// later.
1253
    /// Class to make a snapshot of the graph and restore it later.
1233 1254
    ///
... ...
@@ -1236,4 +1257,5 @@
1236 1257
    ///
1237
    /// \warning Arc and node deletions cannot be restored. This
1238
    /// events invalidate the snapshot. 
1258
    /// \warning Edge and node deletions and other modifications
1259
    /// (e.g. changing nodes of edges, contracting nodes) cannot be 
1260
    /// restored. These events invalidate the snapshot.
1239 1261
    class Snapshot {
... ...
@@ -1305,16 +1327,16 @@
1305 1327

	
1306
        virtual void add(const Edge& arc) {
1307
          snapshot.addEdge(arc);
1328
        virtual void add(const Edge& edge) {
1329
          snapshot.addEdge(edge);
1308 1330
        }
1309
        virtual void add(const std::vector<Edge>& arcs) {
1310
          for (int i = arcs.size() - 1; i >= 0; ++i) {
1311
            snapshot.addEdge(arcs[i]);
1331
        virtual void add(const std::vector<Edge>& edges) {
1332
          for (int i = edges.size() - 1; i >= 0; ++i) {
1333
            snapshot.addEdge(edges[i]);
1312 1334
          }
1313 1335
        }
1314
        virtual void erase(const Edge& arc) {
1315
          snapshot.eraseEdge(arc);
1336
        virtual void erase(const Edge& edge) {
1337
          snapshot.eraseEdge(edge);
1316 1338
        }
1317
        virtual void erase(const std::vector<Edge>& arcs) {
1318
          for (int i = 0; i < int(arcs.size()); ++i) {
1319
            snapshot.eraseEdge(arcs[i]);
1339
        virtual void erase(const std::vector<Edge>& edges) {
1340
          for (int i = 0; i < int(edges.size()); ++i) {
1341
            snapshot.eraseEdge(edges[i]);
1320 1342
          }
... ...
@@ -1322,10 +1344,10 @@
1322 1344
        virtual void build() {
1323
          Edge arc;
1324
          std::vector<Edge> arcs;
1325
          for (notifier()->first(arc); arc != INVALID; 
1326
               notifier()->next(arc)) {
1327
            arcs.push_back(arc);
1345
          Edge edge;
1346
          std::vector<Edge> edges;
1347
          for (notifier()->first(edge); edge != INVALID; 
1348
               notifier()->next(edge)) {
1349
            edges.push_back(edge);
1328 1350
          }
1329
          for (int i = arcs.size() - 1; i >= 0; --i) {
1330
            snapshot.addEdge(arcs[i]);
1351
          for (int i = edges.size() - 1; i >= 0; --i) {
1352
            snapshot.addEdge(edges[i]);
1331 1353
          }
... ...
@@ -1333,6 +1355,6 @@
1333 1355
        virtual void clear() {
1334
          Edge arc;
1335
          for (notifier()->first(arc); arc != INVALID; 
1336
               notifier()->next(arc)) {
1337
            snapshot.eraseEdge(arc);
1356
          Edge edge;
1357
          for (notifier()->first(edge); edge != INVALID; 
1358
               notifier()->next(edge)) {
1359
            snapshot.eraseEdge(edge);
1338 1360
          }
... ...
@@ -1342,10 +1364,10 @@
1342 1364
      };
1343
      
1344
      ListGraph *digraph;
1365

	
1366
      ListGraph *graph;
1345 1367

	
1346 1368
      NodeObserverProxy node_observer_proxy;
1347
      EdgeObserverProxy arc_observer_proxy;
1369
      EdgeObserverProxy edge_observer_proxy;
1348 1370

	
1349 1371
      std::list<Node> added_nodes;
1350
      std::list<Edge> added_arcs;
1372
      std::list<Edge> added_edges;
1351 1373

	
... ...
@@ -1360,3 +1382,3 @@
1360 1382
          clear();
1361
          arc_observer_proxy.detach();
1383
          edge_observer_proxy.detach();
1362 1384
          throw NodeNotifier::ImmediateDetach();
... ...
@@ -1367,9 +1389,9 @@
1367 1389

	
1368
      void addEdge(const Edge& arc) {
1369
        added_arcs.push_front(arc);        
1390
      void addEdge(const Edge& edge) {
1391
        added_edges.push_front(edge);        
1370 1392
      }
1371
      void eraseEdge(const Edge& arc) {
1393
      void eraseEdge(const Edge& edge) {
1372 1394
        std::list<Edge>::iterator it = 
1373
          std::find(added_arcs.begin(), added_arcs.end(), arc);
1374
        if (it == added_arcs.end()) {
1395
          std::find(added_edges.begin(), added_edges.end(), edge);
1396
        if (it == added_edges.end()) {
1375 1397
          clear();
... ...
@@ -1378,10 +1400,10 @@
1378 1400
        } else {
1379
          added_arcs.erase(it);
1380
        }        
1401
          added_edges.erase(it);
1402
        }
1381 1403
      }
1382 1404

	
1383
      void attach(ListGraph &_digraph) {
1384
	digraph = &_digraph;
1385
	node_observer_proxy.attach(digraph->notifier(Node()));
1386
        arc_observer_proxy.attach(digraph->notifier(Edge()));
1405
      void attach(ListGraph &_graph) {
1406
	graph = &_graph;
1407
	node_observer_proxy.attach(graph->notifier(Node()));
1408
        edge_observer_proxy.attach(graph->notifier(Edge()));
1387 1409
      }
... ...
@@ -1390,3 +1412,3 @@
1390 1412
	node_observer_proxy.detach();
1391
	arc_observer_proxy.detach();
1413
	edge_observer_proxy.detach();
1392 1414
      }
... ...
@@ -1399,3 +1421,3 @@
1399 1421
        added_nodes.clear();
1400
        added_arcs.clear();        
1422
        added_edges.clear();        
1401 1423
      }
... ...
@@ -1409,4 +1431,4 @@
1409 1431
      Snapshot() 
1410
        : digraph(0), node_observer_proxy(*this), 
1411
          arc_observer_proxy(*this) {}
1432
        : graph(0), node_observer_proxy(*this), 
1433
          edge_observer_proxy(*this) {}
1412 1434
      
... ...
@@ -1414,8 +1436,8 @@
1414 1436
      ///      
1415
      /// This constructor immediately makes a snapshot of the digraph.
1416
      /// \param _digraph The digraph we make a snapshot of.
1417
      Snapshot(ListGraph &_digraph) 
1437
      /// This constructor immediately makes a snapshot of the graph.
1438
      /// \param _graph The graph we make a snapshot of.
1439
      Snapshot(ListGraph &_graph) 
1418 1440
        : node_observer_proxy(*this), 
1419
          arc_observer_proxy(*this) {
1420
	attach(_digraph);
1441
          edge_observer_proxy(*this) {
1442
	attach(_graph);
1421 1443
      }
... ...
@@ -1424,3 +1446,3 @@
1424 1446
      ///
1425
      /// Make a snapshot of the digraph.
1447
      /// Make a snapshot of the graph.
1426 1448
      ///
... ...
@@ -1428,4 +1450,4 @@
1428 1450
      /// call, the previous snapshot gets lost.
1429
      /// \param _digraph The digraph we make the snapshot of.
1430
      void save(ListGraph &_digraph) {
1451
      /// \param _graph The graph we make the snapshot of.
1452
      void save(ListGraph &_graph) {
1431 1453
        if (attached()) {
... ...
@@ -1434,3 +1456,3 @@
1434 1456
        }
1435
        attach(_digraph);
1457
        attach(_graph);
1436 1458
      }
... ...
@@ -1442,5 +1464,5 @@
1442 1464
	detach();
1443
	for(std::list<Edge>::iterator it = added_arcs.begin(); 
1444
            it != added_arcs.end(); ++it) {
1445
	  digraph->erase(*it);
1465
	for(std::list<Edge>::iterator it = added_edges.begin(); 
1466
            it != added_edges.end(); ++it) {
1467
	  graph->erase(*it);
1446 1468
	}
... ...
@@ -1448,3 +1470,3 @@
1448 1470
            it != added_nodes.end(); ++it) {
1449
	  digraph->erase(*it);
1471
	  graph->erase(*it);
1450 1472
	}
0 comments (0 inline)