Changeset 1198:4936be66d2f5 in lemon for lemon/lgf_writer.h
- Timestamp:
- 02/12/13 07:15:52 (11 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/lgf_writer.h
r1194 r1198 186 186 ValueStorage(const Value& value, const Converter& converter = Converter()) 187 187 : _value(value), _converter(converter) {} 188 188 189 189 virtual std::string get() { 190 190 return _converter(_value); … … 192 192 }; 193 193 194 template <typename Value> 194 template <typename Value, 195 typename Map = std::map<Value, std::string> > 195 196 struct MapLookUpConverter { 196 const std::map<Value, std::string>& _map;197 198 MapLookUpConverter(const std::map<Value, std::string>& map)197 const Map& _map; 198 199 MapLookUpConverter(const Map& map) 199 200 : _map(map) {} 200 201 201 std::string operator()(const Value& str) { 202 typename std::map<Value, std::string>::const_iterator it = 203 _map.find(str); 202 std::string operator()(const Value& value) { 203 typename Map::const_iterator it = _map.find(value); 204 204 if (it == _map.end()) { 205 205 throw FormatError("Item not found"); 206 206 } 207 207 return it->second; 208 } 209 }; 210 211 template <typename Value, 212 typename Map1 = std::map<Value, std::string>, 213 typename Map2 = std::map<Value, std::string> > 214 struct DoubleMapLookUpConverter { 215 const Map1& _map1; 216 const Map2& _map2; 217 218 DoubleMapLookUpConverter(const Map1& map1, const Map2& map2) 219 : _map1(map1), _map2(map2) {} 220 221 std::string operator()(const Value& value) { 222 typename Map1::const_iterator it1 = _map1.find(value); 223 typename Map1::const_iterator it2 = _map2.find(value); 224 if (it1 == _map1.end()) { 225 if (it2 == _map2.end()) { 226 throw FormatError("Item not found"); 227 } else { 228 return it2->second; 229 } 230 } else { 231 if (it2 == _map2.end()) { 232 return it1->second; 233 } else { 234 throw FormatError("Item is ambigous"); 235 } 236 } 208 237 } 209 238 }; … … 1652 1681 std::string _attributes_caption; 1653 1682 1654 typedef std::map<Node, std::string> NodeIndex; 1655 NodeIndex _node_index; 1683 typedef std::map<Node, std::string> RedNodeIndex; 1684 RedNodeIndex _red_node_index; 1685 typedef std::map<Node, std::string> BlueNodeIndex; 1686 BlueNodeIndex _blue_node_index; 1656 1687 typedef std::map<Edge, std::string> EdgeIndex; 1657 1688 EdgeIndex _edge_index; 1658 1689 1659 1690 typedef std::vector<std::pair<std::string, 1660 _writer_bits::MapStorageBase<Node>* > > NodeMaps; 1661 NodeMaps _red_maps; 1662 NodeMaps _blue_maps; 1691 _writer_bits::MapStorageBase<RedNode>* > > RedNodeMaps; 1692 RedNodeMaps _red_node_maps; 1693 typedef std::vector<std::pair<std::string, 1694 _writer_bits::MapStorageBase<BlueNode>* > > BlueNodeMaps; 1695 BlueNodeMaps _blue_node_maps; 1663 1696 1664 1697 typedef std::vector<std::pair<std::string, … … 1711 1744 /// \brief Destructor 1712 1745 ~BpGraphWriter() { 1713 for (typename NodeMaps::iterator it = _red_maps.begin();1714 it != _red_ maps.end(); ++it) {1746 for (typename RedNodeMaps::iterator it = _red_node_maps.begin(); 1747 it != _red_node_maps.end(); ++it) { 1715 1748 delete it->second; 1716 1749 } 1717 1750 1718 for (typename NodeMaps::iterator it = _blue_maps.begin();1719 it != _blue_ maps.end(); ++it) {1751 for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin(); 1752 it != _blue_node_maps.end(); ++it) { 1720 1753 delete it->second; 1721 1754 } … … 1754 1787 other.local_os = false; 1755 1788 1756 _node_index.swap(other._node_index); 1789 _red_node_index.swap(other._red_node_index); 1790 _blue_node_index.swap(other._blue_node_index); 1757 1791 _edge_index.swap(other._edge_index); 1758 1792 1759 _red_ maps.swap(other._red_maps);1760 _blue_ maps.swap(other._blue_maps);1793 _red_node_maps.swap(other._red_node_maps); 1794 _blue_node_maps.swap(other._blue_node_maps); 1761 1795 _edge_maps.swap(other._edge_maps); 1762 1796 _attributes.swap(other._attributes); … … 1780 1814 BpGraphWriter& nodeMap(const std::string& caption, const Map& map) { 1781 1815 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); 1782 _writer_bits::MapStorageBase< Node>* red_storage =1783 new _writer_bits::MapStorage< Node, Map>(map);1784 _red_ maps.push_back(std::make_pair(caption, red_storage));1785 _writer_bits::MapStorageBase< Node>* blue_storage =1786 new _writer_bits::MapStorage< Node, Map>(map);1787 _blue_ maps.push_back(std::make_pair(caption, blue_storage));1816 _writer_bits::MapStorageBase<RedNode>* red_storage = 1817 new _writer_bits::MapStorage<RedNode, Map>(map); 1818 _red_node_maps.push_back(std::make_pair(caption, red_storage)); 1819 _writer_bits::MapStorageBase<BlueNode>* blue_storage = 1820 new _writer_bits::MapStorage<BlueNode, Map>(map); 1821 _blue_node_maps.push_back(std::make_pair(caption, blue_storage)); 1788 1822 return *this; 1789 1823 } … … 1797 1831 const Converter& converter = Converter()) { 1798 1832 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); 1799 _writer_bits::MapStorageBase< Node>* red_storage =1800 new _writer_bits::MapStorage< Node, Map, Converter>(map, converter);1801 _red_ maps.push_back(std::make_pair(caption, red_storage));1802 _writer_bits::MapStorageBase< Node>* blue_storage =1803 new _writer_bits::MapStorage< Node, Map, Converter>(map, converter);1804 _blue_ maps.push_back(std::make_pair(caption, blue_storage));1833 _writer_bits::MapStorageBase<RedNode>* red_storage = 1834 new _writer_bits::MapStorage<RedNode, Map, Converter>(map, converter); 1835 _red_node_maps.push_back(std::make_pair(caption, red_storage)); 1836 _writer_bits::MapStorageBase<BlueNode>* blue_storage = 1837 new _writer_bits::MapStorage<BlueNode, Map, Converter>(map, converter); 1838 _blue_node_maps.push_back(std::make_pair(caption, blue_storage)); 1805 1839 return *this; 1806 1840 } … … 1811 1845 template <typename Map> 1812 1846 BpGraphWriter& redNodeMap(const std::string& caption, const Map& map) { 1813 checkConcept<concepts::ReadMap< Node, typename Map::Value>, Map>();1814 _writer_bits::MapStorageBase< Node>* storage =1815 new _writer_bits::MapStorage< Node, Map>(map);1816 _red_ maps.push_back(std::make_pair(caption, storage));1847 checkConcept<concepts::ReadMap<RedNode, typename Map::Value>, Map>(); 1848 _writer_bits::MapStorageBase<RedNode>* storage = 1849 new _writer_bits::MapStorage<RedNode, Map>(map); 1850 _red_node_maps.push_back(std::make_pair(caption, storage)); 1817 1851 return *this; 1818 1852 } … … 1825 1859 BpGraphWriter& redNodeMap(const std::string& caption, const Map& map, 1826 1860 const Converter& converter = Converter()) { 1827 checkConcept<concepts::ReadMap< Node, typename Map::Value>, Map>();1828 _writer_bits::MapStorageBase< Node>* storage =1829 new _writer_bits::MapStorage< Node, Map, Converter>(map, converter);1830 _red_ maps.push_back(std::make_pair(caption, storage));1861 checkConcept<concepts::ReadMap<RedNode, typename Map::Value>, Map>(); 1862 _writer_bits::MapStorageBase<RedNode>* storage = 1863 new _writer_bits::MapStorage<RedNode, Map, Converter>(map, converter); 1864 _red_node_maps.push_back(std::make_pair(caption, storage)); 1831 1865 return *this; 1832 1866 } … … 1837 1871 template <typename Map> 1838 1872 BpGraphWriter& blueNodeMap(const std::string& caption, const Map& map) { 1839 checkConcept<concepts::ReadMap< Node, typename Map::Value>, Map>();1840 _writer_bits::MapStorageBase< Node>* storage =1841 new _writer_bits::MapStorage< Node, Map>(map);1842 _blue_ maps.push_back(std::make_pair(caption, storage));1873 checkConcept<concepts::ReadMap<BlueNode, typename Map::Value>, Map>(); 1874 _writer_bits::MapStorageBase<BlueNode>* storage = 1875 new _writer_bits::MapStorage<BlueNode, Map>(map); 1876 _blue_node_maps.push_back(std::make_pair(caption, storage)); 1843 1877 return *this; 1844 1878 } … … 1851 1885 BpGraphWriter& blueNodeMap(const std::string& caption, const Map& map, 1852 1886 const Converter& converter = Converter()) { 1853 checkConcept<concepts::ReadMap< Node, typename Map::Value>, Map>();1854 _writer_bits::MapStorageBase< Node>* storage =1855 new _writer_bits::MapStorage< Node, Map, Converter>(map, converter);1856 _blue_ maps.push_back(std::make_pair(caption, storage));1887 checkConcept<concepts::ReadMap<BlueNode, typename Map::Value>, Map>(); 1888 _writer_bits::MapStorageBase<BlueNode>* storage = 1889 new _writer_bits::MapStorage<BlueNode, Map, Converter>(map, converter); 1890 _blue_node_maps.push_back(std::make_pair(caption, storage)); 1857 1891 return *this; 1858 1892 } … … 1946 1980 /// Add a node writing rule to the writer. 1947 1981 BpGraphWriter& node(const std::string& caption, const Node& node) { 1982 typedef _writer_bits::DoubleMapLookUpConverter< 1983 Node, RedNodeIndex, BlueNodeIndex> Converter; 1984 Converter converter(_red_node_index, _blue_node_index); 1985 _writer_bits::ValueStorageBase* storage = 1986 new _writer_bits::ValueStorage<Node, Converter>(node, converter); 1987 _attributes.push_back(std::make_pair(caption, storage)); 1988 return *this; 1989 } 1990 1991 /// \brief Red node writing rule 1992 /// 1993 /// Add a red node writing rule to the writer. 1994 BpGraphWriter& redNode(const std::string& caption, const RedNode& node) { 1948 1995 typedef _writer_bits::MapLookUpConverter<Node> Converter; 1949 Converter converter(_node_index); 1996 Converter converter(_red_node_index); 1997 _writer_bits::ValueStorageBase* storage = 1998 new _writer_bits::ValueStorage<Node, Converter>(node, converter); 1999 _attributes.push_back(std::make_pair(caption, storage)); 2000 return *this; 2001 } 2002 2003 /// \brief Blue node writing rule 2004 /// 2005 /// Add a blue node writing rule to the writer. 2006 BpGraphWriter& blueNode(const std::string& caption, const BlueNode& node) { 2007 typedef _writer_bits::MapLookUpConverter<Node> Converter; 2008 Converter converter(_blue_node_index); 1950 2009 _writer_bits::ValueStorageBase* storage = 1951 2010 new _writer_bits::ValueStorage<Node, Converter>(node, converter); … … 2034 2093 2035 2094 void writeRedNodes() { 2036 _writer_bits::MapStorageBase< Node>* label = 0;2037 for (typename NodeMaps::iterator it = _red_maps.begin();2038 it != _red_ maps.end(); ++it) {2095 _writer_bits::MapStorageBase<RedNode>* label = 0; 2096 for (typename RedNodeMaps::iterator it = _red_node_maps.begin(); 2097 it != _red_node_maps.end(); ++it) { 2039 2098 if (it->first == "label") { 2040 2099 label = it->second; … … 2052 2111 *_os << "label" << '\t'; 2053 2112 } 2054 for (typename NodeMaps::iterator it = _red_maps.begin();2055 it != _red_ maps.end(); ++it) {2113 for (typename RedNodeMaps::iterator it = _red_node_maps.begin(); 2114 it != _red_node_maps.end(); ++it) { 2056 2115 _writer_bits::writeToken(*_os, it->first) << '\t'; 2057 2116 } 2058 2117 *_os << std::endl; 2059 2118 2060 std::vector< Node> nodes;2119 std::vector<RedNode> nodes; 2061 2120 for (RedNodeIt n(_graph); n != INVALID; ++n) { 2062 2121 nodes.push_back(n); … … 2072 2131 2073 2132 for (int i = 0; i < static_cast<int>(nodes.size()); ++i) { 2074 Node n = nodes[i];2133 RedNode n = nodes[i]; 2075 2134 if (label == 0) { 2076 2135 std::ostringstream os; 2077 os << _graph.id( n);2136 os << _graph.id(static_cast<Node>(n)); 2078 2137 _writer_bits::writeToken(*_os, os.str()); 2079 2138 *_os << '\t'; 2080 _ node_index.insert(std::make_pair(n, os.str()));2081 } 2082 for (typename NodeMaps::iterator it = _red_maps.begin();2083 it != _red_ maps.end(); ++it) {2139 _red_node_index.insert(std::make_pair(n, os.str())); 2140 } 2141 for (typename RedNodeMaps::iterator it = _red_node_maps.begin(); 2142 it != _red_node_maps.end(); ++it) { 2084 2143 std::string value = it->second->get(n); 2085 2144 _writer_bits::writeToken(*_os, value); 2086 2145 if (it->first == "label") { 2087 _ node_index.insert(std::make_pair(n, value));2146 _red_node_index.insert(std::make_pair(n, value)); 2088 2147 } 2089 2148 *_os << '\t'; … … 2094 2153 2095 2154 void writeBlueNodes() { 2096 _writer_bits::MapStorageBase< Node>* label = 0;2097 for (typename NodeMaps::iterator it = _blue_maps.begin();2098 it != _blue_ maps.end(); ++it) {2155 _writer_bits::MapStorageBase<BlueNode>* label = 0; 2156 for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin(); 2157 it != _blue_node_maps.end(); ++it) { 2099 2158 if (it->first == "label") { 2100 2159 label = it->second; … … 2112 2171 *_os << "label" << '\t'; 2113 2172 } 2114 for (typename NodeMaps::iterator it = _blue_maps.begin();2115 it != _blue_ maps.end(); ++it) {2173 for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin(); 2174 it != _blue_node_maps.end(); ++it) { 2116 2175 _writer_bits::writeToken(*_os, it->first) << '\t'; 2117 2176 } 2118 2177 *_os << std::endl; 2119 2178 2120 std::vector< Node> nodes;2179 std::vector<BlueNode> nodes; 2121 2180 for (BlueNodeIt n(_graph); n != INVALID; ++n) { 2122 2181 nodes.push_back(n); … … 2132 2191 2133 2192 for (int i = 0; i < static_cast<int>(nodes.size()); ++i) { 2134 Node n = nodes[i];2193 BlueNode n = nodes[i]; 2135 2194 if (label == 0) { 2136 2195 std::ostringstream os; 2137 os << _graph.id( n);2196 os << _graph.id(static_cast<Node>(n)); 2138 2197 _writer_bits::writeToken(*_os, os.str()); 2139 2198 *_os << '\t'; 2140 _ node_index.insert(std::make_pair(n, os.str()));2141 } 2142 for (typename NodeMaps::iterator it = _blue_maps.begin();2143 it != _blue_ maps.end(); ++it) {2199 _blue_node_index.insert(std::make_pair(n, os.str())); 2200 } 2201 for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin(); 2202 it != _blue_node_maps.end(); ++it) { 2144 2203 std::string value = it->second->get(n); 2145 2204 _writer_bits::writeToken(*_os, value); 2146 2205 if (it->first == "label") { 2147 _ node_index.insert(std::make_pair(n, value));2206 _blue_node_index.insert(std::make_pair(n, value)); 2148 2207 } 2149 2208 *_os << '\t'; … … 2154 2213 2155 2214 void createRedNodeIndex() { 2156 _writer_bits::MapStorageBase< Node>* label = 0;2157 for (typename NodeMaps::iterator it = _red_maps.begin();2158 it != _red_ maps.end(); ++it) {2215 _writer_bits::MapStorageBase<RedNode>* label = 0; 2216 for (typename RedNodeMaps::iterator it = _red_node_maps.begin(); 2217 it != _red_node_maps.end(); ++it) { 2159 2218 if (it->first == "label") { 2160 2219 label = it->second; … … 2164 2223 2165 2224 if (label == 0) { 2166 for ( NodeIt n(_graph); n != INVALID; ++n) {2225 for (RedNodeIt n(_graph); n != INVALID; ++n) { 2167 2226 std::ostringstream os; 2168 2227 os << _graph.id(n); 2169 _ node_index.insert(std::make_pair(n, os.str()));2228 _red_node_index.insert(std::make_pair(n, os.str())); 2170 2229 } 2171 2230 } else { 2172 for ( NodeIt n(_graph); n != INVALID; ++n) {2231 for (RedNodeIt n(_graph); n != INVALID; ++n) { 2173 2232 std::string value = label->get(n); 2174 _ node_index.insert(std::make_pair(n, value));2233 _red_node_index.insert(std::make_pair(n, value)); 2175 2234 } 2176 2235 } … … 2178 2237 2179 2238 void createBlueNodeIndex() { 2180 _writer_bits::MapStorageBase< Node>* label = 0;2181 for (typename NodeMaps::iterator it = _blue_maps.begin();2182 it != _blue_ maps.end(); ++it) {2239 _writer_bits::MapStorageBase<BlueNode>* label = 0; 2240 for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin(); 2241 it != _blue_node_maps.end(); ++it) { 2183 2242 if (it->first == "label") { 2184 2243 label = it->second; … … 2188 2247 2189 2248 if (label == 0) { 2190 for ( NodeIt n(_graph); n != INVALID; ++n) {2249 for (BlueNodeIt n(_graph); n != INVALID; ++n) { 2191 2250 std::ostringstream os; 2192 2251 os << _graph.id(n); 2193 _ node_index.insert(std::make_pair(n, os.str()));2252 _blue_node_index.insert(std::make_pair(n, os.str())); 2194 2253 } 2195 2254 } else { 2196 for ( NodeIt n(_graph); n != INVALID; ++n) {2255 for (BlueNodeIt n(_graph); n != INVALID; ++n) { 2197 2256 std::string value = label->get(n); 2198 _ node_index.insert(std::make_pair(n, value));2257 _blue_node_index.insert(std::make_pair(n, value)); 2199 2258 } 2200 2259 } … … 2242 2301 for (int i = 0; i < static_cast<int>(edges.size()); ++i) { 2243 2302 Edge e = edges[i]; 2244 _writer_bits::writeToken(*_os, _ node_index.2303 _writer_bits::writeToken(*_os, _red_node_index. 2245 2304 find(_graph.redNode(e))->second); 2246 2305 *_os << '\t'; 2247 _writer_bits::writeToken(*_os, _ node_index.2306 _writer_bits::writeToken(*_os, _blue_node_index. 2248 2307 find(_graph.blueNode(e))->second); 2249 2308 *_os << '\t';
Note: See TracChangeset
for help on using the changeset viewer.