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 4 line context
... ...
@@ -102,21 +102,21 @@
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) {}
... ...
@@ -174,19 +174,19 @@
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()) {
... ...
@@ -388,14 +388,13 @@
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
... ...
@@ -420,5 +419,5 @@
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).
... ...
@@ -449,13 +448,13 @@
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;
... ...
@@ -463,5 +462,5 @@
463 462
    std::string _filename;
464 463

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

	
467 466
    std::string _nodes_caption;
... ...
@@ -501,5 +500,5 @@
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),
... ...
@@ -510,5 +509,5 @@
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),
... ...
@@ -525,5 +524,5 @@
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),
... ...
@@ -561,11 +560,11 @@
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)
... ...
@@ -1189,4 +1188,41 @@
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
... ...
@@ -1194,7 +1230,8 @@
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
  }
... ...
@@ -1204,31 +1241,20 @@
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
... ...
@@ -1255,5 +1281,5 @@
1255 1281
  private:
1256 1282

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

	
1259 1285
    std::istream* _is;
... ...
@@ -1261,5 +1287,5 @@
1261 1287
    std::string _filename;
1262 1288

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

	
1265 1291
    std::string _nodes_caption;
... ...
@@ -1299,5 +1325,5 @@
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),
... ...
@@ -1308,5 +1334,5 @@
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),
... ...
@@ -1323,5 +1349,5 @@
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),
... ...
@@ -1358,10 +1384,10 @@
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)
... ...
@@ -1455,5 +1481,5 @@
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;
... ...
@@ -1469,9 +1495,9 @@
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));
... ...
@@ -1531,5 +1557,5 @@
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 =
... ...
@@ -2034,11 +2060,45 @@
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
  }
... ...
@@ -2048,17 +2108,8 @@
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
  }
... ...
@@ -2317,10 +2368,28 @@
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
  }
... ...
@@ -2330,13 +2399,5 @@
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);
Ignore white space 6 line context
... ...
@@ -348,17 +348,15 @@
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

	
... ...
@@ -382,5 +380,5 @@
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).
... ...
@@ -407,10 +405,10 @@
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:
... ...
@@ -420,5 +418,5 @@
420 418
    bool local_os;
421 419

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

	
424 422
    std::string _nodes_caption;
... ...
@@ -452,5 +450,5 @@
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) {}
... ...
@@ -460,5 +458,5 @@
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) {
... ...
@@ -473,5 +471,5 @@
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) {
... ...
@@ -506,13 +504,13 @@
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)
... ...
@@ -725,6 +723,6 @@
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 {
... ...
@@ -810,6 +808,6 @@
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 {
... ...
@@ -916,12 +914,39 @@
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
  }
... ...
@@ -931,8 +956,9 @@
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
  }
... ...
@@ -942,21 +968,20 @@
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
... ...
@@ -980,5 +1005,5 @@
980 1005

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

	
984 1009
  private:
... ...
@@ -988,5 +1013,5 @@
988 1013
    bool local_os;
989 1014

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

	
992 1017
    std::string _nodes_caption;
... ...
@@ -1020,5 +1045,5 @@
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) {}
... ...
@@ -1028,5 +1053,5 @@
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) {
... ...
@@ -1041,5 +1066,5 @@
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) {
... ...
@@ -1074,13 +1099,11 @@
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)
... ...
@@ -1169,8 +1192,8 @@
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;
... ...
@@ -1186,9 +1209,9 @@
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));
... ...
@@ -1248,5 +1271,5 @@
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 =
... ...
@@ -1339,6 +1362,6 @@
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 {
... ...
@@ -1424,6 +1447,6 @@
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 {
... ...
@@ -1530,12 +1553,35 @@
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
  }
... ...
@@ -1545,7 +1591,8 @@
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
  }
... ...
@@ -1555,7 +1602,8 @@
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
  }
... ...
@@ -1747,8 +1795,16 @@
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);
... ...
@@ -1760,4 +1816,5 @@
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);
... ...
@@ -1769,4 +1826,5 @@
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);
0 comments (0 inline)