Changes in lemon/lgf_reader.h [190:1e6af6f0843c:201:9757e3d9bfeb] in lemon-1.2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/lgf_reader.h
r190 r201 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 … … 196 196 }; 197 197 198 bool isWhiteSpace(char c) {198 inline bool isWhiteSpace(char c) { 199 199 return c == ' ' || c == '\t' || c == '\v' || 200 200 c == '\n' || c == '\r' || c == '\f'; 201 201 } 202 202 203 bool isOct(char c) {203 inline bool isOct(char c) { 204 204 return '0' <= c && c <='7'; 205 205 } 206 206 207 in t valueOct(char c) {207 inline int valueOct(char c) { 208 208 LEMON_ASSERT(isOct(c), "The character is not octal."); 209 209 return c - '0'; 210 210 } 211 211 212 bool isHex(char c) {212 inline bool isHex(char c) { 213 213 return ('0' <= c && c <= '9') || 214 214 ('a' <= c && c <= 'z') || … … 216 216 } 217 217 218 in t valueHex(char c) {218 inline int valueHex(char c) { 219 219 LEMON_ASSERT(isHex(c), "The character is not hexadecimal."); 220 220 if ('0' <= c && c <= '9') return c - '0'; … … 223 223 } 224 224 225 bool isIdentifierFirstChar(char c) {225 inline bool isIdentifierFirstChar(char c) { 226 226 return ('a' <= c && c <= 'z') || 227 227 ('A' <= c && c <= 'Z') || c == '_'; 228 228 } 229 229 230 bool isIdentifierChar(char c) {230 inline bool isIdentifierChar(char c) { 231 231 return isIdentifierFirstChar(c) || 232 232 ('0' <= c && c <= '9'); 233 233 } 234 234 235 char readEscape(std::istream& is) {235 inline char readEscape(std::istream& is) { 236 236 char c; 237 237 if (!is.get(c)) … … 285 285 } 286 286 287 std::istream& readToken(std::istream& is, std::string& str) {287 inline std::istream& readToken(std::istream& is, std::string& str) { 288 288 std::ostringstream os; 289 289 … … 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. 1229 /// 1230 /// The columns in the \c \@edges (or \c \@arcs) section are the 1231 /// edge maps. However, if there are two maps with the same name 1232 /// prefixed with \c '+' and \c '-', then these can be read into an 1233 /// arc map. Similarly, an attribute can be read into an arc, if 1234 /// it's value is an edge label prefixed with \c '+' or \c '-'. 1217 1235 template <typename _Graph> 1218 1236 class GraphReader { … … 1263 1281 /// \brief Constructor 1264 1282 /// 1265 /// Construct a undirected graph reader, which reads from the given1283 /// Construct an undirected graph reader, which reads from the given 1266 1284 /// input stream. 1267 1285 GraphReader(std::istream& is, Graph& graph) … … 1272 1290 /// \brief Constructor 1273 1291 /// 1274 /// Construct a undirected graph reader, which reads from the given1292 /// Construct an undirected graph reader, which reads from the given 1275 1293 /// file. 1276 1294 GraphReader(const std::string& fn, Graph& graph) … … 1281 1299 /// \brief Constructor 1282 1300 /// 1283 /// Construct a undirected graph reader, which reads from the given1301 /// Construct an undirected graph reader, which reads from the given 1284 1302 /// file. 1285 1303 GraphReader(const char* fn, Graph& graph) … … 1498 1516 /// \brief Set \c \@nodes section to be read 1499 1517 /// 1500 /// Set \c \@nodes section to be read 1518 /// Set \c \@nodes section to be read. 1501 1519 GraphReader& nodes(const std::string& caption) { 1502 1520 _nodes_caption = caption; … … 1506 1524 /// \brief Set \c \@edges section to be read 1507 1525 /// 1508 /// Set \c \@edges section to be read 1526 /// Set \c \@edges section to be read. 1509 1527 GraphReader& edges(const std::string& caption) { 1510 1528 _edges_caption = caption; … … 1514 1532 /// \brief Set \c \@attributes section to be read 1515 1533 /// 1516 /// Set \c \@attributes section to be read 1534 /// Set \c \@attributes section to be read. 1517 1535 GraphReader& attributes(const std::string& caption) { 1518 1536 _attributes_caption = caption; … … 1545 1563 /// Use previously constructed node set, and specify the node 1546 1564 /// label map and a functor which converts the label map values to 1547 /// std::string.1565 /// \c std::string. 1548 1566 template <typename Map, typename Converter> 1549 1567 GraphReader& useNodes(const Map& map, … … 1578 1596 /// Use previously constructed edge set, and specify the edge 1579 1597 /// label map and a functor which converts the label map values to 1580 /// std::string.1598 /// \c std::string. 1581 1599 template <typename Map, typename Converter> 1582 1600 GraphReader& useEdges(const Map& map, … … 1591 1609 } 1592 1610 1593 /// \brief Skip sthe reading of node section1611 /// \brief Skip the reading of node section 1594 1612 /// 1595 1613 /// 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 graph1614 /// map reading rule will be abandoned, and the nodes of the graph 1597 1615 /// will not be constructed, which usually cause that the edge set 1598 1616 /// 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.1617 /// could not be read due to lack of node name resolving. 1618 /// Therefore \c skipEdges() function should also be used, or 1619 /// \c useNodes() should be used to specify the label of the nodes. 1602 1620 GraphReader& skipNodes() { 1603 1621 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); … … 1606 1624 } 1607 1625 1608 /// \brief Skip sthe reading of edge section1626 /// \brief Skip the reading of edge section 1609 1627 /// 1610 1628 /// 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 graph1629 /// map reading rule will be abandoned, and the edges of the graph 1612 1630 /// will not be constructed. 1613 1631 GraphReader& skipEdges() { … … 1983 2001 }; 1984 2002 2003 /// \brief Return a \ref GraphReader class 2004 /// 2005 /// This function just returns a \ref GraphReader class. 1985 2006 /// \relates GraphReader 1986 2007 template <typename Graph> … … 1990 2011 } 1991 2012 2013 /// \brief Return a \ref GraphReader class 2014 /// 2015 /// This function just returns a \ref GraphReader class. 1992 2016 /// \relates GraphReader 1993 2017 template <typename Graph> … … 1998 2022 } 1999 2023 2024 /// \brief Return a \ref GraphReader class 2025 /// 2026 /// This function just returns a \ref GraphReader class. 2000 2027 /// \relates GraphReader 2001 2028 template <typename Graph> … … 2011 2038 SectionReader sectionReader(const char* fn); 2012 2039 2040 /// \ingroup lemon_io 2041 /// 2013 2042 /// \brief Section reader class 2014 2043 /// 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 \c2044 /// In the \ref lgf-format "LGF" file extra sections can be placed, 2045 /// which contain any data in arbitrary format. Such sections can be 2046 /// read with this class. A reading rule can be added to the class 2047 /// with two different functions. With the \c sectionLines() function a 2048 /// functor can process the section line-by-line, while with the \c 2020 2049 /// sectionStream() member the section can be read from an input 2021 2050 /// stream. … … 2106 2135 ///\endcode 2107 2136 /// 2108 /// The functor is implemented as a nstruct:2137 /// The functor is implemented as a struct: 2109 2138 ///\code 2110 2139 /// struct NumberSection { … … 2124 2153 template <typename Functor> 2125 2154 SectionReader& sectionLines(const std::string& type, Functor functor) { 2126 LEMON_ASSERT(!type.empty(), "Type is notempty.");2155 LEMON_ASSERT(!type.empty(), "Type is empty."); 2127 2156 LEMON_ASSERT(_sections.find(type) == _sections.end(), 2128 2157 "Multiple reading of section."); … … 2136 2165 /// 2137 2166 /// The first parameter is the type of the section, the second is 2138 /// a functor, which takes an \c std::istream& and an int&2167 /// a functor, which takes an \c std::istream& and an \c int& 2139 2168 /// parameter, the latter regard to the line number of stream. The 2140 2169 /// functor can read the input while the section go on, and the … … 2142 2171 template <typename Functor> 2143 2172 SectionReader& sectionStream(const std::string& type, Functor functor) { 2144 LEMON_ASSERT(!type.empty(), "Type is notempty.");2173 LEMON_ASSERT(!type.empty(), "Type is empty."); 2145 2174 LEMON_ASSERT(_sections.find(type) == _sections.end(), 2146 2175 "Multiple reading of section."); … … 2187 2216 /// \brief Start the batch processing 2188 2217 /// 2189 /// This function starts the batch processing 2218 /// This function starts the batch processing. 2190 2219 void run() { 2191 2220 … … 2240 2269 }; 2241 2270 2271 /// \brief Return a \ref SectionReader class 2272 /// 2273 /// This function just returns a \ref SectionReader class. 2242 2274 /// \relates SectionReader 2243 2275 inline SectionReader sectionReader(std::istream& is) { … … 2246 2278 } 2247 2279 2280 /// \brief Return a \ref SectionReader class 2281 /// 2282 /// This function just returns a \ref SectionReader class. 2248 2283 /// \relates SectionReader 2249 2284 inline SectionReader sectionReader(const std::string& fn) { … … 2252 2287 } 2253 2288 2289 /// \brief Return a \ref SectionReader class 2290 /// 2291 /// This function just returns a \ref SectionReader class. 2254 2292 /// \relates SectionReader 2255 2293 inline SectionReader sectionReader(const char* fn) { … … 2270 2308 /// reading the graph. 2271 2309 /// 2272 ///\code LgfContents contents("graph.lgf"); 2310 ///\code 2311 /// LgfContents contents("graph.lgf"); 2273 2312 /// contents.run(); 2274 2313 /// 2275 /// // does it contain any node section and arc section2314 /// // Does it contain any node section and arc section? 2276 2315 /// if (contents.nodeSectionNum() == 0 || contents.arcSectionNum()) { 2277 /// std::cerr << "Failure, cannot find graph " << std::endl;2316 /// std::cerr << "Failure, cannot find graph." << std::endl; 2278 2317 /// return -1; 2279 2318 /// } 2280 /// std::cout << "The name of the default node section 2319 /// std::cout << "The name of the default node section: " 2281 2320 /// << contents.nodeSection(0) << std::endl; 2282 /// std::cout << "The number of the arc maps 2321 /// std::cout << "The number of the arc maps: " 2283 2322 /// << contents.arcMaps(0).size() << std::endl; 2284 /// std::cout << "The name of second arc map 2323 /// std::cout << "The name of second arc map: " 2285 2324 /// << contents.arcMaps(0)[1] << std::endl; 2286 2325 ///\endcode … … 2353 2392 } 2354 2393 2355 /// \brief Returns the section name at the given position.2356 /// 2357 /// Returns the section name at the given position.2394 /// \brief Returns the node section name at the given position. 2395 /// 2396 /// Returns the node section name at the given position. 2358 2397 const std::string& nodeSection(int i) const { 2359 2398 return _node_sections[i]; … … 2380 2419 } 2381 2420 2382 /// \brief Returns the section name at the given position.2383 /// 2384 /// Returns the section name at the given position.2421 /// \brief Returns the arc/edge section name at the given position. 2422 /// 2423 /// Returns the arc/edge section name at the given position. 2385 2424 /// \note It is synonym of \c edgeSection(). 2386 2425 const std::string& arcSection(int i) const { … … 2437 2476 } 2438 2477 2439 /// \brief Returns the section name at the given position.2440 /// 2441 /// Returns the section name at the given position.2478 /// \brief Returns the attribute section name at the given position. 2479 /// 2480 /// Returns the attribute section name at the given position. 2442 2481 const std::string& attributeSectionNames(int i) const { 2443 2482 return _attribute_sections[i]; … … 2530 2569 /// @{ 2531 2570 2532 /// \brief Start the reading2533 /// 2534 /// This function starts the reading 2571 /// \brief Starts the reading 2572 /// 2573 /// This function starts the reading. 2535 2574 void run() { 2536 2575
Note: See TracChangeset
for help on using the changeset viewer.