gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Add more docs to LGF function interface (#109)
0 2 0
default
2 files changed with 309 insertions and 190 deletions:
↑ Collapse diff ↑
Ignore white space 12 line context
... ...
@@ -98,29 +98,29 @@
98 98

	
99 99
      virtual void set(const Item& item ,const std::string& value) {
100 100
        _map.set(item, _converter(value));
101 101
      }
102 102
    };
103 103

	
104
    template <typename _Graph, bool _dir, typename _Map,
104
    template <typename _GR, bool _dir, typename _Map,
105 105
              typename _Converter = DefaultConverter<typename _Map::Value> >
106
    class GraphArcMapStorage : public MapStorageBase<typename _Graph::Edge> {
106
    class GraphArcMapStorage : public MapStorageBase<typename _GR::Edge> {
107 107
    public:
108 108
      typedef _Map Map;
109 109
      typedef _Converter Converter;
110
      typedef _Graph Graph;
111
      typedef typename Graph::Edge Item;
110
      typedef _GR GR;
111
      typedef typename GR::Edge Item;
112 112
      static const bool dir = _dir;
113 113

	
114 114
    private:
115
      const Graph& _graph;
115
      const GR& _graph;
116 116
      Map& _map;
117 117
      Converter _converter;
118 118

	
119 119
    public:
120
      GraphArcMapStorage(const Graph& graph, Map& map,
120
      GraphArcMapStorage(const GR& graph, Map& map,
121 121
                         const Converter& converter = Converter())
122 122
        : _graph(graph), _map(map), _converter(converter) {}
123 123
      virtual ~GraphArcMapStorage() {}
124 124

	
125 125
      virtual void set(const Item& item ,const std::string& value) {
126 126
        _map.set(_graph.direct(item, dir), _converter(value));
... ...
@@ -170,27 +170,27 @@
170 170
          throw FormatError(msg.str());
171 171
        }
172 172
        return it->second;
173 173
      }
174 174
    };
175 175

	
176
    template <typename Graph>
176
    template <typename GR>
177 177
    struct GraphArcLookUpConverter {
178
      const Graph& _graph;
179
      const std::map<std::string, typename Graph::Edge>& _map;
180

	
181
      GraphArcLookUpConverter(const Graph& graph,
178
      const GR& _graph;
179
      const std::map<std::string, typename GR::Edge>& _map;
180

	
181
      GraphArcLookUpConverter(const GR& graph,
182 182
                              const std::map<std::string,
183
                                             typename Graph::Edge>& map)
183
                                             typename GR::Edge>& map)
184 184
        : _graph(graph), _map(map) {}
185 185

	
186
      typename Graph::Arc operator()(const std::string& str) {
186
      typename GR::Arc operator()(const std::string& str) {
187 187
        if (str.empty() || (str[0] != '+' && str[0] != '-')) {
188 188
          throw FormatError("Item must start with '+' or '-'");
189 189
        }
190
        typename std::map<std::string, typename Graph::Edge>
190
        typename std::map<std::string, typename GR::Edge>
191 191
          ::const_iterator it = _map.find(str.substr(1));
192 192
        if (it == _map.end()) {
193 193
          throw FormatError("Item not found");
194 194
        }
195 195
        return _graph.direct(it->second, str[0] == '+');
196 196
      }
... ...
@@ -384,22 +384,21 @@
384 384
        else if (is.eof()) is.clear();
385 385
      }
386 386
    };
387 387

	
388 388
  }
389 389

	
390
  template <typename Digraph>
390
  template <typename DGR>
391 391
  class DigraphReader;
392 392

	
393
  template <typename Digraph>
394
  DigraphReader<Digraph> digraphReader(Digraph& digraph, 
395
                                       std::istream& is = std::cin);
396
  template <typename Digraph>
397
  DigraphReader<Digraph> digraphReader(Digraph& digraph, const std::string& fn);
398
  template <typename Digraph>
399
  DigraphReader<Digraph> digraphReader(Digraph& digraph, const char *fn);
393
  template <typename TDGR>
394
  DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is = std::cin);
395
  template <typename TDGR>
396
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const std::string& fn);
397
  template <typename TDGR>
398
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const char *fn);
400 399

	
401 400
  /// \ingroup lemon_io
402 401
  ///
403 402
  /// \brief \ref lgf-format "LGF" reader for directed graphs
404 403
  ///
405 404
  /// This utility reads an \ref lgf-format "LGF" file.
... ...
@@ -416,13 +415,13 @@
416 415
  /// then a default conversion will be used. One map can be read into
417 416
  /// multiple map objects at the same time. The \c attribute(), \c
418 417
  /// node() and \c arc() functions are used to add attribute reading
419 418
  /// rules.
420 419
  ///
421 420
  ///\code
422
  /// DigraphReader<Digraph>(digraph, std::cin).
421
  /// DigraphReader<DGR>(digraph, std::cin).
423 422
  ///   nodeMap("coordinates", coord_map).
424 423
  ///   arcMap("capacity", cap_map).
425 424
  ///   node("source", src).
426 425
  ///   node("target", trg).
427 426
  ///   attribute("caption", caption).
428 427
  ///   run();
... ...
@@ -445,27 +444,27 @@
445 444
  /// The previously read label node map should be passed to the \c
446 445
  /// useNodes() functions. Another application of multipass reading when
447 446
  /// paths are given as a node map or an arc map.
448 447
  /// It is impossible to read this in
449 448
  /// a single pass, because the arcs are not constructed when the node
450 449
  /// maps are read.
451
  template <typename GR>
450
  template <typename DGR>
452 451
  class DigraphReader {
453 452
  public:
454 453

	
455
    typedef GR Digraph;
454
    typedef DGR Digraph;
456 455

	
457 456
  private:
458 457

	
459
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
458
    TEMPLATE_DIGRAPH_TYPEDEFS(DGR);
460 459

	
461 460
    std::istream* _is;
462 461
    bool local_is;
463 462
    std::string _filename;
464 463

	
465
    Digraph& _digraph;
464
    DGR& _digraph;
466 465

	
467 466
    std::string _nodes_caption;
468 467
    std::string _arcs_caption;
469 468
    std::string _attributes_caption;
470 469

	
471 470
    typedef std::map<std::string, Node> NodeIndex;
... ...
@@ -497,22 +496,22 @@
497 496
  public:
498 497

	
499 498
    /// \brief Constructor
500 499
    ///
501 500
    /// Construct a directed graph reader, which reads from the given
502 501
    /// input stream.
503
    DigraphReader(Digraph& digraph, std::istream& is = std::cin)
502
    DigraphReader(DGR& digraph, std::istream& is = std::cin)
504 503
      : _is(&is), local_is(false), _digraph(digraph),
505 504
        _use_nodes(false), _use_arcs(false),
506 505
        _skip_nodes(false), _skip_arcs(false) {}
507 506

	
508 507
    /// \brief Constructor
509 508
    ///
510 509
    /// Construct a directed graph reader, which reads from the given
511 510
    /// file.
512
    DigraphReader(Digraph& digraph, const std::string& fn)
511
    DigraphReader(DGR& digraph, const std::string& fn)
513 512
      : _is(new std::ifstream(fn.c_str())), local_is(true),
514 513
        _filename(fn), _digraph(digraph),
515 514
        _use_nodes(false), _use_arcs(false),
516 515
        _skip_nodes(false), _skip_arcs(false) {
517 516
      if (!(*_is)) {
518 517
        delete _is;
... ...
@@ -521,13 +520,13 @@
521 520
    }
522 521

	
523 522
    /// \brief Constructor
524 523
    ///
525 524
    /// Construct a directed graph reader, which reads from the given
526 525
    /// file.
527
    DigraphReader(Digraph& digraph, const char* fn)
526
    DigraphReader(DGR& digraph, const char* fn)
528 527
      : _is(new std::ifstream(fn)), local_is(true),
529 528
        _filename(fn), _digraph(digraph),
530 529
        _use_nodes(false), _use_arcs(false),
531 530
        _skip_nodes(false), _skip_arcs(false) {
532 531
      if (!(*_is)) {
533 532
        delete _is;
... ...
@@ -557,19 +556,19 @@
557 556
      }
558 557

	
559 558
    }
560 559

	
561 560
  private:
562 561

	
563
    template <typename DGR>
564
    friend DigraphReader<DGR> digraphReader(DGR& digraph, std::istream& is);
565
    template <typename DGR>
566
    friend DigraphReader<DGR> digraphReader(DGR& digraph, 
567
                                            const std::string& fn);
568
    template <typename DGR>
569
    friend DigraphReader<DGR> digraphReader(DGR& digraph, const char *fn);
562
    template <typename TDGR>
563
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is);
564
    template <typename TDGR>
565
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, 
566
                                             const std::string& fn);
567
    template <typename TDGR>
568
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, const char *fn);
570 569

	
571 570
    DigraphReader(DigraphReader& other)
572 571
      : _is(other._is), local_is(other.local_is), _digraph(other._digraph),
573 572
        _use_nodes(other._use_nodes), _use_arcs(other._use_arcs),
574 573
        _skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) {
575 574

	
... ...
@@ -1185,54 +1184,81 @@
1185 1184

	
1186 1185
    }
1187 1186

	
1188 1187
    /// @}
1189 1188

	
1190 1189
  };
1190
  
1191
  /// \ingroup lemon_io
1192
  ///
1193
  /// \brief Return a \ref DigraphReader class
1194
  ///
1195
  /// This function just returns a \ref DigraphReader class.
1196
  ///
1197
  /// With this function a digraph can be read from an 
1198
  /// \ref lgf-format "LGF" file or input stream with several maps and
1199
  /// attributes. For example, there is network flow problem on a
1200
  /// digraph, i.e. a digraph with a \e capacity map on the arcs and
1201
  /// \e source and \e target nodes. This digraph can be read with the
1202
  /// following code:
1203
  ///
1204
  ///\code
1205
  ///ListDigraph digraph;
1206
  ///ListDigraph::ArcMap<int> cm(digraph);
1207
  ///ListDigraph::Node src, trg;
1208
  ///digraphReader(digraph, std::cin).
1209
  ///  arcMap("capacity", cap).
1210
  ///  node("source", src).
1211
  ///  node("target", trg).
1212
  ///  run();
1213
  ///\endcode
1214
  ///
1215
  /// For a complete documentation, please see the \ref DigraphReader
1216
  /// class documentation.
1217
  /// \warning Don't forget to put the \ref DigraphReader::run() "run()"
1218
  /// to the end of the parameter list.
1219
  /// \relates DigraphReader
1220
  /// \sa digraphReader(TDGR& digraph, const std::string& fn)
1221
  /// \sa digraphReader(TDGR& digraph, const char* fn)
1222
  template <typename TDGR>
1223
  DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is) {
1224
    DigraphReader<TDGR> tmp(digraph, is);
1225
    return tmp;
1226
  }
1191 1227

	
1192 1228
  /// \brief Return a \ref DigraphReader class
1193 1229
  ///
1194 1230
  /// This function just returns a \ref DigraphReader class.
1195 1231
  /// \relates DigraphReader
1196
  template <typename Digraph>
1197
  DigraphReader<Digraph> digraphReader(Digraph& digraph, std::istream& is) {
1198
    DigraphReader<Digraph> tmp(digraph, is);
1232
  /// \sa digraphReader(TDGR& digraph, std::istream& is)
1233
  template <typename TDGR>
1234
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const std::string& fn) {
1235
    DigraphReader<TDGR> tmp(digraph, fn);
1199 1236
    return tmp;
1200 1237
  }
1201 1238

	
1202 1239
  /// \brief Return a \ref DigraphReader class
1203 1240
  ///
1204 1241
  /// This function just returns a \ref DigraphReader class.
1205 1242
  /// \relates DigraphReader
1206
  template <typename Digraph>
1207
  DigraphReader<Digraph> digraphReader(Digraph& digraph,
1208
                                       const std::string& fn) {
1209
    DigraphReader<Digraph> tmp(digraph, fn);
1243
  /// \sa digraphReader(TDGR& digraph, std::istream& is)
1244
  template <typename TDGR>
1245
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const char* fn) {
1246
    DigraphReader<TDGR> tmp(digraph, fn);
1210 1247
    return tmp;
1211 1248
  }
1212 1249

	
1213
  /// \brief Return a \ref DigraphReader class
1214
  ///
1215
  /// This function just returns a \ref DigraphReader class.
1216
  /// \relates DigraphReader
1217
  template <typename Digraph>
1218
  DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) {
1219
    DigraphReader<Digraph> tmp(digraph, fn);
1220
    return tmp;
1221
  }
1222

	
1223
  template <typename Graph>
1250
  template <typename GR>
1224 1251
  class GraphReader;
1225 1252
 
1226
  template <typename Graph>
1227
  GraphReader<Graph> graphReader(Graph& graph, 
1228
                                 std::istream& is = std::cin);
1229
  template <typename Graph>
1230
  GraphReader<Graph> graphReader(Graph& graph, const std::string& fn);
1231
  template <typename Graph>
1232
  GraphReader<Graph> graphReader(Graph& graph, const char *fn);
1253
  template <typename TGR>
1254
  GraphReader<TGR> graphReader(TGR& graph, std::istream& is = std::cin);
1255
  template <typename TGR>
1256
  GraphReader<TGR> graphReader(TGR& graph, const std::string& fn);
1257
  template <typename TGR>
1258
  GraphReader<TGR> graphReader(TGR& graph, const char *fn);
1233 1259

	
1234 1260
  /// \ingroup lemon_io
1235 1261
  ///
1236 1262
  /// \brief \ref lgf-format "LGF" reader for undirected graphs
1237 1263
  ///
1238 1264
  /// This utility reads an \ref lgf-format "LGF" file.
... ...
@@ -1251,19 +1277,19 @@
1251 1277
  public:
1252 1278

	
1253 1279
    typedef GR Graph;
1254 1280

	
1255 1281
  private:
1256 1282

	
1257
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
1283
    TEMPLATE_GRAPH_TYPEDEFS(GR);
1258 1284

	
1259 1285
    std::istream* _is;
1260 1286
    bool local_is;
1261 1287
    std::string _filename;
1262 1288

	
1263
    Graph& _graph;
1289
    GR& _graph;
1264 1290

	
1265 1291
    std::string _nodes_caption;
1266 1292
    std::string _edges_caption;
1267 1293
    std::string _attributes_caption;
1268 1294

	
1269 1295
    typedef std::map<std::string, Node> NodeIndex;
... ...
@@ -1295,22 +1321,22 @@
1295 1321
  public:
1296 1322

	
1297 1323
    /// \brief Constructor
1298 1324
    ///
1299 1325
    /// Construct an undirected graph reader, which reads from the given
1300 1326
    /// input stream.
1301
    GraphReader(Graph& graph, std::istream& is = std::cin)
1327
    GraphReader(GR& graph, std::istream& is = std::cin)
1302 1328
      : _is(&is), local_is(false), _graph(graph),
1303 1329
        _use_nodes(false), _use_edges(false),
1304 1330
        _skip_nodes(false), _skip_edges(false) {}
1305 1331

	
1306 1332
    /// \brief Constructor
1307 1333
    ///
1308 1334
    /// Construct an undirected graph reader, which reads from the given
1309 1335
    /// file.
1310
    GraphReader(Graph& graph, const std::string& fn)
1336
    GraphReader(GR& graph, const std::string& fn)
1311 1337
      : _is(new std::ifstream(fn.c_str())), local_is(true),
1312 1338
        _filename(fn), _graph(graph),
1313 1339
        _use_nodes(false), _use_edges(false),
1314 1340
        _skip_nodes(false), _skip_edges(false) {
1315 1341
      if (!(*_is)) {
1316 1342
        delete _is;
... ...
@@ -1319,13 +1345,13 @@
1319 1345
    }
1320 1346

	
1321 1347
    /// \brief Constructor
1322 1348
    ///
1323 1349
    /// Construct an undirected graph reader, which reads from the given
1324 1350
    /// file.
1325
    GraphReader(Graph& graph, const char* fn)
1351
    GraphReader(GR& graph, const char* fn)
1326 1352
      : _is(new std::ifstream(fn)), local_is(true),
1327 1353
        _filename(fn), _graph(graph),
1328 1354
        _use_nodes(false), _use_edges(false),
1329 1355
        _skip_nodes(false), _skip_edges(false) {
1330 1356
      if (!(*_is)) {
1331 1357
        delete _is;
... ...
@@ -1354,18 +1380,18 @@
1354 1380
        delete _is;
1355 1381
      }
1356 1382

	
1357 1383
    }
1358 1384

	
1359 1385
  private:
1360
    template <typename Graph>
1361
    friend GraphReader<Graph> graphReader(Graph& graph, std::istream& is);
1362
    template <typename Graph>
1363
    friend GraphReader<Graph> graphReader(Graph& graph, const std::string& fn); 
1364
    template <typename Graph>
1365
    friend GraphReader<Graph> graphReader(Graph& graph, const char *fn);
1386
    template <typename TGR>
1387
    friend GraphReader<TGR> graphReader(TGR& graph, std::istream& is);
1388
    template <typename TGR>
1389
    friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn); 
1390
    template <typename TGR>
1391
    friend GraphReader<TGR> graphReader(TGR& graph, const char *fn);
1366 1392

	
1367 1393
    GraphReader(GraphReader& other)
1368 1394
      : _is(other._is), local_is(other.local_is), _graph(other._graph),
1369 1395
        _use_nodes(other._use_nodes), _use_edges(other._use_edges),
1370 1396
        _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
1371 1397

	
... ...
@@ -1451,13 +1477,13 @@
1451 1477
    GraphReader& arcMap(const std::string& caption, Map& map) {
1452 1478
      checkConcept<concepts::WriteMap<Arc, typename Map::Value>, Map>();
1453 1479
      _reader_bits::MapStorageBase<Edge>* forward_storage =
1454 1480
        new _reader_bits::GraphArcMapStorage<Graph, true, Map>(_graph, map);
1455 1481
      _edge_maps.push_back(std::make_pair('+' + caption, forward_storage));
1456 1482
      _reader_bits::MapStorageBase<Edge>* backward_storage =
1457
        new _reader_bits::GraphArcMapStorage<Graph, false, Map>(_graph, map);
1483
        new _reader_bits::GraphArcMapStorage<GR, false, Map>(_graph, map);
1458 1484
      _edge_maps.push_back(std::make_pair('-' + caption, backward_storage));
1459 1485
      return *this;
1460 1486
    }
1461 1487

	
1462 1488
    /// \brief Arc map reading rule
1463 1489
    ///
... ...
@@ -1465,17 +1491,17 @@
1465 1491
    /// reader.
1466 1492
    template <typename Map, typename Converter>
1467 1493
    GraphReader& arcMap(const std::string& caption, Map& map,
1468 1494
                          const Converter& converter = Converter()) {
1469 1495
      checkConcept<concepts::WriteMap<Arc, typename Map::Value>, Map>();
1470 1496
      _reader_bits::MapStorageBase<Edge>* forward_storage =
1471
        new _reader_bits::GraphArcMapStorage<Graph, true, Map, Converter>
1497
        new _reader_bits::GraphArcMapStorage<GR, true, Map, Converter>
1472 1498
        (_graph, map, converter);
1473 1499
      _edge_maps.push_back(std::make_pair('+' + caption, forward_storage));
1474 1500
      _reader_bits::MapStorageBase<Edge>* backward_storage =
1475
        new _reader_bits::GraphArcMapStorage<Graph, false, Map, Converter>
1501
        new _reader_bits::GraphArcMapStorage<GR, false, Map, Converter>
1476 1502
        (_graph, map, converter);
1477 1503
      _edge_maps.push_back(std::make_pair('-' + caption, backward_storage));
1478 1504
      return *this;
1479 1505
    }
1480 1506

	
1481 1507
    /// \brief Attribute reading rule
... ...
@@ -1527,13 +1553,13 @@
1527 1553
    }
1528 1554

	
1529 1555
    /// \brief Arc reading rule
1530 1556
    ///
1531 1557
    /// Add an arc reading rule to reader.
1532 1558
    GraphReader& arc(const std::string& caption, Arc& arc) {
1533
      typedef _reader_bits::GraphArcLookUpConverter<Graph> Converter;
1559
      typedef _reader_bits::GraphArcLookUpConverter<GR> Converter;
1534 1560
      Converter converter(_graph, _edge_index);
1535 1561
      _reader_bits::ValueStorageBase* storage =
1536 1562
        new _reader_bits::ValueStorage<Arc, Converter>(arc, converter);
1537 1563
      _attributes.insert(std::make_pair(caption, storage));
1538 1564
      return *this;
1539 1565
    }
... ...
@@ -2030,39 +2056,64 @@
2030 2056
    }
2031 2057

	
2032 2058
    /// @}
2033 2059

	
2034 2060
  };
2035 2061

	
2062
  /// \ingroup lemon_io
2063
  ///
2064
  /// \brief Return a \ref GraphReader class
2065
  ///
2066
  /// This function just returns a \ref GraphReader class. 
2067
  ///
2068
  /// With this function a graph can be read from an 
2069
  /// \ref lgf-format "LGF" file or input stream with several maps and
2070
  /// attributes. For example, there is weighted matching problem on a
2071
  /// graph, i.e. a graph with a \e weight map on the edges. This
2072
  /// graph can be read with the following code:
2073
  ///
2074
  ///\code
2075
  ///ListGraph graph;
2076
  ///ListGraph::EdgeMap<int> weight(graph);
2077
  ///graphReader(graph, std::cin).
2078
  ///  edgeMap("weight", weight).
2079
  ///  run();
2080
  ///\endcode
2081
  ///
2082
  /// For a complete documentation, please see the \ref GraphReader
2083
  /// class documentation.
2084
  /// \warning Don't forget to put the \ref GraphReader::run() "run()"
2085
  /// to the end of the parameter list.
2086
  /// \relates GraphReader
2087
  /// \sa graphReader(TGR& graph, const std::string& fn)
2088
  /// \sa graphReader(TGR& graph, const char* fn)
2089
  template <typename TGR>
2090
  GraphReader<TGR> graphReader(TGR& graph, std::istream& is) {
2091
    GraphReader<TGR> tmp(graph, is);
2092
    return tmp;
2093
  }
2094

	
2036 2095
  /// \brief Return a \ref GraphReader class
2037 2096
  ///
2038 2097
  /// This function just returns a \ref GraphReader class.
2039 2098
  /// \relates GraphReader
2040
  template <typename Graph>
2041
  GraphReader<Graph> graphReader(Graph& graph, std::istream& is) {
2042
    GraphReader<Graph> tmp(graph, is);
2099
  /// \sa graphReader(TGR& graph, std::istream& is)
2100
  template <typename TGR>
2101
  GraphReader<TGR> graphReader(TGR& graph, const std::string& fn) {
2102
    GraphReader<TGR> tmp(graph, fn);
2043 2103
    return tmp;
2044 2104
  }
2045 2105

	
2046 2106
  /// \brief Return a \ref GraphReader class
2047 2107
  ///
2048 2108
  /// This function just returns a \ref GraphReader class.
2049 2109
  /// \relates GraphReader
2050
  template <typename Graph>
2051
  GraphReader<Graph> graphReader(Graph& graph, const std::string& fn) {
2052
    GraphReader<Graph> tmp(graph, fn);
2053
    return tmp;
2054
  }
2055

	
2056
  /// \brief Return a \ref GraphReader class
2057
  ///
2058
  /// This function just returns a \ref GraphReader class.
2059
  /// \relates GraphReader
2060
  template <typename Graph>
2061
  GraphReader<Graph> graphReader(Graph& graph, const char* fn) {
2062
    GraphReader<Graph> tmp(graph, fn);
2110
  /// \sa graphReader(TGR& graph, std::istream& is)
2111
  template <typename TGR>
2112
  GraphReader<TGR> graphReader(TGR& graph, const char* fn) {
2113
    GraphReader<TGR> tmp(graph, fn);
2063 2114
    return tmp;
2064 2115
  }
2065 2116

	
2066 2117
  class SectionReader;
2067 2118

	
2068 2119
  SectionReader sectionReader(std::istream& is);
... ...
@@ -2313,34 +2364,44 @@
2313 2364
    }
2314 2365

	
2315 2366
    /// @}
2316 2367

	
2317 2368
  };
2318 2369

	
2370
  /// \ingroup lemon_io
2371
  ///
2372
  /// \brief Return a \ref SectionReader class
2373
  ///
2374
  /// This function just returns a \ref SectionReader class.
2375
  ///
2376
  /// Please see SectionReader documentation about the custom section
2377
  /// input.
2378
  ///
2379
  /// \relates SectionReader
2380
  /// \sa sectionReader(const std::string& fn)
2381
  /// \sa sectionReader(const char *fn)
2382
  inline SectionReader sectionReader(std::istream& is) {
2383
    SectionReader tmp(is);
2384
    return tmp;
2385
  }
2386

	
2319 2387
  /// \brief Return a \ref SectionReader class
2320 2388
  ///
2321 2389
  /// This function just returns a \ref SectionReader class.
2322 2390
  /// \relates SectionReader
2323
  inline SectionReader sectionReader(std::istream& is) {
2324
    SectionReader tmp(is);
2391
  /// \sa sectionReader(std::istream& is)
2392
  inline SectionReader sectionReader(const std::string& fn) {
2393
    SectionReader tmp(fn);
2325 2394
    return tmp;
2326 2395
  }
2327 2396

	
2328 2397
  /// \brief Return a \ref SectionReader class
2329 2398
  ///
2330 2399
  /// This function just returns a \ref SectionReader class.
2331 2400
  /// \relates SectionReader
2332
  inline SectionReader sectionReader(const std::string& fn) {
2333
    SectionReader tmp(fn);
2334
    return tmp;
2335
  }
2336

	
2337
  /// \brief Return a \ref SectionReader class
2338
  ///
2339
  /// This function just returns a \ref SectionReader class.
2340
  /// \relates SectionReader
2401
  /// \sa sectionReader(std::istream& is)
2341 2402
  inline SectionReader sectionReader(const char* fn) {
2342 2403
    SectionReader tmp(fn);
2343 2404
    return tmp;
2344 2405
  }
2345 2406

	
2346 2407
  /// \ingroup lemon_io
Ignore white space 12 line context
... ...
@@ -344,25 +344,23 @@
344 344
        _functor(os);
345 345
      }
346 346
    };
347 347

	
348 348
  }
349 349

	
350
  template <typename Digraph>
350
  template <typename DGR>
351 351
  class DigraphWriter;
352 352

	
353
  template <typename Digraph>
354
  DigraphWriter<Digraph> digraphWriter(const Digraph& digraph,
355
                                       std::ostream& os = std::cout);
356
  template <typename Digraph>
357
  DigraphWriter<Digraph> digraphWriter(const Digraph& digraph,
358
                                       const std::string& fn);
353
  template <typename TDGR>
354
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
355
                                   std::ostream& os = std::cout);
356
  template <typename TDGR>
357
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const std::string& fn);
359 358

	
360
  template <typename Digraph>
361
  DigraphWriter<Digraph> digraphWriter(const Digraph& digraph,
362
                                       const char* fn);
359
  template <typename TDGR>
360
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const char* fn);
363 361

	
364 362

	
365 363
  /// \ingroup lemon_io
366 364
  ///
367 365
  /// \brief \ref lgf-format "LGF" writer for directed graphs
368 366
  ///
... ...
@@ -378,13 +376,13 @@
378 376
  /// is set, it will determine how the value type of the map is written to
379 377
  /// the output stream. If the functor is not set, then a default
380 378
  /// conversion will be used. The \c attribute(), \c node() and \c
381 379
  /// arc() functions are used to add attribute writing rules.
382 380
  ///
383 381
  ///\code
384
  /// DigraphWriter<Digraph>(digraph, std::cout).
382
  /// DigraphWriter<DGR>(digraph, std::cout).
385 383
  ///   nodeMap("coordinates", coord_map).
386 384
  ///   nodeMap("size", size).
387 385
  ///   nodeMap("title", title).
388 386
  ///   arcMap("capacity", cap_map).
389 387
  ///   node("source", src).
390 388
  ///   node("target", trg).
... ...
@@ -403,26 +401,26 @@
403 401
  /// to the output, it can be done in two passes, the first pass
404 402
  /// writes the node section and the first arc section, then the
405 403
  /// second pass skips the node section and writes just the arc
406 404
  /// section to the stream. The output stream can be retrieved with
407 405
  /// the \c ostream() function, hence the second pass can append its
408 406
  /// output to the output of the first pass.
409
  template <typename GR>
407
  template <typename DGR>
410 408
  class DigraphWriter {
411 409
  public:
412 410

	
413
    typedef GR Digraph;
414
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
411
    typedef DGR Digraph;
412
    TEMPLATE_DIGRAPH_TYPEDEFS(DGR);
415 413

	
416 414
  private:
417 415

	
418 416

	
419 417
    std::ostream* _os;
420 418
    bool local_os;
421 419

	
422
    const Digraph& _digraph;
420
    const DGR& _digraph;
423 421

	
424 422
    std::string _nodes_caption;
425 423
    std::string _arcs_caption;
426 424
    std::string _attributes_caption;
427 425

	
428 426
    typedef std::map<Node, std::string> NodeIndex;
... ...
@@ -448,34 +446,34 @@
448 446
  public:
449 447

	
450 448
    /// \brief Constructor
451 449
    ///
452 450
    /// Construct a directed graph writer, which writes to the given
453 451
    /// output stream.
454
    DigraphWriter(const Digraph& digraph, std::ostream& os = std::cout)
452
    DigraphWriter(const DGR& digraph, std::ostream& os = std::cout)
455 453
      : _os(&os), local_os(false), _digraph(digraph),
456 454
        _skip_nodes(false), _skip_arcs(false) {}
457 455

	
458 456
    /// \brief Constructor
459 457
    ///
460 458
    /// Construct a directed graph writer, which writes to the given
461 459
    /// output file.
462
    DigraphWriter(const Digraph& digraph, const std::string& fn)
460
    DigraphWriter(const DGR& digraph, const std::string& fn)
463 461
      : _os(new std::ofstream(fn.c_str())), local_os(true), _digraph(digraph),
464 462
        _skip_nodes(false), _skip_arcs(false) {
465 463
      if (!(*_os)) {
466 464
        delete _os;
467 465
        throw IoError("Cannot write file", fn);
468 466
      }
469 467
    }
470 468

	
471 469
    /// \brief Constructor
472 470
    ///
473 471
    /// Construct a directed graph writer, which writes to the given
474 472
    /// output file.
475
    DigraphWriter(const Digraph& digraph, const char* fn)
473
    DigraphWriter(const DGR& digraph, const char* fn)
476 474
      : _os(new std::ofstream(fn)), local_os(true), _digraph(digraph),
477 475
        _skip_nodes(false), _skip_arcs(false) {
478 476
      if (!(*_os)) {
479 477
        delete _os;
480 478
        throw IoError("Cannot write file", fn);
481 479
      }
... ...
@@ -502,21 +500,21 @@
502 500
        delete _os;
503 501
      }
504 502
    }
505 503

	
506 504
  private:
507 505

	
508
    template <typename DGR>
509
    friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, 
510
                                            std::ostream& os);
511
    template <typename DGR>
512
    friend DigraphWriter<DGR> digraphWriter(const DGR& digraph,
513
                                            const std::string& fn);
514
    template <typename DGR>
515
    friend DigraphWriter<DGR> digraphWriter(const DGR& digraph,
516
                                            const char *fn);
506
    template <typename TDGR>
507
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
508
                                             std::ostream& os);
509
    template <typename TDGR>
510
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
511
                                             const std::string& fn);
512
    template <typename TDGR>
513
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
514
                                             const char *fn);
517 515

	
518 516
    DigraphWriter(DigraphWriter& other)
519 517
      : _os(other._os), local_os(other.local_os), _digraph(other._digraph),
520 518
        _skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) {
521 519

	
522 520
      other._os = 0;
... ...
@@ -721,14 +719,14 @@
721 719
      std::vector<Node> nodes;
722 720
      for (NodeIt n(_digraph); n != INVALID; ++n) {
723 721
        nodes.push_back(n);
724 722
      }
725 723

	
726 724
      if (label == 0) {
727
        IdMap<Digraph, Node> id_map(_digraph);
728
        _writer_bits::MapLess<IdMap<Digraph, Node> > id_less(id_map);
725
        IdMap<DGR, Node> id_map(_digraph);
726
        _writer_bits::MapLess<IdMap<DGR, Node> > id_less(id_map);
729 727
        std::sort(nodes.begin(), nodes.end(), id_less);
730 728
      } else {
731 729
        label->sort(nodes);
732 730
      }
733 731

	
734 732
      for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
... ...
@@ -806,14 +804,14 @@
806 804
      std::vector<Arc> arcs;
807 805
      for (ArcIt n(_digraph); n != INVALID; ++n) {
808 806
        arcs.push_back(n);
809 807
      }
810 808

	
811 809
      if (label == 0) {
812
        IdMap<Digraph, Arc> id_map(_digraph);
813
        _writer_bits::MapLess<IdMap<Digraph, Arc> > id_less(id_map);
810
        IdMap<DGR, Arc> id_map(_digraph);
811
        _writer_bits::MapLess<IdMap<DGR, Arc> > id_less(id_map);
814 812
        std::sort(arcs.begin(), arcs.end(), id_less);
815 813
      } else {
816 814
        label->sort(arcs);
817 815
      }
818 816

	
819 817
      for (int i = 0; i < static_cast<int>(arcs.size()); ++i) {
... ...
@@ -912,55 +910,82 @@
912 910
      return *_os;
913 911
    }
914 912

	
915 913
    /// @}
916 914
  };
917 915

	
916
  /// \ingroup lemon_io
917
  ///
918 918
  /// \brief Return a \ref DigraphWriter class
919 919
  ///
920
  /// This function just returns a \ref DigraphWriter class.
920
  /// This function just returns a \ref DigraphWriter class. 
921
  ///
922
  /// With this function a digraph can be write to a file or output
923
  /// stream in \ref lgf-format "LGF" format with several maps and
924
  /// attributes. For example, with the following code a network flow
925
  /// problem can be written to the standard output, i.e. a digraph
926
  /// with a \e capacity map on the arcs and \e source and \e target
927
  /// nodes:
928
  ///
929
  ///\code
930
  ///ListDigraph digraph;
931
  ///ListDigraph::ArcMap<int> cap(digraph);
932
  ///ListDigraph::Node src, trg;
933
  ///  // Setting the capacity map and source and target nodes
934
  ///digraphWriter(digraph, std::cout).
935
  ///  arcMap("capacity", cap).
936
  ///  node("source", src).
937
  ///  node("target", trg).
938
  ///  run();
939
  ///\endcode
940
  ///
941
  /// For a complete documentation, please see the \ref DigraphWriter
942
  /// class documentation.
943
  /// \warning Don't forget to put the \ref DigraphWriter::run() "run()"
944
  /// to the end of the parameter list.
921 945
  /// \relates DigraphWriter
922
  template <typename Digraph>
923
  DigraphWriter<Digraph> digraphWriter(const Digraph& digraph,
924
                                       std::ostream& os) {
925
    DigraphWriter<Digraph> tmp(digraph, os);
946
  /// \sa digraphWriter(const TDGR& digraph, const std::string& fn)
947
  /// \sa digraphWriter(const TDGR& digraph, const char* fn)
948
  template <typename TDGR>
949
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, std::ostream& os) {
950
    DigraphWriter<TDGR> tmp(digraph, os);
926 951
    return tmp;
927 952
  }
928 953

	
929 954
  /// \brief Return a \ref DigraphWriter class
930 955
  ///
931 956
  /// This function just returns a \ref DigraphWriter class.
932 957
  /// \relates DigraphWriter
933
  template <typename Digraph>
934
  DigraphWriter<Digraph> digraphWriter(const Digraph& digraph,
935
                                       const std::string& fn) {
936
    DigraphWriter<Digraph> tmp(digraph, fn);
958
  /// \sa digraphWriter(const TDGR& digraph, std::ostream& os)
959
  template <typename TDGR>
960
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
961
                                    const std::string& fn) {
962
    DigraphWriter<TDGR> tmp(digraph, fn);
937 963
    return tmp;
938 964
  }
939 965

	
940 966
  /// \brief Return a \ref DigraphWriter class
941 967
  ///
942 968
  /// This function just returns a \ref DigraphWriter class.
943 969
  /// \relates DigraphWriter
944
  template <typename Digraph>
945
  DigraphWriter<Digraph> digraphWriter(const Digraph& digraph,
946
                                       const char* fn) {
947
    DigraphWriter<Digraph> tmp(digraph, fn);
970
  /// \sa digraphWriter(const TDGR& digraph, std::ostream& os)
971
  template <typename TDGR>
972
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const char* fn) {
973
    DigraphWriter<TDGR> tmp(digraph, fn);
948 974
    return tmp;
949 975
  }
950 976

	
951
  template <typename Graph>
977
  template <typename GR>
952 978
  class GraphWriter;
953 979

	
954
  template <typename Graph>
955
  GraphWriter<Graph> graphWriter(const Graph& graph,
956
                                 std::ostream& os = std::cout);
957
  template <typename Graph>
958
  GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn);
959
  template <typename Graph>
960
  GraphWriter<Graph> graphWriter(const Graph& graph, const char* fn);
980
  template <typename TGR>
981
  GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os = std::cout);
982
  template <typename TGR>
983
  GraphWriter<TGR> graphWriter(const TGR& graph, const std::string& fn);
984
  template <typename TGR>
985
  GraphWriter<TGR> graphWriter(const TGR& graph, const char* fn);
961 986

	
962 987
  /// \ingroup lemon_io
963 988
  ///
964 989
  /// \brief \ref lgf-format "LGF" writer for directed graphs
965 990
  ///
966 991
  /// This utility writes an \ref lgf-format "LGF" file.
... ...
@@ -976,21 +1001,21 @@
976 1001
  /// of the arc) and the label of corresponding edge.
977 1002
  template <typename GR>
978 1003
  class GraphWriter {
979 1004
  public:
980 1005

	
981 1006
    typedef GR Graph;
982
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
1007
    TEMPLATE_GRAPH_TYPEDEFS(GR);
983 1008

	
984 1009
  private:
985 1010

	
986 1011

	
987 1012
    std::ostream* _os;
988 1013
    bool local_os;
989 1014

	
990
    const Graph& _graph;
1015
    const GR& _graph;
991 1016

	
992 1017
    std::string _nodes_caption;
993 1018
    std::string _edges_caption;
994 1019
    std::string _attributes_caption;
995 1020

	
996 1021
    typedef std::map<Node, std::string> NodeIndex;
... ...
@@ -1016,34 +1041,34 @@
1016 1041
  public:
1017 1042

	
1018 1043
    /// \brief Constructor
1019 1044
    ///
1020 1045
    /// Construct a directed graph writer, which writes to the given
1021 1046
    /// output stream.
1022
    GraphWriter(const Graph& graph, std::ostream& os = std::cout)
1047
    GraphWriter(const GR& graph, std::ostream& os = std::cout)
1023 1048
      : _os(&os), local_os(false), _graph(graph),
1024 1049
        _skip_nodes(false), _skip_edges(false) {}
1025 1050

	
1026 1051
    /// \brief Constructor
1027 1052
    ///
1028 1053
    /// Construct a directed graph writer, which writes to the given
1029 1054
    /// output file.
1030
    GraphWriter(const Graph& graph, const std::string& fn)
1055
    GraphWriter(const GR& graph, const std::string& fn)
1031 1056
      : _os(new std::ofstream(fn.c_str())), local_os(true), _graph(graph),
1032 1057
        _skip_nodes(false), _skip_edges(false) {
1033 1058
      if (!(*_os)) {
1034 1059
        delete _os;
1035 1060
        throw IoError("Cannot write file", fn);
1036 1061
      }
1037 1062
    }
1038 1063

	
1039 1064
    /// \brief Constructor
1040 1065
    ///
1041 1066
    /// Construct a directed graph writer, which writes to the given
1042 1067
    /// output file.
1043
    GraphWriter(const Graph& graph, const char* fn)
1068
    GraphWriter(const GR& graph, const char* fn)
1044 1069
      : _os(new std::ofstream(fn)), local_os(true), _graph(graph),
1045 1070
        _skip_nodes(false), _skip_edges(false) {
1046 1071
      if (!(*_os)) {
1047 1072
        delete _os;
1048 1073
        throw IoError("Cannot write file", fn);
1049 1074
      }
... ...
@@ -1070,21 +1095,19 @@
1070 1095
        delete _os;
1071 1096
      }
1072 1097
    }
1073 1098

	
1074 1099
  private:
1075 1100

	
1076
    template <typename Graph>
1077
    friend GraphWriter<Graph> graphWriter(const Graph& graph,
1078
                                          std::ostream& os);
1079
    template <typename Graph>
1080
    friend GraphWriter<Graph> graphWriter(const Graph& graph,
1081
                                          const std::string& fn);
1082
    template <typename Graph>
1083
    friend GraphWriter<Graph> graphWriter(const Graph& graph,
1084
                                          const char *fn);
1101
    template <typename TGR>
1102
    friend GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os);
1103
    template <typename TGR>
1104
    friend GraphWriter<TGR> graphWriter(const TGR& graph, 
1105
                                        const std::string& fn);
1106
    template <typename TGR>
1107
    friend GraphWriter<TGR> graphWriter(const TGR& graph, const char *fn);
1085 1108
    
1086 1109
    GraphWriter(GraphWriter& other)
1087 1110
      : _os(other._os), local_os(other.local_os), _graph(other._graph),
1088 1111
        _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
1089 1112

	
1090 1113
      other._os = 0;
... ...
@@ -1165,16 +1188,16 @@
1165 1188
    ///
1166 1189
    /// Add an arc map writing rule to the writer.
1167 1190
    template <typename Map>
1168 1191
    GraphWriter& arcMap(const std::string& caption, const Map& map) {
1169 1192
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
1170 1193
      _writer_bits::MapStorageBase<Edge>* forward_storage =
1171
        new _writer_bits::GraphArcMapStorage<Graph, true, Map>(_graph, map);
1194
        new _writer_bits::GraphArcMapStorage<GR, true, Map>(_graph, map);
1172 1195
      _edge_maps.push_back(std::make_pair('+' + caption, forward_storage));
1173 1196
      _writer_bits::MapStorageBase<Edge>* backward_storage =
1174
        new _writer_bits::GraphArcMapStorage<Graph, false, Map>(_graph, map);
1197
        new _writer_bits::GraphArcMapStorage<GR, false, Map>(_graph, map);
1175 1198
      _edge_maps.push_back(std::make_pair('-' + caption, backward_storage));
1176 1199
      return *this;
1177 1200
    }
1178 1201

	
1179 1202
    /// \brief Arc map writing rule
1180 1203
    ///
... ...
@@ -1182,17 +1205,17 @@
1182 1205
    /// writer.
1183 1206
    template <typename Map, typename Converter>
1184 1207
    GraphWriter& arcMap(const std::string& caption, const Map& map,
1185 1208
                          const Converter& converter = Converter()) {
1186 1209
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
1187 1210
      _writer_bits::MapStorageBase<Edge>* forward_storage =
1188
        new _writer_bits::GraphArcMapStorage<Graph, true, Map, Converter>
1211
        new _writer_bits::GraphArcMapStorage<GR, true, Map, Converter>
1189 1212
        (_graph, map, converter);
1190 1213
      _edge_maps.push_back(std::make_pair('+' + caption, forward_storage));
1191 1214
      _writer_bits::MapStorageBase<Edge>* backward_storage =
1192
        new _writer_bits::GraphArcMapStorage<Graph, false, Map, Converter>
1215
        new _writer_bits::GraphArcMapStorage<GR, false, Map, Converter>
1193 1216
        (_graph, map, converter);
1194 1217
      _edge_maps.push_back(std::make_pair('-' + caption, backward_storage));
1195 1218
      return *this;
1196 1219
    }
1197 1220

	
1198 1221
    /// \brief Attribute writing rule
... ...
@@ -1244,13 +1267,13 @@
1244 1267
    }
1245 1268

	
1246 1269
    /// \brief Arc writing rule
1247 1270
    ///
1248 1271
    /// Add an arc writing rule to writer.
1249 1272
    GraphWriter& arc(const std::string& caption, const Arc& arc) {
1250
      typedef _writer_bits::GraphArcLookUpConverter<Graph> Converter;
1273
      typedef _writer_bits::GraphArcLookUpConverter<GR> Converter;
1251 1274
      Converter converter(_graph, _edge_index);
1252 1275
      _writer_bits::ValueStorageBase* storage =
1253 1276
        new _writer_bits::ValueStorage<Arc, Converter>(arc, converter);
1254 1277
      _attributes.push_back(std::make_pair(caption, storage));
1255 1278
      return *this;
1256 1279
    }
... ...
@@ -1335,14 +1358,14 @@
1335 1358
      std::vector<Node> nodes;
1336 1359
      for (NodeIt n(_graph); n != INVALID; ++n) {
1337 1360
        nodes.push_back(n);
1338 1361
      }
1339 1362

	
1340 1363
      if (label == 0) {
1341
        IdMap<Graph, Node> id_map(_graph);
1342
        _writer_bits::MapLess<IdMap<Graph, Node> > id_less(id_map);
1364
        IdMap<GR, Node> id_map(_graph);
1365
        _writer_bits::MapLess<IdMap<GR, Node> > id_less(id_map);
1343 1366
        std::sort(nodes.begin(), nodes.end(), id_less);
1344 1367
      } else {
1345 1368
        label->sort(nodes);
1346 1369
      }
1347 1370

	
1348 1371
      for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
... ...
@@ -1420,14 +1443,14 @@
1420 1443
      std::vector<Edge> edges;
1421 1444
      for (EdgeIt n(_graph); n != INVALID; ++n) {
1422 1445
        edges.push_back(n);
1423 1446
      }
1424 1447

	
1425 1448
      if (label == 0) {
1426
        IdMap<Graph, Edge> id_map(_graph);
1427
        _writer_bits::MapLess<IdMap<Graph, Edge> > id_less(id_map);
1449
        IdMap<GR, Edge> id_map(_graph);
1450
        _writer_bits::MapLess<IdMap<GR, Edge> > id_less(id_map);
1428 1451
        std::sort(edges.begin(), edges.end(), id_less);
1429 1452
      } else {
1430 1453
        label->sort(edges);
1431 1454
      }
1432 1455

	
1433 1456
      for (int i = 0; i < static_cast<int>(edges.size()); ++i) {
... ...
@@ -1526,40 +1549,65 @@
1526 1549
      return *_os;
1527 1550
    }
1528 1551

	
1529 1552
    /// @}
1530 1553
  };
1531 1554

	
1555
  /// \ingroup lemon_io
1556
  ///
1532 1557
  /// \brief Return a \ref GraphWriter class
1533 1558
  ///
1534
  /// This function just returns a \ref GraphWriter class.
1559
  /// This function just returns a \ref GraphWriter class. 
1560
  ///
1561
  /// With this function a graph can be write to a file or output
1562
  /// stream in \ref lgf-format "LGF" format with several maps and
1563
  /// attributes. For example, with the following code a weighted
1564
  /// matching problem can be written to the standard output, i.e. a
1565
  /// graph with a \e weight map on the edges:
1566
  ///
1567
  ///\code
1568
  ///ListGraph graph;
1569
  ///ListGraph::EdgeMap<int> weight(graph);
1570
  ///  // Setting the weight map
1571
  ///graphWriter(graph, std::cout).
1572
  ///  edgeMap("weight", weight).
1573
  ///  run();
1574
  ///\endcode
1575
  ///
1576
  /// For a complete documentation, please see the \ref GraphWriter
1577
  /// class documentation.
1578
  /// \warning Don't forget to put the \ref GraphWriter::run() "run()"
1579
  /// to the end of the parameter list.
1535 1580
  /// \relates GraphWriter
1536
  template <typename Graph>
1537
  GraphWriter<Graph> graphWriter(const Graph& graph,
1538
                                 std::ostream& os) {
1539
    GraphWriter<Graph> tmp(graph, os);
1581
  /// \sa graphWriter(const TGR& graph, const std::string& fn)
1582
  /// \sa graphWriter(const TGR& graph, const char* fn)
1583
  template <typename TGR>
1584
  GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os) {
1585
    GraphWriter<TGR> tmp(graph, os);
1540 1586
    return tmp;
1541 1587
  }
1542 1588

	
1543 1589
  /// \brief Return a \ref GraphWriter class
1544 1590
  ///
1545 1591
  /// This function just returns a \ref GraphWriter class.
1546 1592
  /// \relates GraphWriter
1547
  template <typename Graph>
1548
  GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn) {
1549
    GraphWriter<Graph> tmp(graph, fn);
1593
  /// \sa graphWriter(const TGR& graph, std::ostream& os)
1594
  template <typename TGR>
1595
  GraphWriter<TGR> graphWriter(const TGR& graph, const std::string& fn) {
1596
    GraphWriter<TGR> tmp(graph, fn);
1550 1597
    return tmp;
1551 1598
  }
1552 1599

	
1553 1600
  /// \brief Return a \ref GraphWriter class
1554 1601
  ///
1555 1602
  /// This function just returns a \ref GraphWriter class.
1556 1603
  /// \relates GraphWriter
1557
  template <typename Graph>
1558
  GraphWriter<Graph> graphWriter(const Graph& graph, const char* fn) {
1559
    GraphWriter<Graph> tmp(graph, fn);
1604
  /// \sa graphWriter(const TGR& graph, std::ostream& os)
1605
  template <typename TGR>
1606
  GraphWriter<TGR> graphWriter(const TGR& graph, const char* fn) {
1607
    GraphWriter<TGR> tmp(graph, fn);
1560 1608
    return tmp;
1561 1609
  }
1562 1610

	
1563 1611
  class SectionWriter;
1564 1612

	
1565 1613
  SectionWriter sectionWriter(std::istream& is);
... ...
@@ -1743,34 +1791,44 @@
1743 1791
    }
1744 1792

	
1745 1793
    /// @}
1746 1794

	
1747 1795
  };
1748 1796

	
1797
  /// \ingroup lemon_io
1798
  ///
1749 1799
  /// \brief Return a \ref SectionWriter class
1750 1800
  ///
1751 1801
  /// This function just returns a \ref SectionWriter class.
1802
  ///
1803
  /// Please see SectionWriter documentation about the custom section
1804
  /// output.
1805
  ///
1752 1806
  /// \relates SectionWriter
1807
  /// \sa sectionWriter(const std::string& fn)
1808
  /// \sa sectionWriter(const char *fn)
1753 1809
  inline SectionWriter sectionWriter(std::ostream& os) {
1754 1810
    SectionWriter tmp(os);
1755 1811
    return tmp;
1756 1812
  }
1757 1813

	
1758 1814
  /// \brief Return a \ref SectionWriter class
1759 1815
  ///
1760 1816
  /// This function just returns a \ref SectionWriter class.
1761 1817
  /// \relates SectionWriter
1818
  /// \sa sectionWriter(std::ostream& os)
1762 1819
  inline SectionWriter sectionWriter(const std::string& fn) {
1763 1820
    SectionWriter tmp(fn);
1764 1821
    return tmp;
1765 1822
  }
1766 1823

	
1767 1824
  /// \brief Return a \ref SectionWriter class
1768 1825
  ///
1769 1826
  /// This function just returns a \ref SectionWriter class.
1770 1827
  /// \relates SectionWriter
1828
  /// \sa sectionWriter(std::ostream& os)
1771 1829
  inline SectionWriter sectionWriter(const char* fn) {
1772 1830
    SectionWriter tmp(fn);
1773 1831
    return tmp;
1774 1832
  }
1775 1833
}
1776 1834

	
0 comments (0 inline)