# HG changeset patch
# User Balazs Dezso <deba@inf.elte.hu>
# Date 1240084470 -7200
# Node ID a3402913cffe4d170e27dc6fa0a632da40bcf4f3
# Parent 37216ca5b9c610a335e9dcdb941115003d1f3769
Add more docs to LGF function interface (#109)
diff -r 37216ca5b9c6 -r a3402913cffe lemon/lgf_reader.h
|
a
|
b
|
|
| 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() {} |
| … |
… |
|
| 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; |
| | 178 | const GR& _graph; |
| | 179 | const std::map<std::string, typename GR::Edge>& _map; |
| 180 | 180 | |
| 181 | | GraphArcLookUpConverter(const Graph& graph, |
| | 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"); |
| … |
… |
|
| 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 | /// |
| … |
… |
|
| 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). |
| … |
… |
|
| 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; |
| … |
… |
|
| 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) {} |
| … |
… |
|
| 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), |
| … |
… |
|
| 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), |
| … |
… |
|
| 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), |
| … |
… |
|
| 1188 | 1187 | /// @} |
| 1189 | 1188 | |
| 1190 | 1189 | }; |
| 1191 | | |
| | 1190 | |
| | 1191 | /// \ingroup lemon_io |
| | 1192 | /// |
| 1192 | 1193 | /// \brief Return a \ref DigraphReader class |
| 1193 | 1194 | /// |
| 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. |
| 1195 | 1219 | /// \relates DigraphReader |
| 1196 | | template <typename Digraph> |
| 1197 | | DigraphReader<Digraph> digraphReader(Digraph& digraph, std::istream& is) { |
| 1198 | | DigraphReader<Digraph> tmp(digraph, is); |
| | 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); |
| 1199 | 1225 | return tmp; |
| 1200 | 1226 | } |
| 1201 | 1227 | |
| … |
… |
|
| 1203 | 1229 | /// |
| 1204 | 1230 | /// This function just returns a \ref DigraphReader class. |
| 1205 | 1231 | /// \relates DigraphReader |
| 1206 | | template <typename Digraph> |
| 1207 | | DigraphReader<Digraph> digraphReader(Digraph& digraph, |
| 1208 | | const std::string& fn) { |
| 1209 | | DigraphReader<Digraph> tmp(digraph, fn); |
| | 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); |
| 1210 | 1236 | return tmp; |
| 1211 | 1237 | } |
| 1212 | 1238 | |
| … |
… |
|
| 1214 | 1240 | /// |
| 1215 | 1241 | /// This function just returns a \ref DigraphReader class. |
| 1216 | 1242 | /// \relates DigraphReader |
| 1217 | | template <typename Digraph> |
| 1218 | | DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) { |
| 1219 | | 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); |
| 1220 | 1247 | return tmp; |
| 1221 | 1248 | } |
| 1222 | 1249 | |
| 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 | /// |
| … |
… |
|
| 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; |
| … |
… |
|
| 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) {} |
| … |
… |
|
| 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), |
| … |
… |
|
| 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), |
| … |
… |
|
| 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), |
| … |
… |
|
| 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 | } |
| … |
… |
|
| 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; |
| … |
… |
|
| 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); |
| … |
… |
|
| 2033 | 2059 | |
| 2034 | 2060 | }; |
| 2035 | 2061 | |
| | 2062 | /// \ingroup lemon_io |
| | 2063 | /// |
| 2036 | 2064 | /// \brief Return a \ref GraphReader class |
| 2037 | 2065 | /// |
| 2038 | | /// This function just returns a \ref GraphReader class. |
| | 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. |
| 2039 | 2086 | /// \relates GraphReader |
| 2040 | | template <typename Graph> |
| 2041 | | GraphReader<Graph> graphReader(Graph& graph, std::istream& is) { |
| 2042 | | GraphReader<Graph> tmp(graph, is); |
| | 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); |
| 2043 | 2092 | return tmp; |
| 2044 | 2093 | } |
| 2045 | 2094 | |
| … |
… |
|
| 2047 | 2096 | /// |
| 2048 | 2097 | /// This function just returns a \ref GraphReader class. |
| 2049 | 2098 | /// \relates GraphReader |
| 2050 | | template <typename Graph> |
| 2051 | | GraphReader<Graph> graphReader(Graph& graph, const std::string& fn) { |
| 2052 | | GraphReader<Graph> tmp(graph, fn); |
| | 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); |
| 2053 | 2103 | return tmp; |
| 2054 | 2104 | } |
| 2055 | 2105 | |
| … |
… |
|
| 2057 | 2107 | /// |
| 2058 | 2108 | /// This function just returns a \ref GraphReader class. |
| 2059 | 2109 | /// \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 | |
| … |
… |
|
| 2316 | 2367 | |
| 2317 | 2368 | }; |
| 2318 | 2369 | |
| | 2370 | /// \ingroup lemon_io |
| | 2371 | /// |
| 2319 | 2372 | /// \brief Return a \ref SectionReader class |
| 2320 | 2373 | /// |
| 2321 | 2374 | /// This function just returns a \ref SectionReader class. |
| | 2375 | /// |
| | 2376 | /// Please see SectionReader documentation about the custom section |
| | 2377 | /// input. |
| | 2378 | /// |
| 2322 | 2379 | /// \relates SectionReader |
| | 2380 | /// \sa sectionReader(const std::string& fn) |
| | 2381 | /// \sa sectionReader(const char *fn) |
| 2323 | 2382 | inline SectionReader sectionReader(std::istream& is) { |
| 2324 | 2383 | SectionReader tmp(is); |
| 2325 | 2384 | return tmp; |
| … |
… |
|
| 2329 | 2388 | /// |
| 2330 | 2389 | /// This function just returns a \ref SectionReader class. |
| 2331 | 2390 | /// \relates SectionReader |
| | 2391 | /// \sa sectionReader(std::istream& is) |
| 2332 | 2392 | inline SectionReader sectionReader(const std::string& fn) { |
| 2333 | 2393 | SectionReader tmp(fn); |
| 2334 | 2394 | return tmp; |
| … |
… |
|
| 2338 | 2398 | /// |
| 2339 | 2399 | /// This function just returns a \ref SectionReader class. |
| 2340 | 2400 | /// \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; |
diff -r 37216ca5b9c6 -r a3402913cffe lemon/lgf_writer.h
|
a
|
b
|
|
| 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 |
| … |
… |
|
| 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). |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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; |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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)) { |
| … |
… |
|
| 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)) { |
| … |
… |
|
| 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), |
| … |
… |
|
| 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); |
| … |
… |
|
| 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); |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | /// |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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; |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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)) { |
| … |
… |
|
| 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)) { |
| … |
… |
|
| 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), |
| … |
… |
|
| 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 | } |
| … |
… |
|
| 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; |
| … |
… |
|
| 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); |
| … |
… |
|
| 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); |
| … |
… |
|
| 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); |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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; |
| … |
… |
|
| 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; |
| … |
… |
|
| 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; |