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 69 insertions and 25 deletions:
↑ Collapse diff ↑
Show white space 12 line context
... ...
@@ -878,14 +878,20 @@
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");
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);
886 892
      
887 893
      {
888 894
	std::map<std::string, int> maps;
889 895
	
890 896
	std::string map;
891 897
	int index = 0;
... ...
@@ -909,20 +915,21 @@
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");
921
	  if (jt != maps.end()) {
917 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])) {
... ...
@@ -934,14 +941,17 @@
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();
947
	  if (label_index != -1)
940 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());	    
... ...
@@ -961,14 +971,20 @@
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;
... ...
@@ -992,31 +1008,32 @@
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");
1014
	  if (jt != maps.end()) {
1000 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 << ")";
... ...
@@ -1045,14 +1062,17 @@
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);
1068
	  if (label_index != -1) 
1051 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());	    
... ...
@@ -1720,14 +1740,20 @@
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;
... ...
@@ -1751,20 +1777,21 @@
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");
1783
	  if (jt != maps.end()) {
1759 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])) {
... ...
@@ -1776,14 +1803,17 @@
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();
1809
	  if (label_index != -1) 
1782 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());	    
... ...
@@ -1803,14 +1833,20 @@
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;
... ...
@@ -1834,31 +1870,32 @@
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");
1876
	  if (jt != maps.end()) {
1842 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 << ")";
... ...
@@ -1887,14 +1924,17 @@
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);
1930
	  if (label_index != -1) 
1893 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());	    
... ...
@@ -2322,14 +2362,18 @@
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

	
0 comments (0 inline)