1.1 --- a/lemon/lgf_writer.h Sun Feb 05 00:04:44 2012 +0100
1.2 +++ b/lemon/lgf_writer.h Tue Feb 12 07:15:52 2013 +0100
1.3 @@ -185,22 +185,22 @@
1.4 public:
1.5 ValueStorage(const Value& value, const Converter& converter = Converter())
1.6 : _value(value), _converter(converter) {}
1.7 -
1.8 +
1.9 virtual std::string get() {
1.10 return _converter(_value);
1.11 }
1.12 };
1.13
1.14 - template <typename Value>
1.15 + template <typename Value,
1.16 + typename Map = std::map<Value, std::string> >
1.17 struct MapLookUpConverter {
1.18 - const std::map<Value, std::string>& _map;
1.19 + const Map& _map;
1.20
1.21 - MapLookUpConverter(const std::map<Value, std::string>& map)
1.22 + MapLookUpConverter(const Map& map)
1.23 : _map(map) {}
1.24
1.25 - std::string operator()(const Value& str) {
1.26 - typename std::map<Value, std::string>::const_iterator it =
1.27 - _map.find(str);
1.28 + std::string operator()(const Value& value) {
1.29 + typename Map::const_iterator it = _map.find(value);
1.30 if (it == _map.end()) {
1.31 throw FormatError("Item not found");
1.32 }
1.33 @@ -208,6 +208,35 @@
1.34 }
1.35 };
1.36
1.37 + template <typename Value,
1.38 + typename Map1 = std::map<Value, std::string>,
1.39 + typename Map2 = std::map<Value, std::string> >
1.40 + struct DoubleMapLookUpConverter {
1.41 + const Map1& _map1;
1.42 + const Map2& _map2;
1.43 +
1.44 + DoubleMapLookUpConverter(const Map1& map1, const Map2& map2)
1.45 + : _map1(map1), _map2(map2) {}
1.46 +
1.47 + std::string operator()(const Value& value) {
1.48 + typename Map1::const_iterator it1 = _map1.find(value);
1.49 + typename Map1::const_iterator it2 = _map2.find(value);
1.50 + if (it1 == _map1.end()) {
1.51 + if (it2 == _map2.end()) {
1.52 + throw FormatError("Item not found");
1.53 + } else {
1.54 + return it2->second;
1.55 + }
1.56 + } else {
1.57 + if (it2 == _map2.end()) {
1.58 + return it1->second;
1.59 + } else {
1.60 + throw FormatError("Item is ambigous");
1.61 + }
1.62 + }
1.63 + }
1.64 + };
1.65 +
1.66 template <typename Graph>
1.67 struct GraphArcLookUpConverter {
1.68 const Graph& _graph;
1.69 @@ -1651,15 +1680,19 @@
1.70 std::string _edges_caption;
1.71 std::string _attributes_caption;
1.72
1.73 - typedef std::map<Node, std::string> NodeIndex;
1.74 - NodeIndex _node_index;
1.75 + typedef std::map<Node, std::string> RedNodeIndex;
1.76 + RedNodeIndex _red_node_index;
1.77 + typedef std::map<Node, std::string> BlueNodeIndex;
1.78 + BlueNodeIndex _blue_node_index;
1.79 typedef std::map<Edge, std::string> EdgeIndex;
1.80 EdgeIndex _edge_index;
1.81
1.82 typedef std::vector<std::pair<std::string,
1.83 - _writer_bits::MapStorageBase<Node>* > > NodeMaps;
1.84 - NodeMaps _red_maps;
1.85 - NodeMaps _blue_maps;
1.86 + _writer_bits::MapStorageBase<RedNode>* > > RedNodeMaps;
1.87 + RedNodeMaps _red_node_maps;
1.88 + typedef std::vector<std::pair<std::string,
1.89 + _writer_bits::MapStorageBase<BlueNode>* > > BlueNodeMaps;
1.90 + BlueNodeMaps _blue_node_maps;
1.91
1.92 typedef std::vector<std::pair<std::string,
1.93 _writer_bits::MapStorageBase<Edge>* > >EdgeMaps;
1.94 @@ -1710,13 +1743,13 @@
1.95
1.96 /// \brief Destructor
1.97 ~BpGraphWriter() {
1.98 - for (typename NodeMaps::iterator it = _red_maps.begin();
1.99 - it != _red_maps.end(); ++it) {
1.100 + for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
1.101 + it != _red_node_maps.end(); ++it) {
1.102 delete it->second;
1.103 }
1.104
1.105 - for (typename NodeMaps::iterator it = _blue_maps.begin();
1.106 - it != _blue_maps.end(); ++it) {
1.107 + for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
1.108 + it != _blue_node_maps.end(); ++it) {
1.109 delete it->second;
1.110 }
1.111
1.112 @@ -1753,11 +1786,12 @@
1.113 other._os = 0;
1.114 other.local_os = false;
1.115
1.116 - _node_index.swap(other._node_index);
1.117 + _red_node_index.swap(other._red_node_index);
1.118 + _blue_node_index.swap(other._blue_node_index);
1.119 _edge_index.swap(other._edge_index);
1.120
1.121 - _red_maps.swap(other._red_maps);
1.122 - _blue_maps.swap(other._blue_maps);
1.123 + _red_node_maps.swap(other._red_node_maps);
1.124 + _blue_node_maps.swap(other._blue_node_maps);
1.125 _edge_maps.swap(other._edge_maps);
1.126 _attributes.swap(other._attributes);
1.127
1.128 @@ -1779,12 +1813,12 @@
1.129 template <typename Map>
1.130 BpGraphWriter& nodeMap(const std::string& caption, const Map& map) {
1.131 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1.132 - _writer_bits::MapStorageBase<Node>* red_storage =
1.133 - new _writer_bits::MapStorage<Node, Map>(map);
1.134 - _red_maps.push_back(std::make_pair(caption, red_storage));
1.135 - _writer_bits::MapStorageBase<Node>* blue_storage =
1.136 - new _writer_bits::MapStorage<Node, Map>(map);
1.137 - _blue_maps.push_back(std::make_pair(caption, blue_storage));
1.138 + _writer_bits::MapStorageBase<RedNode>* red_storage =
1.139 + new _writer_bits::MapStorage<RedNode, Map>(map);
1.140 + _red_node_maps.push_back(std::make_pair(caption, red_storage));
1.141 + _writer_bits::MapStorageBase<BlueNode>* blue_storage =
1.142 + new _writer_bits::MapStorage<BlueNode, Map>(map);
1.143 + _blue_node_maps.push_back(std::make_pair(caption, blue_storage));
1.144 return *this;
1.145 }
1.146
1.147 @@ -1796,12 +1830,12 @@
1.148 BpGraphWriter& nodeMap(const std::string& caption, const Map& map,
1.149 const Converter& converter = Converter()) {
1.150 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1.151 - _writer_bits::MapStorageBase<Node>* red_storage =
1.152 - new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
1.153 - _red_maps.push_back(std::make_pair(caption, red_storage));
1.154 - _writer_bits::MapStorageBase<Node>* blue_storage =
1.155 - new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
1.156 - _blue_maps.push_back(std::make_pair(caption, blue_storage));
1.157 + _writer_bits::MapStorageBase<RedNode>* red_storage =
1.158 + new _writer_bits::MapStorage<RedNode, Map, Converter>(map, converter);
1.159 + _red_node_maps.push_back(std::make_pair(caption, red_storage));
1.160 + _writer_bits::MapStorageBase<BlueNode>* blue_storage =
1.161 + new _writer_bits::MapStorage<BlueNode, Map, Converter>(map, converter);
1.162 + _blue_node_maps.push_back(std::make_pair(caption, blue_storage));
1.163 return *this;
1.164 }
1.165
1.166 @@ -1810,10 +1844,10 @@
1.167 /// Add a red node map writing rule to the writer.
1.168 template <typename Map>
1.169 BpGraphWriter& redNodeMap(const std::string& caption, const Map& map) {
1.170 - checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1.171 - _writer_bits::MapStorageBase<Node>* storage =
1.172 - new _writer_bits::MapStorage<Node, Map>(map);
1.173 - _red_maps.push_back(std::make_pair(caption, storage));
1.174 + checkConcept<concepts::ReadMap<RedNode, typename Map::Value>, Map>();
1.175 + _writer_bits::MapStorageBase<RedNode>* storage =
1.176 + new _writer_bits::MapStorage<RedNode, Map>(map);
1.177 + _red_node_maps.push_back(std::make_pair(caption, storage));
1.178 return *this;
1.179 }
1.180
1.181 @@ -1824,10 +1858,10 @@
1.182 template <typename Map, typename Converter>
1.183 BpGraphWriter& redNodeMap(const std::string& caption, const Map& map,
1.184 const Converter& converter = Converter()) {
1.185 - checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1.186 - _writer_bits::MapStorageBase<Node>* storage =
1.187 - new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
1.188 - _red_maps.push_back(std::make_pair(caption, storage));
1.189 + checkConcept<concepts::ReadMap<RedNode, typename Map::Value>, Map>();
1.190 + _writer_bits::MapStorageBase<RedNode>* storage =
1.191 + new _writer_bits::MapStorage<RedNode, Map, Converter>(map, converter);
1.192 + _red_node_maps.push_back(std::make_pair(caption, storage));
1.193 return *this;
1.194 }
1.195
1.196 @@ -1836,10 +1870,10 @@
1.197 /// Add a blue node map writing rule to the writer.
1.198 template <typename Map>
1.199 BpGraphWriter& blueNodeMap(const std::string& caption, const Map& map) {
1.200 - checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1.201 - _writer_bits::MapStorageBase<Node>* storage =
1.202 - new _writer_bits::MapStorage<Node, Map>(map);
1.203 - _blue_maps.push_back(std::make_pair(caption, storage));
1.204 + checkConcept<concepts::ReadMap<BlueNode, typename Map::Value>, Map>();
1.205 + _writer_bits::MapStorageBase<BlueNode>* storage =
1.206 + new _writer_bits::MapStorage<BlueNode, Map>(map);
1.207 + _blue_node_maps.push_back(std::make_pair(caption, storage));
1.208 return *this;
1.209 }
1.210
1.211 @@ -1850,10 +1884,10 @@
1.212 template <typename Map, typename Converter>
1.213 BpGraphWriter& blueNodeMap(const std::string& caption, const Map& map,
1.214 const Converter& converter = Converter()) {
1.215 - checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1.216 - _writer_bits::MapStorageBase<Node>* storage =
1.217 - new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
1.218 - _blue_maps.push_back(std::make_pair(caption, storage));
1.219 + checkConcept<concepts::ReadMap<BlueNode, typename Map::Value>, Map>();
1.220 + _writer_bits::MapStorageBase<BlueNode>* storage =
1.221 + new _writer_bits::MapStorage<BlueNode, Map, Converter>(map, converter);
1.222 + _blue_node_maps.push_back(std::make_pair(caption, storage));
1.223 return *this;
1.224 }
1.225
1.226 @@ -1945,8 +1979,33 @@
1.227 ///
1.228 /// Add a node writing rule to the writer.
1.229 BpGraphWriter& node(const std::string& caption, const Node& node) {
1.230 + typedef _writer_bits::DoubleMapLookUpConverter<
1.231 + Node, RedNodeIndex, BlueNodeIndex> Converter;
1.232 + Converter converter(_red_node_index, _blue_node_index);
1.233 + _writer_bits::ValueStorageBase* storage =
1.234 + new _writer_bits::ValueStorage<Node, Converter>(node, converter);
1.235 + _attributes.push_back(std::make_pair(caption, storage));
1.236 + return *this;
1.237 + }
1.238 +
1.239 + /// \brief Red node writing rule
1.240 + ///
1.241 + /// Add a red node writing rule to the writer.
1.242 + BpGraphWriter& redNode(const std::string& caption, const RedNode& node) {
1.243 typedef _writer_bits::MapLookUpConverter<Node> Converter;
1.244 - Converter converter(_node_index);
1.245 + Converter converter(_red_node_index);
1.246 + _writer_bits::ValueStorageBase* storage =
1.247 + new _writer_bits::ValueStorage<Node, Converter>(node, converter);
1.248 + _attributes.push_back(std::make_pair(caption, storage));
1.249 + return *this;
1.250 + }
1.251 +
1.252 + /// \brief Blue node writing rule
1.253 + ///
1.254 + /// Add a blue node writing rule to the writer.
1.255 + BpGraphWriter& blueNode(const std::string& caption, const BlueNode& node) {
1.256 + typedef _writer_bits::MapLookUpConverter<Node> Converter;
1.257 + Converter converter(_blue_node_index);
1.258 _writer_bits::ValueStorageBase* storage =
1.259 new _writer_bits::ValueStorage<Node, Converter>(node, converter);
1.260 _attributes.push_back(std::make_pair(caption, storage));
1.261 @@ -2033,9 +2092,9 @@
1.262 private:
1.263
1.264 void writeRedNodes() {
1.265 - _writer_bits::MapStorageBase<Node>* label = 0;
1.266 - for (typename NodeMaps::iterator it = _red_maps.begin();
1.267 - it != _red_maps.end(); ++it) {
1.268 + _writer_bits::MapStorageBase<RedNode>* label = 0;
1.269 + for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
1.270 + it != _red_node_maps.end(); ++it) {
1.271 if (it->first == "label") {
1.272 label = it->second;
1.273 break;
1.274 @@ -2051,13 +2110,13 @@
1.275 if (label == 0) {
1.276 *_os << "label" << '\t';
1.277 }
1.278 - for (typename NodeMaps::iterator it = _red_maps.begin();
1.279 - it != _red_maps.end(); ++it) {
1.280 + for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
1.281 + it != _red_node_maps.end(); ++it) {
1.282 _writer_bits::writeToken(*_os, it->first) << '\t';
1.283 }
1.284 *_os << std::endl;
1.285
1.286 - std::vector<Node> nodes;
1.287 + std::vector<RedNode> nodes;
1.288 for (RedNodeIt n(_graph); n != INVALID; ++n) {
1.289 nodes.push_back(n);
1.290 }
1.291 @@ -2071,20 +2130,20 @@
1.292 }
1.293
1.294 for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
1.295 - Node n = nodes[i];
1.296 + RedNode n = nodes[i];
1.297 if (label == 0) {
1.298 std::ostringstream os;
1.299 - os << _graph.id(n);
1.300 + os << _graph.id(static_cast<Node>(n));
1.301 _writer_bits::writeToken(*_os, os.str());
1.302 *_os << '\t';
1.303 - _node_index.insert(std::make_pair(n, os.str()));
1.304 + _red_node_index.insert(std::make_pair(n, os.str()));
1.305 }
1.306 - for (typename NodeMaps::iterator it = _red_maps.begin();
1.307 - it != _red_maps.end(); ++it) {
1.308 + for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
1.309 + it != _red_node_maps.end(); ++it) {
1.310 std::string value = it->second->get(n);
1.311 _writer_bits::writeToken(*_os, value);
1.312 if (it->first == "label") {
1.313 - _node_index.insert(std::make_pair(n, value));
1.314 + _red_node_index.insert(std::make_pair(n, value));
1.315 }
1.316 *_os << '\t';
1.317 }
1.318 @@ -2093,9 +2152,9 @@
1.319 }
1.320
1.321 void writeBlueNodes() {
1.322 - _writer_bits::MapStorageBase<Node>* label = 0;
1.323 - for (typename NodeMaps::iterator it = _blue_maps.begin();
1.324 - it != _blue_maps.end(); ++it) {
1.325 + _writer_bits::MapStorageBase<BlueNode>* label = 0;
1.326 + for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
1.327 + it != _blue_node_maps.end(); ++it) {
1.328 if (it->first == "label") {
1.329 label = it->second;
1.330 break;
1.331 @@ -2111,13 +2170,13 @@
1.332 if (label == 0) {
1.333 *_os << "label" << '\t';
1.334 }
1.335 - for (typename NodeMaps::iterator it = _blue_maps.begin();
1.336 - it != _blue_maps.end(); ++it) {
1.337 + for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
1.338 + it != _blue_node_maps.end(); ++it) {
1.339 _writer_bits::writeToken(*_os, it->first) << '\t';
1.340 }
1.341 *_os << std::endl;
1.342
1.343 - std::vector<Node> nodes;
1.344 + std::vector<BlueNode> nodes;
1.345 for (BlueNodeIt n(_graph); n != INVALID; ++n) {
1.346 nodes.push_back(n);
1.347 }
1.348 @@ -2131,20 +2190,20 @@
1.349 }
1.350
1.351 for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
1.352 - Node n = nodes[i];
1.353 + BlueNode n = nodes[i];
1.354 if (label == 0) {
1.355 std::ostringstream os;
1.356 - os << _graph.id(n);
1.357 + os << _graph.id(static_cast<Node>(n));
1.358 _writer_bits::writeToken(*_os, os.str());
1.359 *_os << '\t';
1.360 - _node_index.insert(std::make_pair(n, os.str()));
1.361 + _blue_node_index.insert(std::make_pair(n, os.str()));
1.362 }
1.363 - for (typename NodeMaps::iterator it = _blue_maps.begin();
1.364 - it != _blue_maps.end(); ++it) {
1.365 + for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
1.366 + it != _blue_node_maps.end(); ++it) {
1.367 std::string value = it->second->get(n);
1.368 _writer_bits::writeToken(*_os, value);
1.369 if (it->first == "label") {
1.370 - _node_index.insert(std::make_pair(n, value));
1.371 + _blue_node_index.insert(std::make_pair(n, value));
1.372 }
1.373 *_os << '\t';
1.374 }
1.375 @@ -2153,9 +2212,9 @@
1.376 }
1.377
1.378 void createRedNodeIndex() {
1.379 - _writer_bits::MapStorageBase<Node>* label = 0;
1.380 - for (typename NodeMaps::iterator it = _red_maps.begin();
1.381 - it != _red_maps.end(); ++it) {
1.382 + _writer_bits::MapStorageBase<RedNode>* label = 0;
1.383 + for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
1.384 + it != _red_node_maps.end(); ++it) {
1.385 if (it->first == "label") {
1.386 label = it->second;
1.387 break;
1.388 @@ -2163,23 +2222,23 @@
1.389 }
1.390
1.391 if (label == 0) {
1.392 - for (NodeIt n(_graph); n != INVALID; ++n) {
1.393 + for (RedNodeIt n(_graph); n != INVALID; ++n) {
1.394 std::ostringstream os;
1.395 os << _graph.id(n);
1.396 - _node_index.insert(std::make_pair(n, os.str()));
1.397 + _red_node_index.insert(std::make_pair(n, os.str()));
1.398 }
1.399 } else {
1.400 - for (NodeIt n(_graph); n != INVALID; ++n) {
1.401 + for (RedNodeIt n(_graph); n != INVALID; ++n) {
1.402 std::string value = label->get(n);
1.403 - _node_index.insert(std::make_pair(n, value));
1.404 + _red_node_index.insert(std::make_pair(n, value));
1.405 }
1.406 }
1.407 }
1.408
1.409 void createBlueNodeIndex() {
1.410 - _writer_bits::MapStorageBase<Node>* label = 0;
1.411 - for (typename NodeMaps::iterator it = _blue_maps.begin();
1.412 - it != _blue_maps.end(); ++it) {
1.413 + _writer_bits::MapStorageBase<BlueNode>* label = 0;
1.414 + for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
1.415 + it != _blue_node_maps.end(); ++it) {
1.416 if (it->first == "label") {
1.417 label = it->second;
1.418 break;
1.419 @@ -2187,15 +2246,15 @@
1.420 }
1.421
1.422 if (label == 0) {
1.423 - for (NodeIt n(_graph); n != INVALID; ++n) {
1.424 + for (BlueNodeIt n(_graph); n != INVALID; ++n) {
1.425 std::ostringstream os;
1.426 os << _graph.id(n);
1.427 - _node_index.insert(std::make_pair(n, os.str()));
1.428 + _blue_node_index.insert(std::make_pair(n, os.str()));
1.429 }
1.430 } else {
1.431 - for (NodeIt n(_graph); n != INVALID; ++n) {
1.432 + for (BlueNodeIt n(_graph); n != INVALID; ++n) {
1.433 std::string value = label->get(n);
1.434 - _node_index.insert(std::make_pair(n, value));
1.435 + _blue_node_index.insert(std::make_pair(n, value));
1.436 }
1.437 }
1.438 }
1.439 @@ -2241,10 +2300,10 @@
1.440
1.441 for (int i = 0; i < static_cast<int>(edges.size()); ++i) {
1.442 Edge e = edges[i];
1.443 - _writer_bits::writeToken(*_os, _node_index.
1.444 + _writer_bits::writeToken(*_os, _red_node_index.
1.445 find(_graph.redNode(e))->second);
1.446 *_os << '\t';
1.447 - _writer_bits::writeToken(*_os, _node_index.
1.448 + _writer_bits::writeToken(*_os, _blue_node_index.
1.449 find(_graph.blueNode(e))->second);
1.450 *_os << '\t';
1.451 if (label == 0) {