# HG changeset patch
# User Balazs Dezso <deba@inf.elte.hu>
# Date 1214987834 -7200
# Node ID 9159de5e96575000084e63974303ad6fa5329d02
# Parent 33e45a9b868cab9cfeed4563edae07c42f908abd
Improvments in map name handling
- The label map is not necessary
- If the item set is empty and no map is read, then the map name line can
be ommited
diff -r 33e45a9b868c -r 9159de5e9657 lemon/lgf_reader.h
|
a
|
b
|
|
| 881 | 881 | std::vector<int> map_index(_node_maps.size()); |
| 882 | 882 | int map_num, label_index; |
| 883 | 883 | |
| 884 | | if (!readLine()) |
| 885 | | throw DataFormatError("Cannot find map captions"); |
| 886 | | |
| | 884 | char c; |
| | 885 | if (!readLine() || !(line >> c) || c == '@') { |
| | 886 | if (readSuccess() && line) line.putback(c); |
| | 887 | if (!_node_maps.empty()) |
| | 888 | throw DataFormatError("Cannot find map names"); |
| | 889 | return; |
| | 890 | } |
| | 891 | line.putback(c); |
| | 892 | |
| 887 | 893 | { |
| 888 | 894 | std::map<std::string, int> maps; |
| 889 | 895 | |
| … |
… |
|
| 912 | 918 | |
| 913 | 919 | { |
| 914 | 920 | std::map<std::string, int>::iterator jt = maps.find("label"); |
| 915 | | if (jt == maps.end()) |
| 916 | | throw DataFormatError("Label map not found in file"); |
| 917 | | label_index = jt->second; |
| | 921 | if (jt != maps.end()) { |
| | 922 | label_index = jt->second; |
| | 923 | } else { |
| | 924 | label_index = -1; |
| | 925 | } |
| 918 | 926 | } |
| 919 | 927 | map_num = maps.size(); |
| 920 | 928 | } |
| 921 | 929 | |
| 922 | | char c; |
| 923 | 930 | while (readLine() && line >> c && c != '@') { |
| 924 | 931 | line.putback(c); |
| 925 | 932 | |
| … |
… |
|
| 937 | 944 | Node n; |
| 938 | 945 | if (!_use_nodes) { |
| 939 | 946 | n = _digraph.addNode(); |
| 940 | | _node_index.insert(std::make_pair(tokens[label_index], n)); |
| | 947 | if (label_index != -1) |
| | 948 | _node_index.insert(std::make_pair(tokens[label_index], n)); |
| 941 | 949 | } else { |
| | 950 | if (label_index == -1) |
| | 951 | throw DataFormatError("Label map not found in file"); |
| 942 | 952 | typename std::map<std::string, Node>::iterator it = |
| 943 | 953 | _node_index.find(tokens[label_index]); |
| 944 | 954 | if (it == _node_index.end()) { |
| … |
… |
|
| 964 | 974 | std::vector<int> map_index(_arc_maps.size()); |
| 965 | 975 | int map_num, label_index; |
| 966 | 976 | |
| 967 | | if (!readLine()) |
| 968 | | throw DataFormatError("Cannot find map captions"); |
| | 977 | char c; |
| | 978 | if (!readLine() || !(line >> c) || c == '@') { |
| | 979 | if (readSuccess() && line) line.putback(c); |
| | 980 | if (!_arc_maps.empty()) |
| | 981 | throw DataFormatError("Cannot find map names"); |
| | 982 | return; |
| | 983 | } |
| | 984 | line.putback(c); |
| 969 | 985 | |
| 970 | 986 | { |
| 971 | 987 | std::map<std::string, int> maps; |
| … |
… |
|
| 995 | 1011 | |
| 996 | 1012 | { |
| 997 | 1013 | std::map<std::string, int>::iterator jt = maps.find("label"); |
| 998 | | if (jt == maps.end()) |
| 999 | | throw DataFormatError("Label map not found in file"); |
| 1000 | | label_index = jt->second; |
| | 1014 | if (jt != maps.end()) { |
| | 1015 | label_index = jt->second; |
| | 1016 | } else { |
| | 1017 | label_index = -1; |
| | 1018 | } |
| 1001 | 1019 | } |
| 1002 | 1020 | map_num = maps.size(); |
| 1003 | 1021 | } |
| 1004 | 1022 | |
| 1005 | | char c; |
| 1006 | 1023 | while (readLine() && line >> c && c != '@') { |
| 1007 | 1024 | line.putback(c); |
| 1008 | 1025 | |
| … |
… |
|
| 1013 | 1030 | throw DataFormatError("Source not found"); |
| 1014 | 1031 | |
| 1015 | 1032 | if (!_reader_bits::readToken(line, target_token)) |
| 1016 | | throw DataFormatError("Source not found"); |
| | 1033 | throw DataFormatError("Target not found"); |
| 1017 | 1034 | |
| 1018 | 1035 | std::vector<std::string> tokens(map_num); |
| 1019 | 1036 | for (int i = 0; i < map_num; ++i) { |
| … |
… |
|
| 1048 | 1065 | Node target = it->second; |
| 1049 | 1066 | |
| 1050 | 1067 | a = _digraph.addArc(source, target); |
| 1051 | | _arc_index.insert(std::make_pair(tokens[label_index], a)); |
| | 1068 | if (label_index != -1) |
| | 1069 | _arc_index.insert(std::make_pair(tokens[label_index], a)); |
| 1052 | 1070 | } else { |
| | 1071 | if (label_index == -1) |
| | 1072 | throw DataFormatError("Label map not found in file"); |
| 1053 | 1073 | typename std::map<std::string, Arc>::iterator it = |
| 1054 | 1074 | _arc_index.find(tokens[label_index]); |
| 1055 | 1075 | if (it == _arc_index.end()) { |
| … |
… |
|
| 1723 | 1743 | std::vector<int> map_index(_node_maps.size()); |
| 1724 | 1744 | int map_num, label_index; |
| 1725 | 1745 | |
| 1726 | | if (!readLine()) |
| 1727 | | throw DataFormatError("Cannot find map captions"); |
| | 1746 | char c; |
| | 1747 | if (!readLine() || !(line >> c) || c == '@') { |
| | 1748 | if (readSuccess() && line) line.putback(c); |
| | 1749 | if (!_node_maps.empty()) |
| | 1750 | throw DataFormatError("Cannot find map names"); |
| | 1751 | return; |
| | 1752 | } |
| | 1753 | line.putback(c); |
| 1728 | 1754 | |
| 1729 | 1755 | { |
| 1730 | 1756 | std::map<std::string, int> maps; |
| … |
… |
|
| 1754 | 1780 | |
| 1755 | 1781 | { |
| 1756 | 1782 | std::map<std::string, int>::iterator jt = maps.find("label"); |
| 1757 | | if (jt == maps.end()) |
| 1758 | | throw DataFormatError("Label map not found in file"); |
| 1759 | | label_index = jt->second; |
| | 1783 | if (jt != maps.end()) { |
| | 1784 | label_index = jt->second; |
| | 1785 | } else { |
| | 1786 | label_index = -1; |
| | 1787 | } |
| 1760 | 1788 | } |
| 1761 | 1789 | map_num = maps.size(); |
| 1762 | 1790 | } |
| 1763 | 1791 | |
| 1764 | | char c; |
| 1765 | 1792 | while (readLine() && line >> c && c != '@') { |
| 1766 | 1793 | line.putback(c); |
| 1767 | 1794 | |
| … |
… |
|
| 1779 | 1806 | Node n; |
| 1780 | 1807 | if (!_use_nodes) { |
| 1781 | 1808 | n = _graph.addNode(); |
| 1782 | | _node_index.insert(std::make_pair(tokens[label_index], n)); |
| | 1809 | if (label_index != -1) |
| | 1810 | _node_index.insert(std::make_pair(tokens[label_index], n)); |
| 1783 | 1811 | } else { |
| | 1812 | if (label_index == -1) |
| | 1813 | throw DataFormatError("Label map not found in file"); |
| 1784 | 1814 | typename std::map<std::string, Node>::iterator it = |
| 1785 | 1815 | _node_index.find(tokens[label_index]); |
| 1786 | 1816 | if (it == _node_index.end()) { |
| … |
… |
|
| 1806 | 1836 | std::vector<int> map_index(_edge_maps.size()); |
| 1807 | 1837 | int map_num, label_index; |
| 1808 | 1838 | |
| 1809 | | if (!readLine()) |
| 1810 | | throw DataFormatError("Cannot find map captions"); |
| | 1839 | char c; |
| | 1840 | if (!readLine() || !(line >> c) || c == '@') { |
| | 1841 | if (readSuccess() && line) line.putback(c); |
| | 1842 | if (!_edge_maps.empty()) |
| | 1843 | throw DataFormatError("Cannot find map names"); |
| | 1844 | return; |
| | 1845 | } |
| | 1846 | line.putback(c); |
| 1811 | 1847 | |
| 1812 | 1848 | { |
| 1813 | 1849 | std::map<std::string, int> maps; |
| … |
… |
|
| 1837 | 1873 | |
| 1838 | 1874 | { |
| 1839 | 1875 | std::map<std::string, int>::iterator jt = maps.find("label"); |
| 1840 | | if (jt == maps.end()) |
| 1841 | | throw DataFormatError("Label map not found in file"); |
| 1842 | | label_index = jt->second; |
| | 1876 | if (jt != maps.end()) { |
| | 1877 | label_index = jt->second; |
| | 1878 | } else { |
| | 1879 | label_index = -1; |
| | 1880 | } |
| 1843 | 1881 | } |
| 1844 | 1882 | map_num = maps.size(); |
| 1845 | 1883 | } |
| 1846 | 1884 | |
| 1847 | | char c; |
| 1848 | 1885 | while (readLine() && line >> c && c != '@') { |
| 1849 | 1886 | line.putback(c); |
| 1850 | 1887 | |
| … |
… |
|
| 1852 | 1889 | std::string target_token; |
| 1853 | 1890 | |
| 1854 | 1891 | if (!_reader_bits::readToken(line, source_token)) |
| 1855 | | throw DataFormatError("Source not found"); |
| | 1892 | throw DataFormatError("Node u not found"); |
| 1856 | 1893 | |
| 1857 | 1894 | if (!_reader_bits::readToken(line, target_token)) |
| 1858 | | throw DataFormatError("Source not found"); |
| | 1895 | throw DataFormatError("Node v not found"); |
| 1859 | 1896 | |
| 1860 | 1897 | std::vector<std::string> tokens(map_num); |
| 1861 | 1898 | for (int i = 0; i < map_num; ++i) { |
| … |
… |
|
| 1890 | 1927 | Node target = it->second; |
| 1891 | 1928 | |
| 1892 | 1929 | e = _graph.addEdge(source, target); |
| 1893 | | _edge_index.insert(std::make_pair(tokens[label_index], e)); |
| | 1930 | if (label_index != -1) |
| | 1931 | _edge_index.insert(std::make_pair(tokens[label_index], e)); |
| 1894 | 1932 | } else { |
| | 1933 | if (label_index == -1) |
| | 1934 | throw DataFormatError("Label map not found in file"); |
| 1895 | 1935 | typename std::map<std::string, Edge>::iterator it = |
| 1896 | 1936 | _edge_index.find(tokens[label_index]); |
| 1897 | 1937 | if (it == _edge_index.end()) { |
| … |
… |
|
| 2325 | 2365 | } |
| 2326 | 2366 | |
| 2327 | 2367 | void readMaps(std::vector<std::string>& maps) { |
| 2328 | | if (!readLine()) |
| 2329 | | throw DataFormatError("Cannot find map captions"); |
| | 2368 | char c; |
| | 2369 | if (!readLine() || !(line >> c) || c == '@') { |
| | 2370 | if (readSuccess() && line) line.putback(c); |
| | 2371 | return; |
| | 2372 | } |
| | 2373 | line.putback(c); |
| 2330 | 2374 | std::string map; |
| 2331 | 2375 | while (_reader_bits::readToken(line, map)) { |
| 2332 | 2376 | maps.push_back(map); |