Changeset 192:7bf5f97d574f in lemon-1.2 for lemon/lgf_reader.h
- Timestamp:
- 07/05/08 00:14:27 (16 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/lgf_reader.h
r190 r192 19 19 ///\ingroup lemon_io 20 20 ///\file 21 ///\brief Lemon Graph Formatreader.21 ///\brief \ref lgf-format "Lemon Graph Format" reader. 22 22 23 23 … … 401 401 /// \ingroup lemon_io 402 402 /// 403 /// \brief LGFreader for directed graphs403 /// \brief \ref lgf-format "LGF" reader for directed graphs 404 404 /// 405 405 /// This utility reads an \ref lgf-format "LGF" file. … … 411 411 /// with the \c nodeMap() or \c arcMap() members. An optional 412 412 /// converter parameter can also be added as a standard functor 413 /// converting from std::string to the value type of the map. If it413 /// converting from \c std::string to the value type of the map. If it 414 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 416 /// then a default conversion will be used. One map can be read into 417 417 /// multiple map objects at the same time. The \c attribute(), \c … … 420 420 /// 421 421 ///\code 422 /// 423 /// 424 /// 425 /// 426 /// 427 /// 428 /// 422 /// DigraphReader<Digraph>(std::cin, digraph). 423 /// nodeMap("coordinates", coord_map). 424 /// arcMap("capacity", cap_map). 425 /// node("source", src). 426 /// node("target", trg). 427 /// attribute("caption", caption). 428 /// run(); 429 429 ///\endcode 430 430 /// … … 438 438 /// graph) during the reading, but instead the label map of the items 439 439 /// are given as a parameter of these functions. An 440 /// application of these function is multipass reading, which is441 /// important if two \ e\@arcs sections must be read from the442 /// file. In this example the first phase would read the node set and one440 /// application of these functions is multipass reading, which is 441 /// important if two \c \@arcs sections must be read from the 442 /// file. In this case the first phase would read the node set and one 443 443 /// of the arc sets, while the second phase would read the second arc 444 444 /// set into an \e ArcSet class (\c SmartArcSet or \c ListArcSet). 445 445 /// The previously read label node map should be passed to the \c 446 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 in447 /// paths are given as a node map or an arc map. It is impossible to read this in 448 448 /// a single pass, because the arcs are not constructed when the node 449 449 /// maps are read. … … 736 736 /// Use previously constructed node set, and specify the node 737 737 /// label map and a functor which converts the label map values to 738 /// std::string.738 /// \c std::string. 739 739 template <typename Map, typename Converter> 740 740 DigraphReader& useNodes(const Map& map, … … 769 769 /// Use previously constructed arc set, and specify the arc 770 770 /// label map and a functor which converts the label map values to 771 /// std::string.771 /// \c std::string. 772 772 template <typename Map, typename Converter> 773 773 DigraphReader& useArcs(const Map& map, … … 785 785 /// 786 786 /// Omit the reading of the node section. This implies that each node 787 /// map reading rule will be aban oned, and the nodes of the graph787 /// map reading rule will be abandoned, and the nodes of the graph 788 788 /// will not be constructed, which usually cause that the arc set 789 /// could not be read due to lack of node name 790 /// resolving. Therefore, the \c skipArcs() should be used too, or 791 /// the useNodes() member function should be used to specify the 792 /// label of the nodes. 789 /// could not be read due to lack of node name resolving. 790 /// Therefore \c skipArcs() function should also be used, or 791 /// \c useNodes() should be used to specify the label of the nodes. 793 792 DigraphReader& skipNodes() { 794 793 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); … … 800 799 /// 801 800 /// Omit the reading of the arc section. This implies that each arc 802 /// map reading rule will be aban oned, and the arcs of the graph801 /// map reading rule will be abandoned, and the arcs of the graph 803 802 /// will not be constructed. 804 803 DigraphReader& skipArcs() { … … 1176 1175 }; 1177 1176 1177 /// \brief Return a \ref DigraphReader class 1178 /// 1179 /// This function just returns a \ref DigraphReader class. 1178 1180 /// \relates DigraphReader 1179 1181 template <typename Digraph> … … 1183 1185 } 1184 1186 1187 /// \brief Return a \ref DigraphReader class 1188 /// 1189 /// This function just returns a \ref DigraphReader class. 1185 1190 /// \relates DigraphReader 1186 1191 template <typename Digraph> … … 1191 1196 } 1192 1197 1198 /// \brief Return a \ref DigraphReader class 1199 /// 1200 /// This function just returns a \ref DigraphReader class. 1193 1201 /// \relates DigraphReader 1194 1202 template <typename Digraph> … … 1212 1220 /// \ingroup lemon_io 1213 1221 /// 1214 /// \brief LGFreader for undirected graphs1222 /// \brief \ref lgf-format "LGF" reader for undirected graphs 1215 1223 /// 1216 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 1229 template <typename _Graph> 1218 1230 class GraphReader { … … 1263 1275 /// \brief Constructor 1264 1276 /// 1265 /// Construct a undirected graph reader, which reads from the given1277 /// Construct an undirected graph reader, which reads from the given 1266 1278 /// input stream. 1267 1279 GraphReader(std::istream& is, Graph& graph) … … 1272 1284 /// \brief Constructor 1273 1285 /// 1274 /// Construct a undirected graph reader, which reads from the given1286 /// Construct an undirected graph reader, which reads from the given 1275 1287 /// file. 1276 1288 GraphReader(const std::string& fn, Graph& graph) … … 1281 1293 /// \brief Constructor 1282 1294 /// 1283 /// Construct a undirected graph reader, which reads from the given1295 /// Construct an undirected graph reader, which reads from the given 1284 1296 /// file. 1285 1297 GraphReader(const char* fn, Graph& graph) … … 1498 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 1513 GraphReader& nodes(const std::string& caption) { 1502 1514 _nodes_caption = caption; … … 1506 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 1521 GraphReader& edges(const std::string& caption) { 1510 1522 _edges_caption = caption; … … 1514 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 1529 GraphReader& attributes(const std::string& caption) { 1518 1530 _attributes_caption = caption; … … 1545 1557 /// Use previously constructed node set, and specify the node 1546 1558 /// label map and a functor which converts the label map values to 1547 /// std::string.1559 /// \c std::string. 1548 1560 template <typename Map, typename Converter> 1549 1561 GraphReader& useNodes(const Map& map, … … 1578 1590 /// Use previously constructed edge set, and specify the edge 1579 1591 /// label map and a functor which converts the label map values to 1580 /// std::string.1592 /// \c std::string. 1581 1593 template <typename Map, typename Converter> 1582 1594 GraphReader& useEdges(const Map& map, … … 1591 1603 } 1592 1604 1593 /// \brief Skip sthe reading of node section1605 /// \brief Skip the reading of node section 1594 1606 /// 1595 1607 /// Omit the reading of the node section. This implies that each node 1596 /// map reading rule will be aban oned, and the nodes of the graph1608 /// map reading rule will be abandoned, and the nodes of the graph 1597 1609 /// will not be constructed, which usually cause that the edge set 1598 1610 /// could not be read due to lack of node name 1599 /// resolving. Therefore, the \c skipEdges() should be used too, or1600 /// the useNodes() member function should be used to specify the1601 /// label of the nodes.1611 /// could not be read due to lack of node name resolving. 1612 /// Therefore \c skipEdges() function should also be used, or 1613 /// \c useNodes() should be used to specify the label of the nodes. 1602 1614 GraphReader& skipNodes() { 1603 1615 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); … … 1606 1618 } 1607 1619 1608 /// \brief Skip sthe reading of edge section1620 /// \brief Skip the reading of edge section 1609 1621 /// 1610 1622 /// Omit the reading of the edge section. This implies that each edge 1611 /// map reading rule will be aban oned, and the edges of the graph1623 /// map reading rule will be abandoned, and the edges of the graph 1612 1624 /// will not be constructed. 1613 1625 GraphReader& skipEdges() { … … 1983 1995 }; 1984 1996 1997 /// \brief Return a \ref GraphReader class 1998 /// 1999 /// This function just returns a \ref GraphReader class. 1985 2000 /// \relates GraphReader 1986 2001 template <typename Graph> … … 1990 2005 } 1991 2006 2007 /// \brief Return a \ref GraphReader class 2008 /// 2009 /// This function just returns a \ref GraphReader class. 1992 2010 /// \relates GraphReader 1993 2011 template <typename Graph> … … 1998 2016 } 1999 2017 2018 /// \brief Return a \ref GraphReader class 2019 /// 2020 /// This function just returns a \ref GraphReader class. 2000 2021 /// \relates GraphReader 2001 2022 template <typename Graph> … … 2011 2032 SectionReader sectionReader(const char* fn); 2012 2033 2034 /// \ingroup lemon_io 2035 /// 2013 2036 /// \brief Section reader class 2014 2037 /// 2015 /// In the \ e LGF file extra sections can be placed, which contain2016 /// any data in arbitrary format. Such sections can be read with2017 /// this class. A reading rule can be added with two different2018 /// functions, with the \c sectionLines() function a functor can2019 /// process the section line-by-line. While with the \c2038 /// In the \ref lgf-format "LGF" file extra sections can be placed, 2039 /// which contain any data in arbitrary format. Such sections can be 2040 /// read with this class. A reading rule can be added to the class 2041 /// with two different functions. With the \c sectionLines() function a 2042 /// functor can process the section line-by-line, while with the \c 2020 2043 /// sectionStream() member the section can be read from an input 2021 2044 /// stream. … … 2106 2129 ///\endcode 2107 2130 /// 2108 /// The functor is implemented as a nstruct:2131 /// The functor is implemented as a struct: 2109 2132 ///\code 2110 2133 /// struct NumberSection { … … 2124 2147 template <typename Functor> 2125 2148 SectionReader& sectionLines(const std::string& type, Functor functor) { 2126 LEMON_ASSERT(!type.empty(), "Type is notempty.");2149 LEMON_ASSERT(!type.empty(), "Type is empty."); 2127 2150 LEMON_ASSERT(_sections.find(type) == _sections.end(), 2128 2151 "Multiple reading of section."); … … 2136 2159 /// 2137 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 2162 /// parameter, the latter regard to the line number of stream. The 2140 2163 /// functor can read the input while the section go on, and the … … 2142 2165 template <typename Functor> 2143 2166 SectionReader& sectionStream(const std::string& type, Functor functor) { 2144 LEMON_ASSERT(!type.empty(), "Type is notempty.");2167 LEMON_ASSERT(!type.empty(), "Type is empty."); 2145 2168 LEMON_ASSERT(_sections.find(type) == _sections.end(), 2146 2169 "Multiple reading of section."); … … 2187 2210 /// \brief Start the batch processing 2188 2211 /// 2189 /// This function starts the batch processing 2212 /// This function starts the batch processing. 2190 2213 void run() { 2191 2214 … … 2240 2263 }; 2241 2264 2265 /// \brief Return a \ref SectionReader class 2266 /// 2267 /// This function just returns a \ref SectionReader class. 2242 2268 /// \relates SectionReader 2243 2269 inline SectionReader sectionReader(std::istream& is) { … … 2246 2272 } 2247 2273 2274 /// \brief Return a \ref SectionReader class 2275 /// 2276 /// This function just returns a \ref SectionReader class. 2248 2277 /// \relates SectionReader 2249 2278 inline SectionReader sectionReader(const std::string& fn) { … … 2252 2281 } 2253 2282 2283 /// \brief Return a \ref SectionReader class 2284 /// 2285 /// This function just returns a \ref SectionReader class. 2254 2286 /// \relates SectionReader 2255 2287 inline SectionReader sectionReader(const char* fn) { … … 2270 2302 /// reading the graph. 2271 2303 /// 2272 ///\code LgfContents contents("graph.lgf"); 2304 ///\code 2305 /// LgfContents contents("graph.lgf"); 2273 2306 /// contents.run(); 2274 2307 /// 2275 /// // does it contain any node section and arc section2308 /// // Does it contain any node section and arc section? 2276 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 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 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 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 2318 /// << contents.arcMaps(0)[1] << std::endl; 2286 2319 ///\endcode … … 2353 2386 } 2354 2387 2355 /// \brief Returns the section name at the given position.2356 /// 2357 /// Returns the section name at the given position.2388 /// \brief Returns the node section name at the given position. 2389 /// 2390 /// Returns the node section name at the given position. 2358 2391 const std::string& nodeSection(int i) const { 2359 2392 return _node_sections[i]; … … 2380 2413 } 2381 2414 2382 /// \brief Returns the section name at the given position.2383 /// 2384 /// Returns the section name at the given position.2415 /// \brief Returns the arc/edge section name at the given position. 2416 /// 2417 /// Returns the arc/edge section name at the given position. 2385 2418 /// \note It is synonym of \c edgeSection(). 2386 2419 const std::string& arcSection(int i) const { … … 2437 2470 } 2438 2471 2439 /// \brief Returns the section name at the given position.2440 /// 2441 /// Returns the section name at the given position.2472 /// \brief Returns the attribute section name at the given position. 2473 /// 2474 /// Returns the attribute section name at the given position. 2442 2475 const std::string& attributeSectionNames(int i) const { 2443 2476 return _attribute_sections[i]; … … 2530 2563 /// @{ 2531 2564 2532 /// \brief Start the reading2533 /// 2534 /// This function starts the reading 2565 /// \brief Starts the reading 2566 /// 2567 /// This function starts the reading. 2535 2568 void run() { 2536 2569
Note: See TracChangeset
for help on using the changeset viewer.