Changeset 645:a3402913cffe in lemon for lemon/lgf_writer.h
 Timestamp:
 04/18/09 21:54:30 (10 years ago)
 Branch:
 default
 Phase:
 public
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

lemon/lgf_writer.h
r606 r645 348 348 } 349 349 350 template <typename D igraph>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); 359 360 template <typename Digraph> 361 DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, 362 const char* 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); 358 359 template <typename TDGR> 360 DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const char* fn); 363 361 364 362 … … 382 380 /// 383 381 ///\code 384 /// DigraphWriter<D igraph>(digraph, std::cout).382 /// DigraphWriter<DGR>(digraph, std::cout). 385 383 /// nodeMap("coordinates", coord_map). 386 384 /// nodeMap("size", size). … … 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(D igraph);411 typedef DGR Digraph; 412 TEMPLATE_DIGRAPH_TYPEDEFS(DGR); 415 413 416 414 private: … … 420 418 bool local_os; 421 419 422 const D igraph& _digraph;420 const DGR& _digraph; 423 421 424 422 std::string _nodes_caption; … … 452 450 /// Construct a directed graph writer, which writes to the given 453 451 /// output stream. 454 DigraphWriter(const D igraph& 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 458 /// Construct a directed graph writer, which writes to the given 461 459 /// output file. 462 DigraphWriter(const D igraph& 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 471 /// Construct a directed graph writer, which writes to the given 474 472 /// output file. 475 DigraphWriter(const D igraph& 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 504 private: 507 505 508 template <typename DGR>509 friend DigraphWriter< DGR> digraphWriter(constDGR& digraph,510 std::ostream& os);511 template <typename DGR>512 friend DigraphWriter< DGR> digraphWriter(constDGR& digraph,513 const std::string& fn);514 template <typename DGR>515 friend DigraphWriter< DGR> digraphWriter(constDGR& 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 723 726 724 if (label == 0) { 727 IdMap<D igraph, Node> id_map(_digraph);728 _writer_bits::MapLess<IdMap<D igraph, 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 808 811 809 if (label == 0) { 812 IdMap<D igraph, Arc> id_map(_digraph);813 _writer_bits::MapLess<IdMap<D igraph, 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 914 }; 917 915 916 /// \ingroup lemon_io 917 /// 918 /// \brief Return a \ref DigraphWriter class 919 /// 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 lgfformat "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. 945 /// \relates DigraphWriter 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); 951 return tmp; 952 } 953 918 954 /// \brief Return a \ref DigraphWriter class 919 955 /// 920 956 /// This function just returns a \ref DigraphWriter class. 921 957 /// \relates DigraphWriter 922 template <typename Digraph> 923 DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, 924 std::ostream& os) { 925 DigraphWriter<Digraph> tmp(digraph, os); 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); 926 963 return tmp; 927 964 } … … 931 968 /// This function just returns a \ref DigraphWriter class. 932 969 /// \relates DigraphWriter 933 template <typename Digraph>934 DigraphWriter<Digraph> digraphWriter(const Digraph& digraph,935 const std::string&fn) {936 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); 937 974 return tmp; 938 975 } 939 976 940 /// \brief Return a \ref DigraphWriter class 941 /// 942 /// This function just returns a \ref DigraphWriter class. 943 /// \relates DigraphWriter 944 template <typename Digraph> 945 DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, 946 const char* fn) { 947 DigraphWriter<Digraph> tmp(digraph, fn); 948 return tmp; 949 } 950 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 1005 981 1006 typedef GR Graph; 982 TEMPLATE_GRAPH_TYPEDEFS(G raph);1007 TEMPLATE_GRAPH_TYPEDEFS(GR); 983 1008 984 1009 private: … … 988 1013 bool local_os; 989 1014 990 const G raph& _graph;1015 const GR& _graph; 991 1016 992 1017 std::string _nodes_caption; … … 1020 1045 /// Construct a directed graph writer, which writes to the given 1021 1046 /// output stream. 1022 GraphWriter(const G raph& 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 1053 /// Construct a directed graph writer, which writes to the given 1029 1054 /// output file. 1030 GraphWriter(const G raph& 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 1066 /// Construct a directed graph writer, which writes to the given 1042 1067 /// output file. 1043 GraphWriter(const G raph& 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 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 1192 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); 1170 1193 _writer_bits::MapStorageBase<Edge>* forward_storage = 1171 new _writer_bits::GraphArcMapStorage<G raph, 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<G raph, 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 1209 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); 1187 1210 _writer_bits::MapStorageBase<Edge>* forward_storage = 1188 new _writer_bits::GraphArcMapStorage<G raph, 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<G raph, 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 1271 /// Add an arc writing rule to writer. 1249 1272 GraphWriter& arc(const std::string& caption, const Arc& arc) { 1250 typedef _writer_bits::GraphArcLookUpConverter<G raph> Converter;1273 typedef _writer_bits::GraphArcLookUpConverter<GR> Converter; 1251 1274 Converter converter(_graph, _edge_index); 1252 1275 _writer_bits::ValueStorageBase* storage = … … 1339 1362 1340 1363 if (label == 0) { 1341 IdMap<G raph, Node> id_map(_graph);1342 _writer_bits::MapLess<IdMap<G raph, 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 1447 1425 1448 if (label == 0) { 1426 IdMap<G raph, Edge> id_map(_graph);1427 _writer_bits::MapLess<IdMap<G raph, 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 1553 }; 1531 1554 1555 /// \ingroup lemon_io 1556 /// 1557 /// \brief Return a \ref GraphWriter class 1558 /// 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 lgfformat "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. 1580 /// \relates GraphWriter 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); 1586 return tmp; 1587 } 1588 1532 1589 /// \brief Return a \ref GraphWriter class 1533 1590 /// 1534 1591 /// This function just returns a \ref GraphWriter class. 1535 1592 /// \relates GraphWriter 1536 template <typename Graph>1537 GraphWriter<Graph> graphWriter(const Graph& graph,1538 std::ostream& os) {1539 GraphWriter< Graph> tmp(graph, os);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); 1540 1597 return tmp; 1541 1598 } … … 1545 1602 /// This function just returns a \ref GraphWriter class. 1546 1603 /// \relates GraphWriter 1547 template <typename Graph> 1548 GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn) { 1549 GraphWriter<Graph> tmp(graph, fn); 1550 return tmp; 1551 } 1552 1553 /// \brief Return a \ref GraphWriter class 1554 /// 1555 /// This function just returns a \ref GraphWriter class. 1556 /// \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 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 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 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);
Note: See TracChangeset
for help on using the changeset viewer.