gravatar
deba@inf.elte.hu
deba@inf.elte.hu
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
0 1 0
default
1 file changed with 78 insertions and 34 deletions:
↑ Collapse diff ↑
Ignore white space 24 line context
... ...
@@ -872,27 +872,33 @@
872 872
      char c;
873 873
      while (readSuccess() && line >> c && c != '@') {
874 874
	readLine();
875 875
      }
876 876
      line.putback(c);
877 877
    }
878 878

	
879 879
    void readNodes() {
880 880

	
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
	
890 896
	std::string map;
891 897
	int index = 0;
892 898
	while (_reader_bits::readToken(line, map)) {
893 899
	  if (maps.find(map) != maps.end()) {
894 900
	    std::ostringstream msg;
895 901
	    msg << "Multiple occurence of node map: " << map;
896 902
	    throw DataFormatError(msg.str().c_str());
897 903
	  }
898 904
	  maps.insert(std::make_pair(map, index));
... ...
@@ -903,51 +909,55 @@
903 909
	  std::map<std::string, int>::iterator jt = 
904 910
	    maps.find(_node_maps[i].first);
905 911
	  if (jt == maps.end()) {
906 912
	    std::ostringstream msg;
907 913
	    msg << "Map not found in file: " << _node_maps[i].first;
908 914
	    throw DataFormatError(msg.str().c_str());
909 915
	  }
910 916
	  map_index[i] = jt->second;
911 917
	}
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

	
926 933
	std::vector<std::string> tokens(map_num);
927 934
	for (int i = 0; i < map_num; ++i) {
928 935
	  if (!_reader_bits::readToken(line, tokens[i])) {
929 936
	    std::ostringstream msg;
930 937
	    msg << "Column not found (" << i + 1 << ")";
931 938
	    throw DataFormatError(msg.str().c_str());
932 939
	  }
933 940
	}
934 941
	if (line >> std::ws >> c)
935 942
	  throw DataFormatError("Extra character on the end of line");
936 943
	
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()) {
945 955
	    std::ostringstream msg;
946 956
	    msg << "Node with label not found: " << tokens[label_index];
947 957
	    throw DataFormatError(msg.str().c_str());	    
948 958
	  }
949 959
	  n = it->second;
950 960
	}
951 961

	
952 962
	for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
953 963
	  _node_maps[i].second->set(n, tokens[map_index[i]]);
... ...
@@ -955,26 +965,32 @@
955 965

	
956 966
      }
957 967
      if (readSuccess()) {
958 968
	line.putback(c);
959 969
      }
960 970
    }
961 971

	
962 972
    void readArcs() {
963 973

	
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;
972 988
	
973 989
	std::string map;
974 990
	int index = 0;
975 991
	while (_reader_bits::readToken(line, map)) {
976 992
	  if (maps.find(map) != maps.end()) {
977 993
	    std::ostringstream msg;
978 994
	    msg << "Multiple occurence of arc map: " << map;
979 995
	    throw DataFormatError(msg.str().c_str());
980 996
	  }
... ...
@@ -986,43 +1002,44 @@
986 1002
	  std::map<std::string, int>::iterator jt = 
987 1003
	    maps.find(_arc_maps[i].first);
988 1004
	  if (jt == maps.end()) {
989 1005
	    std::ostringstream msg;
990 1006
	    msg << "Map not found in file: " << _arc_maps[i].first;
991 1007
	    throw DataFormatError(msg.str().c_str());
992 1008
	  }
993 1009
	  map_index[i] = jt->second;
994 1010
	}
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

	
1009 1026
	std::string source_token;
1010 1027
	std::string target_token;
1011 1028

	
1012 1029
	if (!_reader_bits::readToken(line, source_token))
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) {
1020 1037
	  if (!_reader_bits::readToken(line, tokens[i])) {
1021 1038
	    std::ostringstream msg;
1022 1039
	    msg << "Column not found (" << i + 1 << ")";
1023 1040
	    throw DataFormatError(msg.str().c_str());
1024 1041
	  }
1025 1042
	}
1026 1043
	if (line >> std::ws >> c)
1027 1044
	  throw DataFormatError("Extra character on the end of line");
1028 1045
	
... ...
@@ -1039,26 +1056,29 @@
1039 1056
          }
1040 1057
          Node source = it->second;
1041 1058

	
1042 1059
          it = _node_index.find(target_token);
1043 1060
          if (it == _node_index.end()) {       
1044 1061
            std::ostringstream msg;            
1045 1062
            msg << "Item not found: " << target_token;
1046 1063
            throw DataFormatError(msg.str().c_str());
1047 1064
          }                                          
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()) {
1056 1076
	    std::ostringstream msg;
1057 1077
	    msg << "Arc with label not found: " << tokens[label_index];
1058 1078
	    throw DataFormatError(msg.str().c_str());	    
1059 1079
	  }
1060 1080
	  a = it->second;
1061 1081
	}
1062 1082

	
1063 1083
	for (int i = 0; i < static_cast<int>(_arc_maps.size()); ++i) {
1064 1084
	  _arc_maps[i].second->set(a, tokens[map_index[i]]);
... ...
@@ -1714,26 +1734,32 @@
1714 1734
      char c;
1715 1735
      while (readSuccess() && line >> c && c != '@') {
1716 1736
	readLine();
1717 1737
      }
1718 1738
      line.putback(c);
1719 1739
    }
1720 1740

	
1721 1741
    void readNodes() {
1722 1742

	
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;
1731 1757
	
1732 1758
	std::string map;
1733 1759
	int index = 0;
1734 1760
	while (_reader_bits::readToken(line, map)) {
1735 1761
	  if (maps.find(map) != maps.end()) {
1736 1762
	    std::ostringstream msg;
1737 1763
	    msg << "Multiple occurence of node map: " << map;
1738 1764
	    throw DataFormatError(msg.str().c_str());
1739 1765
	  }
... ...
@@ -1745,51 +1771,55 @@
1745 1771
	  std::map<std::string, int>::iterator jt = 
1746 1772
	    maps.find(_node_maps[i].first);
1747 1773
	  if (jt == maps.end()) {
1748 1774
	    std::ostringstream msg;
1749 1775
	    msg << "Map not found in file: " << _node_maps[i].first;
1750 1776
	    throw DataFormatError(msg.str().c_str());
1751 1777
	  }
1752 1778
	  map_index[i] = jt->second;
1753 1779
	}
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

	
1768 1795
	std::vector<std::string> tokens(map_num);
1769 1796
	for (int i = 0; i < map_num; ++i) {
1770 1797
	  if (!_reader_bits::readToken(line, tokens[i])) {
1771 1798
	    std::ostringstream msg;
1772 1799
	    msg << "Column not found (" << i + 1 << ")";
1773 1800
	    throw DataFormatError(msg.str().c_str());
1774 1801
	  }
1775 1802
	}
1776 1803
	if (line >> std::ws >> c)
1777 1804
	  throw DataFormatError("Extra character on the end of line");
1778 1805
	
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()) {
1787 1817
	    std::ostringstream msg;
1788 1818
	    msg << "Node with label not found: " << tokens[label_index];
1789 1819
	    throw DataFormatError(msg.str().c_str());	    
1790 1820
	  }
1791 1821
	  n = it->second;
1792 1822
	}
1793 1823

	
1794 1824
	for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
1795 1825
	  _node_maps[i].second->set(n, tokens[map_index[i]]);
... ...
@@ -1797,26 +1827,32 @@
1797 1827

	
1798 1828
      }
1799 1829
      if (readSuccess()) {
1800 1830
	line.putback(c);
1801 1831
      }
1802 1832
    }
1803 1833

	
1804 1834
    void readEdges() {
1805 1835

	
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;
1814 1850
	
1815 1851
	std::string map;
1816 1852
	int index = 0;
1817 1853
	while (_reader_bits::readToken(line, map)) {
1818 1854
	  if (maps.find(map) != maps.end()) {
1819 1855
	    std::ostringstream msg;
1820 1856
	    msg << "Multiple occurence of edge map: " << map;
1821 1857
	    throw DataFormatError(msg.str().c_str());
1822 1858
	  }
... ...
@@ -1828,43 +1864,44 @@
1828 1864
	  std::map<std::string, int>::iterator jt = 
1829 1865
	    maps.find(_edge_maps[i].first);
1830 1866
	  if (jt == maps.end()) {
1831 1867
	    std::ostringstream msg;
1832 1868
	    msg << "Map not found in file: " << _edge_maps[i].first;
1833 1869
	    throw DataFormatError(msg.str().c_str());
1834 1870
	  }
1835 1871
	  map_index[i] = jt->second;
1836 1872
	}
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

	
1851 1888
	std::string source_token;
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) {
1862 1899
	  if (!_reader_bits::readToken(line, tokens[i])) {
1863 1900
	    std::ostringstream msg;
1864 1901
	    msg << "Column not found (" << i + 1 << ")";
1865 1902
	    throw DataFormatError(msg.str().c_str());
1866 1903
	  }
1867 1904
	}
1868 1905
	if (line >> std::ws >> c)
1869 1906
	  throw DataFormatError("Extra character on the end of line");
1870 1907
	
... ...
@@ -1881,26 +1918,29 @@
1881 1918
          }
1882 1919
          Node source = it->second;
1883 1920

	
1884 1921
          it = _node_index.find(target_token);
1885 1922
          if (it == _node_index.end()) {       
1886 1923
            std::ostringstream msg;            
1887 1924
            msg << "Item not found: " << target_token;
1888 1925
            throw DataFormatError(msg.str().c_str());
1889 1926
          }                                          
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()) {
1898 1938
	    std::ostringstream msg;
1899 1939
	    msg << "Edge with label not found: " << tokens[label_index];
1900 1940
	    throw DataFormatError(msg.str().c_str());	    
1901 1941
	  }
1902 1942
	  e = it->second;
1903 1943
	}
1904 1944

	
1905 1945
	for (int i = 0; i < static_cast<int>(_edge_maps.size()); ++i) {
1906 1946
	  _edge_maps[i].second->set(e, tokens[map_index[i]]);
... ...
@@ -2316,26 +2356,30 @@
2316 2356
      return static_cast<bool>(*_is);
2317 2357
    }
2318 2358

	
2319 2359
    void skipSection() {
2320 2360
      char c;
2321 2361
      while (readSuccess() && line >> c && c != '@') {
2322 2362
	readLine();
2323 2363
      }
2324 2364
      line.putback(c);
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);
2333 2377
      }
2334 2378
    }
2335 2379

	
2336 2380
    void readAttributes(std::vector<std::string>& attrs) {
2337 2381
      readLine();
2338 2382
      char c;
2339 2383
      while (readSuccess() && line >> c && c != '@') {
2340 2384
	line.putback(c);
2341 2385
	std::string attr;
0 comments (0 inline)