398 template <typename Digraph> |
398 template <typename Digraph> |
399 DigraphReader<Digraph> digraphReader(const char *fn, Digraph& digraph); |
399 DigraphReader<Digraph> digraphReader(const char *fn, Digraph& digraph); |
400 |
400 |
401 /// \ingroup lemon_io |
401 /// \ingroup lemon_io |
402 /// |
402 /// |
403 /// \brief LGF reader for directed graphs |
403 /// \brief \ref lgf-format "LGF" reader for directed graphs |
404 /// |
404 /// |
405 /// This utility reads an \ref lgf-format "LGF" file. |
405 /// This utility reads an \ref lgf-format "LGF" file. |
406 /// |
406 /// |
407 /// The reading method does a batch processing. The user creates a |
407 /// The reading method does a batch processing. The user creates a |
408 /// reader object, then various reading rules can be added to the |
408 /// reader object, then various reading rules can be added to the |
409 /// reader, and eventually the reading is executed with the \c run() |
409 /// reader, and eventually the reading is executed with the \c run() |
410 /// member function. A map reading rule can be added to the reader |
410 /// member function. A map reading rule can be added to the reader |
411 /// with the \c nodeMap() or \c arcMap() members. An optional |
411 /// with the \c nodeMap() or \c arcMap() members. An optional |
412 /// converter parameter can also be added as a standard functor |
412 /// converter parameter can also be added as a standard functor |
413 /// converting from std::string to the value type of the map. If it |
413 /// converting from \c std::string to the value type of the map. If it |
414 /// is set, it will determine how the tokens in the file should be |
414 /// is set, it will determine how the tokens in the file should be |
415 /// is converted to the map's value type. If the functor is not set, |
415 /// converted to the value type of the map. If the functor is not set, |
416 /// then a default conversion will be used. One map can be read into |
416 /// then a default conversion will be used. One map can be read into |
417 /// multiple map objects at the same time. The \c attribute(), \c |
417 /// multiple map objects at the same time. The \c attribute(), \c |
418 /// node() and \c arc() functions are used to add attribute reading |
418 /// node() and \c arc() functions are used to add attribute reading |
419 /// rules. |
419 /// rules. |
420 /// |
420 /// |
421 ///\code |
421 ///\code |
422 /// DigraphReader<Digraph>(std::cin, digraph). |
422 /// DigraphReader<Digraph>(std::cin, digraph). |
423 /// nodeMap("coordinates", coord_map). |
423 /// nodeMap("coordinates", coord_map). |
424 /// arcMap("capacity", cap_map). |
424 /// arcMap("capacity", cap_map). |
425 /// node("source", src). |
425 /// node("source", src). |
426 /// node("target", trg). |
426 /// node("target", trg). |
427 /// attribute("caption", caption). |
427 /// attribute("caption", caption). |
428 /// run(); |
428 /// run(); |
429 ///\endcode |
429 ///\endcode |
430 /// |
430 /// |
431 /// By default the reader uses the first section in the file of the |
431 /// By default the reader uses the first section in the file of the |
432 /// proper type. If a section has an optional name, then it can be |
432 /// proper type. If a section has an optional name, then it can be |
433 /// selected for reading by giving an optional name parameter to the |
433 /// selected for reading by giving an optional name parameter to the |
435 /// |
435 /// |
436 /// The \c useNodes() and \c useArcs() functions are used to tell the reader |
436 /// The \c useNodes() and \c useArcs() functions are used to tell the reader |
437 /// that the nodes or arcs should not be constructed (added to the |
437 /// that the nodes or arcs should not be constructed (added to the |
438 /// graph) during the reading, but instead the label map of the items |
438 /// graph) during the reading, but instead the label map of the items |
439 /// are given as a parameter of these functions. An |
439 /// are given as a parameter of these functions. An |
440 /// application of these function is multipass reading, which is |
440 /// application of these functions is multipass reading, which is |
441 /// important if two \e \@arcs sections must be read from the |
441 /// important if two \c \@arcs sections must be read from the |
442 /// file. In this example the first phase would read the node set and one |
442 /// file. In this case the first phase would read the node set and one |
443 /// of the arc sets, while the second phase would read the second arc |
443 /// of the arc sets, while the second phase would read the second arc |
444 /// set into an \e ArcSet class (\c SmartArcSet or \c ListArcSet). |
444 /// set into an \e ArcSet class (\c SmartArcSet or \c ListArcSet). |
445 /// The previously read label node map should be passed to the \c |
445 /// The previously read label node map should be passed to the \c |
446 /// useNodes() functions. Another application of multipass reading when |
446 /// useNodes() functions. Another application of multipass reading when |
447 /// paths are given as a node map or an arc map. It is impossible read this in |
447 /// paths are given as a node map or an arc map. It is impossible to read this in |
448 /// a single pass, because the arcs are not constructed when the node |
448 /// a single pass, because the arcs are not constructed when the node |
449 /// maps are read. |
449 /// maps are read. |
450 template <typename _Digraph> |
450 template <typename _Digraph> |
451 class DigraphReader { |
451 class DigraphReader { |
452 public: |
452 public: |
733 |
733 |
734 /// \brief Use previously constructed node set |
734 /// \brief Use previously constructed node set |
735 /// |
735 /// |
736 /// Use previously constructed node set, and specify the node |
736 /// Use previously constructed node set, and specify the node |
737 /// label map and a functor which converts the label map values to |
737 /// label map and a functor which converts the label map values to |
738 /// std::string. |
738 /// \c std::string. |
739 template <typename Map, typename Converter> |
739 template <typename Map, typename Converter> |
740 DigraphReader& useNodes(const Map& map, |
740 DigraphReader& useNodes(const Map& map, |
741 const Converter& converter = Converter()) { |
741 const Converter& converter = Converter()) { |
742 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); |
742 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); |
743 LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member"); |
743 LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member"); |
766 |
766 |
767 /// \brief Use previously constructed arc set |
767 /// \brief Use previously constructed arc set |
768 /// |
768 /// |
769 /// Use previously constructed arc set, and specify the arc |
769 /// Use previously constructed arc set, and specify the arc |
770 /// label map and a functor which converts the label map values to |
770 /// label map and a functor which converts the label map values to |
771 /// std::string. |
771 /// \c std::string. |
772 template <typename Map, typename Converter> |
772 template <typename Map, typename Converter> |
773 DigraphReader& useArcs(const Map& map, |
773 DigraphReader& useArcs(const Map& map, |
774 const Converter& converter = Converter()) { |
774 const Converter& converter = Converter()) { |
775 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); |
775 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); |
776 LEMON_ASSERT(!_use_arcs, "Multiple usage of useArcs() member"); |
776 LEMON_ASSERT(!_use_arcs, "Multiple usage of useArcs() member"); |
782 } |
782 } |
783 |
783 |
784 /// \brief Skips the reading of node section |
784 /// \brief Skips the reading of node section |
785 /// |
785 /// |
786 /// Omit the reading of the node section. This implies that each node |
786 /// Omit the reading of the node section. This implies that each node |
787 /// map reading rule will be abanoned, and the nodes of the graph |
787 /// map reading rule will be abandoned, and the nodes of the graph |
788 /// will not be constructed, which usually cause that the arc set |
788 /// will not be constructed, which usually cause that the arc set |
789 /// could not be read due to lack of node name |
789 /// could not be read due to lack of node name resolving. |
790 /// resolving. Therefore, the \c skipArcs() should be used too, or |
790 /// Therefore \c skipArcs() function should also be used, or |
791 /// the useNodes() member function should be used to specify the |
791 /// \c useNodes() should be used to specify the label of the nodes. |
792 /// label of the nodes. |
|
793 DigraphReader& skipNodes() { |
792 DigraphReader& skipNodes() { |
794 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); |
793 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); |
795 _skip_nodes = true; |
794 _skip_nodes = true; |
796 return *this; |
795 return *this; |
797 } |
796 } |
798 |
797 |
799 /// \brief Skips the reading of arc section |
798 /// \brief Skips the reading of arc section |
800 /// |
799 /// |
801 /// Omit the reading of the arc section. This implies that each arc |
800 /// Omit the reading of the arc section. This implies that each arc |
802 /// map reading rule will be abanoned, and the arcs of the graph |
801 /// map reading rule will be abandoned, and the arcs of the graph |
803 /// will not be constructed. |
802 /// will not be constructed. |
804 DigraphReader& skipArcs() { |
803 DigraphReader& skipArcs() { |
805 LEMON_ASSERT(!_skip_arcs, "Skip arcs already set"); |
804 LEMON_ASSERT(!_skip_arcs, "Skip arcs already set"); |
806 _skip_arcs = true; |
805 _skip_arcs = true; |
807 return *this; |
806 return *this; |
1173 |
1172 |
1174 /// @} |
1173 /// @} |
1175 |
1174 |
1176 }; |
1175 }; |
1177 |
1176 |
|
1177 /// \brief Return a \ref DigraphReader class |
|
1178 /// |
|
1179 /// This function just returns a \ref DigraphReader class. |
1178 /// \relates DigraphReader |
1180 /// \relates DigraphReader |
1179 template <typename Digraph> |
1181 template <typename Digraph> |
1180 DigraphReader<Digraph> digraphReader(std::istream& is, Digraph& digraph) { |
1182 DigraphReader<Digraph> digraphReader(std::istream& is, Digraph& digraph) { |
1181 DigraphReader<Digraph> tmp(is, digraph); |
1183 DigraphReader<Digraph> tmp(is, digraph); |
1182 return tmp; |
1184 return tmp; |
1183 } |
1185 } |
1184 |
1186 |
|
1187 /// \brief Return a \ref DigraphReader class |
|
1188 /// |
|
1189 /// This function just returns a \ref DigraphReader class. |
1185 /// \relates DigraphReader |
1190 /// \relates DigraphReader |
1186 template <typename Digraph> |
1191 template <typename Digraph> |
1187 DigraphReader<Digraph> digraphReader(const std::string& fn, |
1192 DigraphReader<Digraph> digraphReader(const std::string& fn, |
1188 Digraph& digraph) { |
1193 Digraph& digraph) { |
1189 DigraphReader<Digraph> tmp(fn, digraph); |
1194 DigraphReader<Digraph> tmp(fn, digraph); |
1190 return tmp; |
1195 return tmp; |
1191 } |
1196 } |
1192 |
1197 |
|
1198 /// \brief Return a \ref DigraphReader class |
|
1199 /// |
|
1200 /// This function just returns a \ref DigraphReader class. |
1193 /// \relates DigraphReader |
1201 /// \relates DigraphReader |
1194 template <typename Digraph> |
1202 template <typename Digraph> |
1195 DigraphReader<Digraph> digraphReader(const char* fn, Digraph& digraph) { |
1203 DigraphReader<Digraph> digraphReader(const char* fn, Digraph& digraph) { |
1196 DigraphReader<Digraph> tmp(fn, digraph); |
1204 DigraphReader<Digraph> tmp(fn, digraph); |
1197 return tmp; |
1205 return tmp; |
1209 template <typename Graph> |
1217 template <typename Graph> |
1210 GraphReader<Graph> graphReader(const char *fn, Graph& graph); |
1218 GraphReader<Graph> graphReader(const char *fn, Graph& graph); |
1211 |
1219 |
1212 /// \ingroup lemon_io |
1220 /// \ingroup lemon_io |
1213 /// |
1221 /// |
1214 /// \brief LGF reader for undirected graphs |
1222 /// \brief \ref lgf-format "LGF" reader for undirected graphs |
1215 /// |
1223 /// |
1216 /// This utility reads an \ref lgf-format "LGF" file. |
1224 /// This utility reads an \ref lgf-format "LGF" file. |
|
1225 /// |
|
1226 /// It can be used almost the same way as \c DigraphReader. |
|
1227 /// The only difference is that this class can handle edges and |
|
1228 /// edge maps as well as arcs and arc maps. |
1217 template <typename _Graph> |
1229 template <typename _Graph> |
1218 class GraphReader { |
1230 class GraphReader { |
1219 public: |
1231 public: |
1220 |
1232 |
1221 typedef _Graph Graph; |
1233 typedef _Graph Graph; |
1260 |
1272 |
1261 public: |
1273 public: |
1262 |
1274 |
1263 /// \brief Constructor |
1275 /// \brief Constructor |
1264 /// |
1276 /// |
1265 /// Construct a undirected graph reader, which reads from the given |
1277 /// Construct an undirected graph reader, which reads from the given |
1266 /// input stream. |
1278 /// input stream. |
1267 GraphReader(std::istream& is, Graph& graph) |
1279 GraphReader(std::istream& is, Graph& graph) |
1268 : _is(&is), local_is(false), _graph(graph), |
1280 : _is(&is), local_is(false), _graph(graph), |
1269 _use_nodes(false), _use_edges(false), |
1281 _use_nodes(false), _use_edges(false), |
1270 _skip_nodes(false), _skip_edges(false) {} |
1282 _skip_nodes(false), _skip_edges(false) {} |
1271 |
1283 |
1272 /// \brief Constructor |
1284 /// \brief Constructor |
1273 /// |
1285 /// |
1274 /// Construct a undirected graph reader, which reads from the given |
1286 /// Construct an undirected graph reader, which reads from the given |
1275 /// file. |
1287 /// file. |
1276 GraphReader(const std::string& fn, Graph& graph) |
1288 GraphReader(const std::string& fn, Graph& graph) |
1277 : _is(new std::ifstream(fn.c_str())), local_is(true), _graph(graph), |
1289 : _is(new std::ifstream(fn.c_str())), local_is(true), _graph(graph), |
1278 _use_nodes(false), _use_edges(false), |
1290 _use_nodes(false), _use_edges(false), |
1279 _skip_nodes(false), _skip_edges(false) {} |
1291 _skip_nodes(false), _skip_edges(false) {} |
1280 |
1292 |
1281 /// \brief Constructor |
1293 /// \brief Constructor |
1282 /// |
1294 /// |
1283 /// Construct a undirected graph reader, which reads from the given |
1295 /// Construct an undirected graph reader, which reads from the given |
1284 /// file. |
1296 /// file. |
1285 GraphReader(const char* fn, Graph& graph) |
1297 GraphReader(const char* fn, Graph& graph) |
1286 : _is(new std::ifstream(fn)), local_is(true), _graph(graph), |
1298 : _is(new std::ifstream(fn)), local_is(true), _graph(graph), |
1287 _use_nodes(false), _use_edges(false), |
1299 _use_nodes(false), _use_edges(false), |
1288 _skip_nodes(false), _skip_edges(false) {} |
1300 _skip_nodes(false), _skip_edges(false) {} |
1495 /// \name Select section by name |
1507 /// \name Select section by name |
1496 /// @{ |
1508 /// @{ |
1497 |
1509 |
1498 /// \brief Set \c \@nodes section to be read |
1510 /// \brief Set \c \@nodes section to be read |
1499 /// |
1511 /// |
1500 /// Set \c \@nodes section to be read |
1512 /// Set \c \@nodes section to be read. |
1501 GraphReader& nodes(const std::string& caption) { |
1513 GraphReader& nodes(const std::string& caption) { |
1502 _nodes_caption = caption; |
1514 _nodes_caption = caption; |
1503 return *this; |
1515 return *this; |
1504 } |
1516 } |
1505 |
1517 |
1506 /// \brief Set \c \@edges section to be read |
1518 /// \brief Set \c \@edges section to be read |
1507 /// |
1519 /// |
1508 /// Set \c \@edges section to be read |
1520 /// Set \c \@edges section to be read. |
1509 GraphReader& edges(const std::string& caption) { |
1521 GraphReader& edges(const std::string& caption) { |
1510 _edges_caption = caption; |
1522 _edges_caption = caption; |
1511 return *this; |
1523 return *this; |
1512 } |
1524 } |
1513 |
1525 |
1514 /// \brief Set \c \@attributes section to be read |
1526 /// \brief Set \c \@attributes section to be read |
1515 /// |
1527 /// |
1516 /// Set \c \@attributes section to be read |
1528 /// Set \c \@attributes section to be read. |
1517 GraphReader& attributes(const std::string& caption) { |
1529 GraphReader& attributes(const std::string& caption) { |
1518 _attributes_caption = caption; |
1530 _attributes_caption = caption; |
1519 return *this; |
1531 return *this; |
1520 } |
1532 } |
1521 |
1533 |
1542 |
1554 |
1543 /// \brief Use previously constructed node set |
1555 /// \brief Use previously constructed node set |
1544 /// |
1556 /// |
1545 /// Use previously constructed node set, and specify the node |
1557 /// Use previously constructed node set, and specify the node |
1546 /// label map and a functor which converts the label map values to |
1558 /// label map and a functor which converts the label map values to |
1547 /// std::string. |
1559 /// \c std::string. |
1548 template <typename Map, typename Converter> |
1560 template <typename Map, typename Converter> |
1549 GraphReader& useNodes(const Map& map, |
1561 GraphReader& useNodes(const Map& map, |
1550 const Converter& converter = Converter()) { |
1562 const Converter& converter = Converter()) { |
1551 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); |
1563 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); |
1552 LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member"); |
1564 LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member"); |
1575 |
1587 |
1576 /// \brief Use previously constructed edge set |
1588 /// \brief Use previously constructed edge set |
1577 /// |
1589 /// |
1578 /// Use previously constructed edge set, and specify the edge |
1590 /// Use previously constructed edge set, and specify the edge |
1579 /// label map and a functor which converts the label map values to |
1591 /// label map and a functor which converts the label map values to |
1580 /// std::string. |
1592 /// \c std::string. |
1581 template <typename Map, typename Converter> |
1593 template <typename Map, typename Converter> |
1582 GraphReader& useEdges(const Map& map, |
1594 GraphReader& useEdges(const Map& map, |
1583 const Converter& converter = Converter()) { |
1595 const Converter& converter = Converter()) { |
1584 checkConcept<concepts::ReadMap<Edge, typename Map::Value>, Map>(); |
1596 checkConcept<concepts::ReadMap<Edge, typename Map::Value>, Map>(); |
1585 LEMON_ASSERT(!_use_edges, "Multiple usage of useEdges() member"); |
1597 LEMON_ASSERT(!_use_edges, "Multiple usage of useEdges() member"); |
1588 _edge_index.insert(std::make_pair(converter(map[a]), a)); |
1600 _edge_index.insert(std::make_pair(converter(map[a]), a)); |
1589 } |
1601 } |
1590 return *this; |
1602 return *this; |
1591 } |
1603 } |
1592 |
1604 |
1593 /// \brief Skips the reading of node section |
1605 /// \brief Skip the reading of node section |
1594 /// |
1606 /// |
1595 /// Omit the reading of the node section. This implies that each node |
1607 /// Omit the reading of the node section. This implies that each node |
1596 /// map reading rule will be abanoned, and the nodes of the graph |
1608 /// map reading rule will be abandoned, and the nodes of the graph |
1597 /// will not be constructed, which usually cause that the edge set |
1609 /// will not be constructed, which usually cause that the edge set |
1598 /// could not be read due to lack of node name |
1610 /// could not be read due to lack of node name |
1599 /// resolving. Therefore, the \c skipEdges() should be used too, or |
1611 /// could not be read due to lack of node name resolving. |
1600 /// the useNodes() member function should be used to specify the |
1612 /// Therefore \c skipEdges() function should also be used, or |
1601 /// label of the nodes. |
1613 /// \c useNodes() should be used to specify the label of the nodes. |
1602 GraphReader& skipNodes() { |
1614 GraphReader& skipNodes() { |
1603 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); |
1615 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); |
1604 _skip_nodes = true; |
1616 _skip_nodes = true; |
1605 return *this; |
1617 return *this; |
1606 } |
1618 } |
1607 |
1619 |
1608 /// \brief Skips the reading of edge section |
1620 /// \brief Skip the reading of edge section |
1609 /// |
1621 /// |
1610 /// Omit the reading of the edge section. This implies that each edge |
1622 /// Omit the reading of the edge section. This implies that each edge |
1611 /// map reading rule will be abanoned, and the edges of the graph |
1623 /// map reading rule will be abandoned, and the edges of the graph |
1612 /// will not be constructed. |
1624 /// will not be constructed. |
1613 GraphReader& skipEdges() { |
1625 GraphReader& skipEdges() { |
1614 LEMON_ASSERT(!_skip_edges, "Skip edges already set"); |
1626 LEMON_ASSERT(!_skip_edges, "Skip edges already set"); |
1615 _skip_edges = true; |
1627 _skip_edges = true; |
1616 return *this; |
1628 return *this; |
1980 |
1992 |
1981 /// @} |
1993 /// @} |
1982 |
1994 |
1983 }; |
1995 }; |
1984 |
1996 |
|
1997 /// \brief Return a \ref GraphReader class |
|
1998 /// |
|
1999 /// This function just returns a \ref GraphReader class. |
1985 /// \relates GraphReader |
2000 /// \relates GraphReader |
1986 template <typename Graph> |
2001 template <typename Graph> |
1987 GraphReader<Graph> graphReader(std::istream& is, Graph& graph) { |
2002 GraphReader<Graph> graphReader(std::istream& is, Graph& graph) { |
1988 GraphReader<Graph> tmp(is, graph); |
2003 GraphReader<Graph> tmp(is, graph); |
1989 return tmp; |
2004 return tmp; |
1990 } |
2005 } |
1991 |
2006 |
|
2007 /// \brief Return a \ref GraphReader class |
|
2008 /// |
|
2009 /// This function just returns a \ref GraphReader class. |
1992 /// \relates GraphReader |
2010 /// \relates GraphReader |
1993 template <typename Graph> |
2011 template <typename Graph> |
1994 GraphReader<Graph> graphReader(const std::string& fn, |
2012 GraphReader<Graph> graphReader(const std::string& fn, |
1995 Graph& graph) { |
2013 Graph& graph) { |
1996 GraphReader<Graph> tmp(fn, graph); |
2014 GraphReader<Graph> tmp(fn, graph); |
1997 return tmp; |
2015 return tmp; |
1998 } |
2016 } |
1999 |
2017 |
|
2018 /// \brief Return a \ref GraphReader class |
|
2019 /// |
|
2020 /// This function just returns a \ref GraphReader class. |
2000 /// \relates GraphReader |
2021 /// \relates GraphReader |
2001 template <typename Graph> |
2022 template <typename Graph> |
2002 GraphReader<Graph> graphReader(const char* fn, Graph& graph) { |
2023 GraphReader<Graph> graphReader(const char* fn, Graph& graph) { |
2003 GraphReader<Graph> tmp(fn, graph); |
2024 GraphReader<Graph> tmp(fn, graph); |
2004 return tmp; |
2025 return tmp; |
2008 |
2029 |
2009 SectionReader sectionReader(std::istream& is); |
2030 SectionReader sectionReader(std::istream& is); |
2010 SectionReader sectionReader(const std::string& fn); |
2031 SectionReader sectionReader(const std::string& fn); |
2011 SectionReader sectionReader(const char* fn); |
2032 SectionReader sectionReader(const char* fn); |
2012 |
2033 |
|
2034 /// \ingroup lemon_io |
|
2035 /// |
2013 /// \brief Section reader class |
2036 /// \brief Section reader class |
2014 /// |
2037 /// |
2015 /// In the \e LGF file extra sections can be placed, which contain |
2038 /// In the \ref lgf-format "LGF" file extra sections can be placed, |
2016 /// any data in arbitrary format. Such sections can be read with |
2039 /// which contain any data in arbitrary format. Such sections can be |
2017 /// this class. A reading rule can be added with two different |
2040 /// read with this class. A reading rule can be added to the class |
2018 /// functions, with the \c sectionLines() function a functor can |
2041 /// with two different functions. With the \c sectionLines() function a |
2019 /// process the section line-by-line. While with the \c |
2042 /// functor can process the section line-by-line, while with the \c |
2020 /// sectionStream() member the section can be read from an input |
2043 /// sectionStream() member the section can be read from an input |
2021 /// stream. |
2044 /// stream. |
2022 class SectionReader { |
2045 class SectionReader { |
2023 private: |
2046 private: |
2024 |
2047 |
2121 /// |
2144 /// |
2122 /// reader.sectionLines("numbers", NumberSection(vec)); |
2145 /// reader.sectionLines("numbers", NumberSection(vec)); |
2123 ///\endcode |
2146 ///\endcode |
2124 template <typename Functor> |
2147 template <typename Functor> |
2125 SectionReader& sectionLines(const std::string& type, Functor functor) { |
2148 SectionReader& sectionLines(const std::string& type, Functor functor) { |
2126 LEMON_ASSERT(!type.empty(), "Type is not empty."); |
2149 LEMON_ASSERT(!type.empty(), "Type is empty."); |
2127 LEMON_ASSERT(_sections.find(type) == _sections.end(), |
2150 LEMON_ASSERT(_sections.find(type) == _sections.end(), |
2128 "Multiple reading of section."); |
2151 "Multiple reading of section."); |
2129 _sections.insert(std::make_pair(type, |
2152 _sections.insert(std::make_pair(type, |
2130 new _reader_bits::LineSection<Functor>(functor))); |
2153 new _reader_bits::LineSection<Functor>(functor))); |
2131 return *this; |
2154 return *this; |
2133 |
2156 |
2134 |
2157 |
2135 /// \brief Add a section processor with stream oriented reading |
2158 /// \brief Add a section processor with stream oriented reading |
2136 /// |
2159 /// |
2137 /// The first parameter is the type of the section, the second is |
2160 /// The first parameter is the type of the section, the second is |
2138 /// a functor, which takes an \c std::istream& and an int& |
2161 /// a functor, which takes an \c std::istream& and an \c int& |
2139 /// parameter, the latter regard to the line number of stream. The |
2162 /// parameter, the latter regard to the line number of stream. The |
2140 /// functor can read the input while the section go on, and the |
2163 /// functor can read the input while the section go on, and the |
2141 /// line number should be modified accordingly. |
2164 /// line number should be modified accordingly. |
2142 template <typename Functor> |
2165 template <typename Functor> |
2143 SectionReader& sectionStream(const std::string& type, Functor functor) { |
2166 SectionReader& sectionStream(const std::string& type, Functor functor) { |
2144 LEMON_ASSERT(!type.empty(), "Type is not empty."); |
2167 LEMON_ASSERT(!type.empty(), "Type is empty."); |
2145 LEMON_ASSERT(_sections.find(type) == _sections.end(), |
2168 LEMON_ASSERT(_sections.find(type) == _sections.end(), |
2146 "Multiple reading of section."); |
2169 "Multiple reading of section."); |
2147 _sections.insert(std::make_pair(type, |
2170 _sections.insert(std::make_pair(type, |
2148 new _reader_bits::StreamSection<Functor>(functor))); |
2171 new _reader_bits::StreamSection<Functor>(functor))); |
2149 return *this; |
2172 return *this; |
2237 |
2260 |
2238 /// @} |
2261 /// @} |
2239 |
2262 |
2240 }; |
2263 }; |
2241 |
2264 |
|
2265 /// \brief Return a \ref SectionReader class |
|
2266 /// |
|
2267 /// This function just returns a \ref SectionReader class. |
2242 /// \relates SectionReader |
2268 /// \relates SectionReader |
2243 inline SectionReader sectionReader(std::istream& is) { |
2269 inline SectionReader sectionReader(std::istream& is) { |
2244 SectionReader tmp(is); |
2270 SectionReader tmp(is); |
2245 return tmp; |
2271 return tmp; |
2246 } |
2272 } |
2247 |
2273 |
|
2274 /// \brief Return a \ref SectionReader class |
|
2275 /// |
|
2276 /// This function just returns a \ref SectionReader class. |
2248 /// \relates SectionReader |
2277 /// \relates SectionReader |
2249 inline SectionReader sectionReader(const std::string& fn) { |
2278 inline SectionReader sectionReader(const std::string& fn) { |
2250 SectionReader tmp(fn); |
2279 SectionReader tmp(fn); |
2251 return tmp; |
2280 return tmp; |
2252 } |
2281 } |
2253 |
2282 |
|
2283 /// \brief Return a \ref SectionReader class |
|
2284 /// |
|
2285 /// This function just returns a \ref SectionReader class. |
2254 /// \relates SectionReader |
2286 /// \relates SectionReader |
2255 inline SectionReader sectionReader(const char* fn) { |
2287 inline SectionReader sectionReader(const char* fn) { |
2256 SectionReader tmp(fn); |
2288 SectionReader tmp(fn); |
2257 return tmp; |
2289 return tmp; |
2258 } |
2290 } |
2267 /// should be read from a file, but in general tools (like glemon) |
2299 /// should be read from a file, but in general tools (like glemon) |
2268 /// the contents of an LGF file should be guessed somehow. This class |
2300 /// the contents of an LGF file should be guessed somehow. This class |
2269 /// reads the graph and stores the appropriate information for |
2301 /// reads the graph and stores the appropriate information for |
2270 /// reading the graph. |
2302 /// reading the graph. |
2271 /// |
2303 /// |
2272 ///\code LgfContents contents("graph.lgf"); |
2304 ///\code |
|
2305 /// LgfContents contents("graph.lgf"); |
2273 /// contents.run(); |
2306 /// contents.run(); |
2274 /// |
2307 /// |
2275 /// // does it contain any node section and arc section |
2308 /// // Does it contain any node section and arc section? |
2276 /// if (contents.nodeSectionNum() == 0 || contents.arcSectionNum()) { |
2309 /// if (contents.nodeSectionNum() == 0 || contents.arcSectionNum()) { |
2277 /// std::cerr << "Failure, cannot find graph" << std::endl; |
2310 /// std::cerr << "Failure, cannot find graph." << std::endl; |
2278 /// return -1; |
2311 /// return -1; |
2279 /// } |
2312 /// } |
2280 /// std::cout << "The name of the default node section : " |
2313 /// std::cout << "The name of the default node section: " |
2281 /// << contents.nodeSection(0) << std::endl; |
2314 /// << contents.nodeSection(0) << std::endl; |
2282 /// std::cout << "The number of the arc maps : " |
2315 /// std::cout << "The number of the arc maps: " |
2283 /// << contents.arcMaps(0).size() << std::endl; |
2316 /// << contents.arcMaps(0).size() << std::endl; |
2284 /// std::cout << "The name of second arc map : " |
2317 /// std::cout << "The name of second arc map: " |
2285 /// << contents.arcMaps(0)[1] << std::endl; |
2318 /// << contents.arcMaps(0)[1] << std::endl; |
2286 ///\endcode |
2319 ///\endcode |
2287 class LgfContents { |
2320 class LgfContents { |
2288 private: |
2321 private: |
2289 |
2322 |
2350 /// Gives back the number of node sections in the file. |
2383 /// Gives back the number of node sections in the file. |
2351 int nodeSectionNum() const { |
2384 int nodeSectionNum() const { |
2352 return _node_sections.size(); |
2385 return _node_sections.size(); |
2353 } |
2386 } |
2354 |
2387 |
2355 /// \brief Returns the section name at the given position. |
2388 /// \brief Returns the node section name at the given position. |
2356 /// |
2389 /// |
2357 /// Returns the section name at the given position. |
2390 /// Returns the node section name at the given position. |
2358 const std::string& nodeSection(int i) const { |
2391 const std::string& nodeSection(int i) const { |
2359 return _node_sections[i]; |
2392 return _node_sections[i]; |
2360 } |
2393 } |
2361 |
2394 |
2362 /// \brief Gives back the node maps for the given section. |
2395 /// \brief Gives back the node maps for the given section. |
2377 /// \note It is synonym of \c edgeSectionNum(). |
2410 /// \note It is synonym of \c edgeSectionNum(). |
2378 int arcSectionNum() const { |
2411 int arcSectionNum() const { |
2379 return _edge_sections.size(); |
2412 return _edge_sections.size(); |
2380 } |
2413 } |
2381 |
2414 |
2382 /// \brief Returns the section name at the given position. |
2415 /// \brief Returns the arc/edge section name at the given position. |
2383 /// |
2416 /// |
2384 /// Returns the section name at the given position. |
2417 /// Returns the arc/edge section name at the given position. |
2385 /// \note It is synonym of \c edgeSection(). |
2418 /// \note It is synonym of \c edgeSection(). |
2386 const std::string& arcSection(int i) const { |
2419 const std::string& arcSection(int i) const { |
2387 return _edge_sections[i]; |
2420 return _edge_sections[i]; |
2388 } |
2421 } |
2389 |
2422 |
2434 /// Gives back the number of attribute sections in the file. |
2467 /// Gives back the number of attribute sections in the file. |
2435 int attributeSectionNum() const { |
2468 int attributeSectionNum() const { |
2436 return _attribute_sections.size(); |
2469 return _attribute_sections.size(); |
2437 } |
2470 } |
2438 |
2471 |
2439 /// \brief Returns the section name at the given position. |
2472 /// \brief Returns the attribute section name at the given position. |
2440 /// |
2473 /// |
2441 /// Returns the section name at the given position. |
2474 /// Returns the attribute section name at the given position. |
2442 const std::string& attributeSectionNames(int i) const { |
2475 const std::string& attributeSectionNames(int i) const { |
2443 return _attribute_sections[i]; |
2476 return _attribute_sections[i]; |
2444 } |
2477 } |
2445 |
2478 |
2446 /// \brief Gives back the attributes for the given section. |
2479 /// \brief Gives back the attributes for the given section. |