Changeset 209:765619b7cbb2 in lemon-1.2 for lemon/lgf_writer.h
- Timestamp:
- 07/13/08 20:51:02 (15 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/lgf_writer.h
r201 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 44 44 struct DefaultConverter { 45 45 std::string operator()(const Value& value) { 46 47 48 46 std::ostringstream os; 47 os << value; 48 return os.str(); 49 49 } 50 50 }; … … 63 63 private: 64 64 const Map& _map; 65 65 66 66 public: 67 67 MapLess(const Map& map) : _map(map) {} 68 68 69 69 bool operator()(const Item& left, const Item& right) { 70 70 return _map[left] < _map[right]; 71 71 } 72 72 }; … … 82 82 const Graph& _graph; 83 83 const Map& _map; 84 84 85 85 public: 86 GraphArcMapLess(const Graph& graph, const Map& map) 87 86 GraphArcMapLess(const Graph& graph, const Map& map) 87 : _graph(graph), _map(map) {} 88 88 89 89 bool operator()(const Item& left, const Item& right) { 90 return _map[_graph.direct(left, _dir)] < 91 90 return _map[_graph.direct(left, _dir)] < 91 _map[_graph.direct(right, _dir)]; 92 92 } 93 93 }; 94 94 95 template <typename _Item> 95 template <typename _Item> 96 96 class MapStorageBase { 97 97 public: … … 106 106 }; 107 107 108 template <typename _Item, typename _Map, 109 108 template <typename _Item, typename _Map, 109 typename _Converter = DefaultConverter<typename _Map::Value> > 110 110 class MapStorage : public MapStorageBase<_Item> { 111 111 public: … … 113 113 typedef _Converter Converter; 114 114 typedef _Item Item; 115 115 116 116 private: 117 117 const Map& _map; … … 119 119 120 120 public: 121 MapStorage(const Map& map, const Converter& converter = Converter()) 122 121 MapStorage(const Map& map, const Converter& converter = Converter()) 122 : _map(map), _converter(converter) {} 123 123 virtual ~MapStorage() {} 124 124 125 125 virtual std::string get(const Item& item) { 126 126 return _converter(_map[item]); 127 127 } 128 128 virtual void sort(std::vector<Item>& items) { 129 130 129 MapLess<Map> less(_map); 130 std::sort(items.begin(), items.end(), less); 131 131 } 132 132 }; 133 133 134 template <typename _Graph, bool _dir, typename _Map, 135 134 template <typename _Graph, bool _dir, typename _Map, 135 typename _Converter = DefaultConverter<typename _Map::Value> > 136 136 class GraphArcMapStorage : public MapStorageBase<typename _Graph::Edge> { 137 137 public: … … 141 141 typedef typename Graph::Edge Item; 142 142 static const bool dir = _dir; 143 143 144 144 private: 145 145 const Graph& _graph; … … 148 148 149 149 public: 150 GraphArcMapStorage(const Graph& graph, const Map& map, 151 const Converter& converter = Converter()) 152 150 GraphArcMapStorage(const Graph& graph, const Map& map, 151 const Converter& converter = Converter()) 152 : _graph(graph), _map(map), _converter(converter) {} 153 153 virtual ~GraphArcMapStorage() {} 154 154 155 155 virtual std::string get(const Item& item) { 156 156 return _converter(_map[_graph.direct(item, dir)]); 157 157 } 158 158 virtual void sort(std::vector<Item>& items) { 159 160 159 GraphArcMapLess<Graph, dir, Map> less(_graph, _map); 160 std::sort(items.begin(), items.end(), less); 161 161 } 162 162 }; … … 167 167 virtual ~ValueStorageBase() {} 168 168 169 virtual std::string get() = 0; 169 virtual std::string get() = 0; 170 170 }; 171 171 … … 182 182 public: 183 183 ValueStorage(const Value& value, const Converter& converter = Converter()) 184 184 : _value(value), _converter(converter) {} 185 185 186 186 virtual std::string get() { 187 187 return _converter(_value); 188 188 } 189 189 }; … … 192 192 struct MapLookUpConverter { 193 193 const std::map<Value, std::string>& _map; 194 195 MapLookUpConverter(const std::map<Value, std::string>& map) 196 197 194 195 MapLookUpConverter(const std::map<Value, std::string>& map) 196 : _map(map) {} 197 198 198 std::string operator()(const Value& str) { 199 typename std::map<Value, std::string>::const_iterator it = 200 201 202 203 204 199 typename std::map<Value, std::string>::const_iterator it = 200 _map.find(str); 201 if (it == _map.end()) { 202 throw DataFormatError("Item not found"); 203 } 204 return it->second; 205 205 } 206 206 }; … … 210 210 const Graph& _graph; 211 211 const std::map<typename Graph::Edge, std::string>& _map; 212 213 GraphArcLookUpConverter(const Graph& graph, 214 const std::map<typename Graph::Edge, 215 std::string>& map) 216 217 212 213 GraphArcLookUpConverter(const Graph& graph, 214 const std::map<typename Graph::Edge, 215 std::string>& map) 216 : _graph(graph), _map(map) {} 217 218 218 std::string operator()(const typename Graph::Arc& val) { 219 220 221 222 223 224 219 typename std::map<typename Graph::Edge, std::string> 220 ::const_iterator it = _map.find(val); 221 if (it == _map.end()) { 222 throw DataFormatError("Item not found"); 223 } 224 return (_graph.direction(val) ? '+' : '-') + it->second; 225 225 } 226 226 }; 227 227 228 228 inline bool isWhiteSpace(char c) { 229 return c == ' ' || c == '\t' || c == '\v' || 230 c == '\n' || c == '\r' || c == '\f'; 229 return c == ' ' || c == '\t' || c == '\v' || 230 c == '\n' || c == '\r' || c == '\f'; 231 231 } 232 232 233 233 inline bool isEscaped(char c) { 234 return c == '\\' || c == '\"' || c == '\'' || 235 234 return c == '\\' || c == '\"' || c == '\'' || 235 c == '\a' || c == '\b'; 236 236 } 237 237 … … 239 239 switch (c) { 240 240 case '\\': 241 242 241 os << "\\\\"; 242 return; 243 243 case '\"': 244 245 244 os << "\\\""; 245 return; 246 246 case '\a': 247 248 247 os << "\\a"; 248 return; 249 249 case '\b': 250 251 250 os << "\\b"; 251 return; 252 252 case '\f': 253 254 253 os << "\\f"; 254 return; 255 255 case '\r': 256 257 256 os << "\\r"; 257 return; 258 258 case '\n': 259 260 259 os << "\\n"; 260 return; 261 261 case '\t': 262 263 262 os << "\\t"; 263 return; 264 264 case '\v': 265 266 265 os << "\\v"; 266 return; 267 267 default: 268 269 270 271 272 273 274 275 276 } 268 if (c < 0x20) { 269 std::ios::fmtflags flags = os.flags(); 270 os << '\\' << std::oct << static_cast<int>(c); 271 os.flags(flags); 272 } else { 273 os << c; 274 } 275 return; 276 } 277 277 } 278 278 … … 282 282 char c; 283 283 while (is.get(c)) { 284 285 286 284 if (isWhiteSpace(c) || isEscaped(c)) { 285 return true; 286 } 287 287 } 288 288 return false; 289 289 } 290 290 291 291 inline std::ostream& writeToken(std::ostream& os, const std::string& str) { 292 292 293 293 if (requireEscape(str)) { 294 295 for (std::string::const_iterator it = str.begin(); 296 297 298 } 299 294 os << '\"'; 295 for (std::string::const_iterator it = str.begin(); 296 it != str.end(); ++it) { 297 writeEscape(os, *it); 298 } 299 os << '\"'; 300 300 } else { 301 301 os << str; 302 302 } 303 303 return os; … … 310 310 311 311 template <typename Digraph> 312 DigraphWriter<Digraph> digraphWriter(std::ostream& os, 313 312 DigraphWriter<Digraph> digraphWriter(std::ostream& os, 313 const Digraph& digraph); 314 314 315 315 template <typename Digraph> 316 DigraphWriter<Digraph> digraphWriter(const std::string& fn, 317 316 DigraphWriter<Digraph> digraphWriter(const std::string& fn, 317 const Digraph& digraph); 318 318 319 319 template <typename Digraph> 320 DigraphWriter<Digraph> digraphWriter(const char *fn, 321 322 320 DigraphWriter<Digraph> digraphWriter(const char *fn, 321 const Digraph& digraph); 322 323 323 /// \ingroup lemon_io 324 /// 324 /// 325 325 /// \brief \ref lgf-format "LGF" writer for directed graphs 326 326 /// … … 371 371 typedef _Digraph Digraph; 372 372 TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); 373 373 374 374 private: 375 375 … … 383 383 std::string _arcs_caption; 384 384 std::string _attributes_caption; 385 385 386 386 typedef std::map<Node, std::string> NodeIndex; 387 387 NodeIndex _node_index; … … 389 389 ArcIndex _arc_index; 390 390 391 typedef std::vector<std::pair<std::string, 392 _writer_bits::MapStorageBase<Node>* > > NodeMaps; 393 NodeMaps _node_maps; 394 395 typedef std::vector<std::pair<std::string, 391 typedef std::vector<std::pair<std::string, 392 _writer_bits::MapStorageBase<Node>* > > NodeMaps; 393 NodeMaps _node_maps; 394 395 typedef std::vector<std::pair<std::string, 396 396 _writer_bits::MapStorageBase<Arc>* > >ArcMaps; 397 397 ArcMaps _arc_maps; 398 398 399 typedef std::vector<std::pair<std::string, 399 typedef std::vector<std::pair<std::string, 400 400 _writer_bits::ValueStorageBase*> > Attributes; 401 401 Attributes _attributes; … … 410 410 /// Construct a directed graph writer, which writes to the given 411 411 /// output stream. 412 DigraphWriter(std::ostream& is, const Digraph& digraph) 412 DigraphWriter(std::ostream& is, const Digraph& digraph) 413 413 : _os(&is), local_os(false), _digraph(digraph), 414 414 _skip_nodes(false), _skip_arcs(false) {} 415 415 416 416 /// \brief Constructor … … 418 418 /// Construct a directed graph writer, which writes to the given 419 419 /// output file. 420 DigraphWriter(const std::string& fn, const Digraph& digraph) 420 DigraphWriter(const std::string& fn, const Digraph& digraph) 421 421 : _os(new std::ofstream(fn.c_str())), local_os(true), _digraph(digraph), 422 422 _skip_nodes(false), _skip_arcs(false) {} 423 423 424 424 /// \brief Constructor … … 426 426 /// Construct a directed graph writer, which writes to the given 427 427 /// output file. 428 DigraphWriter(const char* fn, const Digraph& digraph) 428 DigraphWriter(const char* fn, const Digraph& digraph) 429 429 : _os(new std::ofstream(fn)), local_os(true), _digraph(digraph), 430 430 _skip_nodes(false), _skip_arcs(false) {} 431 431 432 432 /// \brief Destructor 433 433 ~DigraphWriter() { 434 for (typename NodeMaps::iterator it = _node_maps.begin(); 435 436 437 } 438 439 for (typename ArcMaps::iterator it = _arc_maps.begin(); 440 441 442 } 443 444 for (typename Attributes::iterator it = _attributes.begin(); 445 446 434 for (typename NodeMaps::iterator it = _node_maps.begin(); 435 it != _node_maps.end(); ++it) { 436 delete it->second; 437 } 438 439 for (typename ArcMaps::iterator it = _arc_maps.begin(); 440 it != _arc_maps.end(); ++it) { 441 delete it->second; 442 } 443 444 for (typename Attributes::iterator it = _attributes.begin(); 445 it != _attributes.end(); ++it) { 446 delete it->second; 447 447 } 448 448 449 449 if (local_os) { 450 450 delete _os; 451 451 } 452 452 } … … 454 454 private: 455 455 456 friend DigraphWriter<Digraph> digraphWriter<>(std::ostream& os, 457 458 friend DigraphWriter<Digraph> digraphWriter<>(const std::string& fn, 459 const Digraph& digraph); 460 friend DigraphWriter<Digraph> digraphWriter<>(const char *fn, 461 462 463 DigraphWriter(DigraphWriter& other) 456 friend DigraphWriter<Digraph> digraphWriter<>(std::ostream& os, 457 const Digraph& digraph); 458 friend DigraphWriter<Digraph> digraphWriter<>(const std::string& fn, 459 const Digraph& digraph); 460 friend DigraphWriter<Digraph> digraphWriter<>(const char *fn, 461 const Digraph& digraph); 462 463 DigraphWriter(DigraphWriter& other) 464 464 : _os(other._os), local_os(other.local_os), _digraph(other._digraph), 465 465 _skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) { 466 466 467 467 other._os = 0; … … 479 479 _attributes_caption = other._attributes_caption; 480 480 } 481 481 482 482 DigraphWriter& operator=(const DigraphWriter&); 483 483 … … 486 486 /// \name Writing rules 487 487 /// @{ 488 488 489 489 /// \brief Node map writing rule 490 490 /// … … 493 493 DigraphWriter& nodeMap(const std::string& caption, const Map& map) { 494 494 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); 495 _writer_bits::MapStorageBase<Node>* storage = 496 495 _writer_bits::MapStorageBase<Node>* storage = 496 new _writer_bits::MapStorage<Node, Map>(map); 497 497 _node_maps.push_back(std::make_pair(caption, storage)); 498 498 return *this; … … 504 504 /// writer. 505 505 template <typename Map, typename Converter> 506 DigraphWriter& nodeMap(const std::string& caption, const Map& map, 507 506 DigraphWriter& nodeMap(const std::string& caption, const Map& map, 507 const Converter& converter = Converter()) { 508 508 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); 509 _writer_bits::MapStorageBase<Node>* storage = 510 509 _writer_bits::MapStorageBase<Node>* storage = 510 new _writer_bits::MapStorage<Node, Map, Converter>(map, converter); 511 511 _node_maps.push_back(std::make_pair(caption, storage)); 512 512 return *this; … … 519 519 DigraphWriter& arcMap(const std::string& caption, const Map& map) { 520 520 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); 521 _writer_bits::MapStorageBase<Arc>* storage = 522 521 _writer_bits::MapStorageBase<Arc>* storage = 522 new _writer_bits::MapStorage<Arc, Map>(map); 523 523 _arc_maps.push_back(std::make_pair(caption, storage)); 524 524 return *this; … … 530 530 /// writer. 531 531 template <typename Map, typename Converter> 532 DigraphWriter& arcMap(const std::string& caption, const Map& map, 533 532 DigraphWriter& arcMap(const std::string& caption, const Map& map, 533 const Converter& converter = Converter()) { 534 534 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); 535 _writer_bits::MapStorageBase<Arc>* storage = 536 535 _writer_bits::MapStorageBase<Arc>* storage = 536 new _writer_bits::MapStorage<Arc, Map, Converter>(map, converter); 537 537 _arc_maps.push_back(std::make_pair(caption, storage)); 538 538 return *this; … … 544 544 template <typename Value> 545 545 DigraphWriter& attribute(const std::string& caption, const Value& value) { 546 _writer_bits::ValueStorageBase* storage = 547 546 _writer_bits::ValueStorageBase* storage = 547 new _writer_bits::ValueStorage<Value>(value); 548 548 _attributes.push_back(std::make_pair(caption, storage)); 549 549 return *this; … … 555 555 /// writer. 556 556 template <typename Value, typename Converter> 557 DigraphWriter& attribute(const std::string& caption, const Value& value, 558 559 _writer_bits::ValueStorageBase* storage = 560 557 DigraphWriter& attribute(const std::string& caption, const Value& value, 558 const Converter& converter = Converter()) { 559 _writer_bits::ValueStorageBase* storage = 560 new _writer_bits::ValueStorage<Value, Converter>(value, converter); 561 561 _attributes.push_back(std::make_pair(caption, storage)); 562 562 return *this; … … 569 569 typedef _writer_bits::MapLookUpConverter<Node> Converter; 570 570 Converter converter(_node_index); 571 _writer_bits::ValueStorageBase* storage = 572 571 _writer_bits::ValueStorageBase* storage = 572 new _writer_bits::ValueStorage<Node, Converter>(node, converter); 573 573 _attributes.push_back(std::make_pair(caption, storage)); 574 574 return *this; … … 581 581 typedef _writer_bits::MapLookUpConverter<Arc> Converter; 582 582 Converter converter(_arc_index); 583 _writer_bits::ValueStorageBase* storage = 584 583 _writer_bits::ValueStorageBase* storage = 584 new _writer_bits::ValueStorage<Arc, Converter>(arc, converter); 585 585 _attributes.push_back(std::make_pair(caption, storage)); 586 586 return *this; … … 642 642 _writer_bits::MapStorageBase<Node>* label = 0; 643 643 for (typename NodeMaps::iterator it = _node_maps.begin(); 644 644 it != _node_maps.end(); ++it) { 645 645 if (it->first == "label") { 646 647 648 646 label = it->second; 647 break; 648 } 649 649 } 650 650 651 651 *_os << "@nodes"; 652 652 if (!_nodes_caption.empty()) { 653 653 _writer_bits::writeToken(*_os << ' ', _nodes_caption); 654 654 } 655 655 *_os << std::endl; 656 656 657 657 if (label == 0) { 658 658 *_os << "label" << '\t'; 659 659 } 660 660 for (typename NodeMaps::iterator it = _node_maps.begin(); 661 662 661 it != _node_maps.end(); ++it) { 662 _writer_bits::writeToken(*_os, it->first) << '\t'; 663 663 } 664 664 *_os << std::endl; … … 666 666 std::vector<Node> nodes; 667 667 for (NodeIt n(_digraph); n != INVALID; ++n) { 668 669 } 670 668 nodes.push_back(n); 669 } 670 671 671 if (label == 0) { 672 673 674 672 IdMap<Digraph, Node> id_map(_digraph); 673 _writer_bits::MapLess<IdMap<Digraph, Node> > id_less(id_map); 674 std::sort(nodes.begin(), nodes.end(), id_less); 675 675 } else { 676 676 label->sort(nodes); 677 677 } 678 678 679 679 for (int i = 0; i < static_cast<int>(nodes.size()); ++i) { 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 680 Node n = nodes[i]; 681 if (label == 0) { 682 std::ostringstream os; 683 os << _digraph.id(n); 684 _writer_bits::writeToken(*_os, os.str()); 685 *_os << '\t'; 686 _node_index.insert(std::make_pair(n, os.str())); 687 } 688 for (typename NodeMaps::iterator it = _node_maps.begin(); 689 it != _node_maps.end(); ++it) { 690 std::string value = it->second->get(n); 691 _writer_bits::writeToken(*_os, value); 692 if (it->first == "label") { 693 _node_index.insert(std::make_pair(n, value)); 694 } 695 *_os << '\t'; 696 } 697 *_os << std::endl; 698 698 } 699 699 } … … 702 702 _writer_bits::MapStorageBase<Node>* label = 0; 703 703 for (typename NodeMaps::iterator it = _node_maps.begin(); 704 704 it != _node_maps.end(); ++it) { 705 705 if (it->first == "label") { 706 707 708 706 label = it->second; 707 break; 708 } 709 709 } 710 710 711 711 if (label == 0) { 712 713 714 715 _node_index.insert(std::make_pair(n, os.str())); 716 } 712 for (NodeIt n(_digraph); n != INVALID; ++n) { 713 std::ostringstream os; 714 os << _digraph.id(n); 715 _node_index.insert(std::make_pair(n, os.str())); 716 } 717 717 } else { 718 719 std::string value = label->get(n); 720 721 718 for (NodeIt n(_digraph); n != INVALID; ++n) { 719 std::string value = label->get(n); 720 _node_index.insert(std::make_pair(n, value)); 721 } 722 722 } 723 723 } … … 726 726 _writer_bits::MapStorageBase<Arc>* label = 0; 727 727 for (typename ArcMaps::iterator it = _arc_maps.begin(); 728 728 it != _arc_maps.end(); ++it) { 729 729 if (it->first == "label") { 730 731 732 730 label = it->second; 731 break; 732 } 733 733 } 734 734 735 735 *_os << "@arcs"; 736 736 if (!_arcs_caption.empty()) { 737 737 _writer_bits::writeToken(*_os << ' ', _arcs_caption); 738 738 } 739 739 *_os << std::endl; … … 741 741 *_os << '\t' << '\t'; 742 742 if (label == 0) { 743 743 *_os << "label" << '\t'; 744 744 } 745 745 for (typename ArcMaps::iterator it = _arc_maps.begin(); 746 747 746 it != _arc_maps.end(); ++it) { 747 _writer_bits::writeToken(*_os, it->first) << '\t'; 748 748 } 749 749 *_os << std::endl; … … 751 751 std::vector<Arc> arcs; 752 752 for (ArcIt n(_digraph); n != INVALID; ++n) { 753 754 } 755 753 arcs.push_back(n); 754 } 755 756 756 if (label == 0) { 757 758 759 757 IdMap<Digraph, Arc> id_map(_digraph); 758 _writer_bits::MapLess<IdMap<Digraph, Arc> > id_less(id_map); 759 std::sort(arcs.begin(), arcs.end(), id_less); 760 760 } else { 761 761 label->sort(arcs); 762 762 } 763 763 764 764 for (int i = 0; i < static_cast<int>(arcs.size()); ++i) { 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 765 Arc a = arcs[i]; 766 _writer_bits::writeToken(*_os, _node_index. 767 find(_digraph.source(a))->second); 768 *_os << '\t'; 769 _writer_bits::writeToken(*_os, _node_index. 770 find(_digraph.target(a))->second); 771 *_os << '\t'; 772 if (label == 0) { 773 std::ostringstream os; 774 os << _digraph.id(a); 775 _writer_bits::writeToken(*_os, os.str()); 776 *_os << '\t'; 777 _arc_index.insert(std::make_pair(a, os.str())); 778 } 779 for (typename ArcMaps::iterator it = _arc_maps.begin(); 780 it != _arc_maps.end(); ++it) { 781 std::string value = it->second->get(a); 782 _writer_bits::writeToken(*_os, value); 783 if (it->first == "label") { 784 _arc_index.insert(std::make_pair(a, value)); 785 } 786 *_os << '\t'; 787 } 788 *_os << std::endl; 789 789 } 790 790 } … … 793 793 _writer_bits::MapStorageBase<Arc>* label = 0; 794 794 for (typename ArcMaps::iterator it = _arc_maps.begin(); 795 795 it != _arc_maps.end(); ++it) { 796 796 if (it->first == "label") { 797 798 799 797 label = it->second; 798 break; 799 } 800 800 } 801 801 802 802 if (label == 0) { 803 804 805 806 _arc_index.insert(std::make_pair(a, os.str())); 807 } 803 for (ArcIt a(_digraph); a != INVALID; ++a) { 804 std::ostringstream os; 805 os << _digraph.id(a); 806 _arc_index.insert(std::make_pair(a, os.str())); 807 } 808 808 } else { 809 810 std::string value = label->get(a); 811 812 809 for (ArcIt a(_digraph); a != INVALID; ++a) { 810 std::string value = label->get(a); 811 _arc_index.insert(std::make_pair(a, value)); 812 } 813 813 } 814 814 } … … 818 818 *_os << "@attributes"; 819 819 if (!_attributes_caption.empty()) { 820 820 _writer_bits::writeToken(*_os << ' ', _attributes_caption); 821 821 } 822 822 *_os << std::endl; 823 823 for (typename Attributes::iterator it = _attributes.begin(); 824 825 826 827 828 } 829 } 830 824 it != _attributes.end(); ++it) { 825 _writer_bits::writeToken(*_os, it->first) << ' '; 826 _writer_bits::writeToken(*_os, it->second->get()); 827 *_os << std::endl; 828 } 829 } 830 831 831 public: 832 833 /// \name Execution of the writer 832 833 /// \name Execution of the writer 834 834 /// @{ 835 835 … … 839 839 void run() { 840 840 if (!_skip_nodes) { 841 841 writeNodes(); 842 842 } else { 843 844 } 845 if (!_skip_arcs) { 846 843 createNodeIndex(); 844 } 845 if (!_skip_arcs) { 846 writeArcs(); 847 847 } else { 848 848 createArcIndex(); 849 849 } 850 850 writeAttributes(); … … 862 862 863 863 /// \brief Return a \ref DigraphWriter class 864 /// 864 /// 865 865 /// This function just returns a \ref DigraphWriter class. 866 866 /// \relates DigraphWriter 867 867 template <typename Digraph> 868 DigraphWriter<Digraph> digraphWriter(std::ostream& os, 869 868 DigraphWriter<Digraph> digraphWriter(std::ostream& os, 869 const Digraph& digraph) { 870 870 DigraphWriter<Digraph> tmp(os, digraph); 871 871 return tmp; … … 873 873 874 874 /// \brief Return a \ref DigraphWriter class 875 /// 875 /// 876 876 /// This function just returns a \ref DigraphWriter class. 877 877 /// \relates DigraphWriter 878 878 template <typename Digraph> 879 DigraphWriter<Digraph> digraphWriter(const std::string& fn, 880 879 DigraphWriter<Digraph> digraphWriter(const std::string& fn, 880 const Digraph& digraph) { 881 881 DigraphWriter<Digraph> tmp(fn, digraph); 882 882 return tmp; … … 884 884 885 885 /// \brief Return a \ref DigraphWriter class 886 /// 886 /// 887 887 /// This function just returns a \ref DigraphWriter class. 888 888 /// \relates DigraphWriter 889 889 template <typename Digraph> 890 DigraphWriter<Digraph> digraphWriter(const char* fn, 891 890 DigraphWriter<Digraph> digraphWriter(const char* fn, 891 const Digraph& digraph) { 892 892 DigraphWriter<Digraph> tmp(fn, digraph); 893 893 return tmp; … … 898 898 899 899 template <typename Graph> 900 GraphWriter<Graph> graphWriter(std::ostream& os, const Graph& graph); 900 GraphWriter<Graph> graphWriter(std::ostream& os, const Graph& graph); 901 901 902 902 template <typename Graph> 903 GraphWriter<Graph> graphWriter(const std::string& fn, const Graph& graph); 903 GraphWriter<Graph> graphWriter(const std::string& fn, const Graph& graph); 904 904 905 905 template <typename Graph> 906 GraphWriter<Graph> graphWriter(const char *fn, const Graph& graph); 906 GraphWriter<Graph> graphWriter(const char *fn, const Graph& graph); 907 907 908 908 /// \ingroup lemon_io 909 /// 909 /// 910 910 /// \brief \ref lgf-format "LGF" writer for directed graphs 911 911 /// … … 927 927 typedef _Graph Graph; 928 928 TEMPLATE_GRAPH_TYPEDEFS(Graph); 929 929 930 930 private: 931 931 … … 939 939 std::string _edges_caption; 940 940 std::string _attributes_caption; 941 941 942 942 typedef std::map<Node, std::string> NodeIndex; 943 943 NodeIndex _node_index; … … 945 945 EdgeIndex _edge_index; 946 946 947 typedef std::vector<std::pair<std::string, 948 _writer_bits::MapStorageBase<Node>* > > NodeMaps; 949 NodeMaps _node_maps; 950 951 typedef std::vector<std::pair<std::string, 947 typedef std::vector<std::pair<std::string, 948 _writer_bits::MapStorageBase<Node>* > > NodeMaps; 949 NodeMaps _node_maps; 950 951 typedef std::vector<std::pair<std::string, 952 952 _writer_bits::MapStorageBase<Edge>* > >EdgeMaps; 953 953 EdgeMaps _edge_maps; 954 954 955 typedef std::vector<std::pair<std::string, 955 typedef std::vector<std::pair<std::string, 956 956 _writer_bits::ValueStorageBase*> > Attributes; 957 957 Attributes _attributes; … … 966 966 /// Construct a directed graph writer, which writes to the given 967 967 /// output stream. 968 GraphWriter(std::ostream& is, const Graph& graph) 968 GraphWriter(std::ostream& is, const Graph& graph) 969 969 : _os(&is), local_os(false), _graph(graph), 970 970 _skip_nodes(false), _skip_edges(false) {} 971 971 972 972 /// \brief Constructor … … 974 974 /// Construct a directed graph writer, which writes to the given 975 975 /// output file. 976 GraphWriter(const std::string& fn, const Graph& graph) 976 GraphWriter(const std::string& fn, const Graph& graph) 977 977 : _os(new std::ofstream(fn.c_str())), local_os(true), _graph(graph), 978 978 _skip_nodes(false), _skip_edges(false) {} 979 979 980 980 /// \brief Constructor … … 982 982 /// Construct a directed graph writer, which writes to the given 983 983 /// output file. 984 GraphWriter(const char* fn, const Graph& graph) 984 GraphWriter(const char* fn, const Graph& graph) 985 985 : _os(new std::ofstream(fn)), local_os(true), _graph(graph), 986 986 _skip_nodes(false), _skip_edges(false) {} 987 987 988 988 /// \brief Destructor 989 989 ~GraphWriter() { 990 for (typename NodeMaps::iterator it = _node_maps.begin(); 991 992 993 } 994 995 for (typename EdgeMaps::iterator it = _edge_maps.begin(); 996 997 998 } 999 1000 for (typename Attributes::iterator it = _attributes.begin(); 1001 1002 990 for (typename NodeMaps::iterator it = _node_maps.begin(); 991 it != _node_maps.end(); ++it) { 992 delete it->second; 993 } 994 995 for (typename EdgeMaps::iterator it = _edge_maps.begin(); 996 it != _edge_maps.end(); ++it) { 997 delete it->second; 998 } 999 1000 for (typename Attributes::iterator it = _attributes.begin(); 1001 it != _attributes.end(); ++it) { 1002 delete it->second; 1003 1003 } 1004 1004 1005 1005 if (local_os) { 1006 1007 } 1008 } 1009 1006 delete _os; 1007 } 1008 } 1009 1010 1010 private: 1011 1011 1012 friend GraphWriter<Graph> graphWriter<>(std::ostream& os, 1013 const Graph& graph); 1014 friend GraphWriter<Graph> graphWriter<>(const std::string& fn, 1015 const Graph& graph); 1016 friend GraphWriter<Graph> graphWriter<>(const char *fn, 1017 const Graph& graph); 1018 1019 GraphWriter(GraphWriter& other) 1012 friend GraphWriter<Graph> graphWriter<>(std::ostream& os, 1013 const Graph& graph); 1014 friend GraphWriter<Graph> graphWriter<>(const std::string& fn, 1015 const Graph& graph); 1016 friend GraphWriter<Graph> graphWriter<>(const char *fn, 1017 const Graph& graph); 1018 1019 GraphWriter(GraphWriter& other) 1020 1020 : _os(other._os), local_os(other.local_os), _graph(other._graph), 1021 1021 _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) { 1022 1022 1023 1023 other._os = 0; … … 1042 1042 /// \name Writing rules 1043 1043 /// @{ 1044 1044 1045 1045 /// \brief Node map writing rule 1046 1046 /// … … 1049 1049 GraphWriter& nodeMap(const std::string& caption, const Map& map) { 1050 1050 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); 1051 _writer_bits::MapStorageBase<Node>* storage = 1052 1051 _writer_bits::MapStorageBase<Node>* storage = 1052 new _writer_bits::MapStorage<Node, Map>(map); 1053 1053 _node_maps.push_back(std::make_pair(caption, storage)); 1054 1054 return *this; … … 1060 1060 /// writer. 1061 1061 template <typename Map, typename Converter> 1062 GraphWriter& nodeMap(const std::string& caption, const Map& map, 1063 1062 GraphWriter& nodeMap(const std::string& caption, const Map& map, 1063 const Converter& converter = Converter()) { 1064 1064 checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>(); 1065 _writer_bits::MapStorageBase<Node>* storage = 1066 1065 _writer_bits::MapStorageBase<Node>* storage = 1066 new _writer_bits::MapStorage<Node, Map, Converter>(map, converter); 1067 1067 _node_maps.push_back(std::make_pair(caption, storage)); 1068 1068 return *this; … … 1075 1075 GraphWriter& edgeMap(const std::string& caption, const Map& map) { 1076 1076 checkConcept<concepts::ReadMap<Edge, typename Map::Value>, Map>(); 1077 _writer_bits::MapStorageBase<Edge>* storage = 1078 1077 _writer_bits::MapStorageBase<Edge>* storage = 1078 new _writer_bits::MapStorage<Edge, Map>(map); 1079 1079 _edge_maps.push_back(std::make_pair(caption, storage)); 1080 1080 return *this; … … 1086 1086 /// writer. 1087 1087 template <typename Map, typename Converter> 1088 GraphWriter& edgeMap(const std::string& caption, const Map& map, 1089 1088 GraphWriter& edgeMap(const std::string& caption, const Map& map, 1089 const Converter& converter = Converter()) { 1090 1090 checkConcept<concepts::ReadMap<Edge, typename Map::Value>, Map>(); 1091 _writer_bits::MapStorageBase<Edge>* storage = 1092 1091 _writer_bits::MapStorageBase<Edge>* storage = 1092 new _writer_bits::MapStorage<Edge, Map, Converter>(map, converter); 1093 1093 _edge_maps.push_back(std::make_pair(caption, storage)); 1094 1094 return *this; … … 1101 1101 GraphWriter& arcMap(const std::string& caption, const Map& map) { 1102 1102 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); 1103 _writer_bits::MapStorageBase<Edge>* forward_storage = 1104 1103 _writer_bits::MapStorageBase<Edge>* forward_storage = 1104 new _writer_bits::GraphArcMapStorage<Graph, true, Map>(_graph, map); 1105 1105 _edge_maps.push_back(std::make_pair('+' + caption, forward_storage)); 1106 _writer_bits::MapStorageBase<Edge>* backward_storage = 1107 1106 _writer_bits::MapStorageBase<Edge>* backward_storage = 1107 new _writer_bits::GraphArcMapStorage<Graph, false, Map>(_graph, map); 1108 1108 _edge_maps.push_back(std::make_pair('-' + caption, backward_storage)); 1109 1109 return *this; … … 1115 1115 /// writer. 1116 1116 template <typename Map, typename Converter> 1117 GraphWriter& arcMap(const std::string& caption, const Map& map, 1118 1117 GraphWriter& arcMap(const std::string& caption, const Map& map, 1118 const Converter& converter = Converter()) { 1119 1119 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); 1120 _writer_bits::MapStorageBase<Edge>* forward_storage = 1121 1122 1120 _writer_bits::MapStorageBase<Edge>* forward_storage = 1121 new _writer_bits::GraphArcMapStorage<Graph, true, Map, Converter> 1122 (_graph, map, converter); 1123 1123 _edge_maps.push_back(std::make_pair('+' + caption, forward_storage)); 1124 _writer_bits::MapStorageBase<Edge>* backward_storage = 1125 1126 1124 _writer_bits::MapStorageBase<Edge>* backward_storage = 1125 new _writer_bits::GraphArcMapStorage<Graph, false, Map, Converter> 1126 (_graph, map, converter); 1127 1127 _edge_maps.push_back(std::make_pair('-' + caption, backward_storage)); 1128 1128 return *this; … … 1134 1134 template <typename Value> 1135 1135 GraphWriter& attribute(const std::string& caption, const Value& value) { 1136 _writer_bits::ValueStorageBase* storage = 1137 1136 _writer_bits::ValueStorageBase* storage = 1137 new _writer_bits::ValueStorage<Value>(value); 1138 1138 _attributes.push_back(std::make_pair(caption, storage)); 1139 1139 return *this; … … 1145 1145 /// writer. 1146 1146 template <typename Value, typename Converter> 1147 GraphWriter& attribute(const std::string& caption, const Value& value, 1148 1149 _writer_bits::ValueStorageBase* storage = 1150 1147 GraphWriter& attribute(const std::string& caption, const Value& value, 1148 const Converter& converter = Converter()) { 1149 _writer_bits::ValueStorageBase* storage = 1150 new _writer_bits::ValueStorage<Value, Converter>(value, converter); 1151 1151 _attributes.push_back(std::make_pair(caption, storage)); 1152 1152 return *this; … … 1159 1159 typedef _writer_bits::MapLookUpConverter<Node> Converter; 1160 1160 Converter converter(_node_index); 1161 _writer_bits::ValueStorageBase* storage = 1162 1161 _writer_bits::ValueStorageBase* storage = 1162 new _writer_bits::ValueStorage<Node, Converter>(node, converter); 1163 1163 _attributes.push_back(std::make_pair(caption, storage)); 1164 1164 return *this; … … 1171 1171 typedef _writer_bits::MapLookUpConverter<Edge> Converter; 1172 1172 Converter converter(_edge_index); 1173 _writer_bits::ValueStorageBase* storage = 1174 1173 _writer_bits::ValueStorageBase* storage = 1174 new _writer_bits::ValueStorage<Edge, Converter>(edge, converter); 1175 1175 _attributes.push_back(std::make_pair(caption, storage)); 1176 1176 return *this; … … 1183 1183 typedef _writer_bits::GraphArcLookUpConverter<Graph> Converter; 1184 1184 Converter converter(_graph, _edge_index); 1185 _writer_bits::ValueStorageBase* storage = 1186 1185 _writer_bits::ValueStorageBase* storage = 1186 new _writer_bits::ValueStorage<Arc, Converter>(arc, converter); 1187 1187 _attributes.push_back(std::make_pair(caption, storage)); 1188 1188 return *this; … … 1244 1244 _writer_bits::MapStorageBase<Node>* label = 0; 1245 1245 for (typename NodeMaps::iterator it = _node_maps.begin(); 1246 1246 it != _node_maps.end(); ++it) { 1247 1247 if (it->first == "label") { 1248 1249 1250 1248 label = it->second; 1249 break; 1250 } 1251 1251 } 1252 1252 1253 1253 *_os << "@nodes"; 1254 1254 if (!_nodes_caption.empty()) { 1255 1255 _writer_bits::writeToken(*_os << ' ', _nodes_caption); 1256 1256 } 1257 1257 *_os << std::endl; 1258 1258 1259 1259 if (label == 0) { 1260 1260 *_os << "label" << '\t'; 1261 1261 } 1262 1262 for (typename NodeMaps::iterator it = _node_maps.begin(); 1263 1264 1263 it != _node_maps.end(); ++it) { 1264 _writer_bits::writeToken(*_os, it->first) << '\t'; 1265 1265 } 1266 1266 *_os << std::endl; … … 1268 1268 std::vector<Node> nodes; 1269 1269 for (NodeIt n(_graph); n != INVALID; ++n) { 1270 1271 } 1272 1270 nodes.push_back(n); 1271 } 1272 1273 1273 if (label == 0) { 1274 1275 1276 1274 IdMap<Graph, Node> id_map(_graph); 1275 _writer_bits::MapLess<IdMap<Graph, Node> > id_less(id_map); 1276 std::sort(nodes.begin(), nodes.end(), id_less); 1277 1277 } else { 1278 1278 label->sort(nodes); 1279 1279 } 1280 1280 1281 1281 for (int i = 0; i < static_cast<int>(nodes.size()); ++i) { 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1282 Node n = nodes[i]; 1283 if (label == 0) { 1284 std::ostringstream os; 1285 os << _graph.id(n); 1286 _writer_bits::writeToken(*_os, os.str()); 1287 *_os << '\t'; 1288 _node_index.insert(std::make_pair(n, os.str())); 1289 } 1290 for (typename NodeMaps::iterator it = _node_maps.begin(); 1291 it != _node_maps.end(); ++it) { 1292 std::string value = it->second->get(n); 1293 _writer_bits::writeToken(*_os, value); 1294 if (it->first == "label") { 1295 _node_index.insert(std::make_pair(n, value)); 1296 } 1297 *_os << '\t'; 1298 } 1299 *_os << std::endl; 1300 1300 } 1301 1301 } … … 1304 1304 _writer_bits::MapStorageBase<Node>* label = 0; 1305 1305 for (typename NodeMaps::iterator it = _node_maps.begin(); 1306 1306 it != _node_maps.end(); ++it) { 1307 1307 if (it->first == "label") { 1308 1309 1310 1308 label = it->second; 1309 break; 1310 } 1311 1311 } 1312 1312 1313 1313 if (label == 0) { 1314 1315 1316 1317 _node_index.insert(std::make_pair(n, os.str())); 1318 } 1314 for (NodeIt n(_graph); n != INVALID; ++n) { 1315 std::ostringstream os; 1316 os << _graph.id(n); 1317 _node_index.insert(std::make_pair(n, os.str())); 1318 } 1319 1319 } else { 1320 1321 std::string value = label->get(n); 1322 1323 1320 for (NodeIt n(_graph); n != INVALID; ++n) { 1321 std::string value = label->get(n); 1322 _node_index.insert(std::make_pair(n, value)); 1323 } 1324 1324 } 1325 1325 } … … 1328 1328 _writer_bits::MapStorageBase<Edge>* label = 0; 1329 1329 for (typename EdgeMaps::iterator it = _edge_maps.begin(); 1330 1330 it != _edge_maps.end(); ++it) { 1331 1331 if (it->first == "label") { 1332 1333 1334 1332 label = it->second; 1333 break; 1334 } 1335 1335 } 1336 1336 1337 1337 *_os << "@edges"; 1338 1338 if (!_edges_caption.empty()) { 1339 1339 _writer_bits::writeToken(*_os << ' ', _edges_caption); 1340 1340 } 1341 1341 *_os << std::endl; … … 1343 1343 *_os << '\t' << '\t'; 1344 1344 if (label == 0) { 1345 1345 *_os << "label" << '\t'; 1346 1346 } 1347 1347 for (typename EdgeMaps::iterator it = _edge_maps.begin(); 1348 1349 1348 it != _edge_maps.end(); ++it) { 1349 _writer_bits::writeToken(*_os, it->first) << '\t'; 1350 1350 } 1351 1351 *_os << std::endl; … … 1353 1353 std::vector<Edge> edges; 1354 1354 for (EdgeIt n(_graph); n != INVALID; ++n) { 1355 1356 } 1357 1355 edges.push_back(n); 1356 } 1357 1358 1358 if (label == 0) { 1359 1360 1361 1359 IdMap<Graph, Edge> id_map(_graph); 1360 _writer_bits::MapLess<IdMap<Graph, Edge> > id_less(id_map); 1361 std::sort(edges.begin(), edges.end(), id_less); 1362 1362 } else { 1363 1363 label->sort(edges); 1364 1364 } 1365 1365 1366 1366 for (int i = 0; i < static_cast<int>(edges.size()); ++i) { 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1367 Edge e = edges[i]; 1368 _writer_bits::writeToken(*_os, _node_index. 1369 find(_graph.u(e))->second); 1370 *_os << '\t'; 1371 _writer_bits::writeToken(*_os, _node_index. 1372 find(_graph.v(e))->second); 1373 *_os << '\t'; 1374 if (label == 0) { 1375 std::ostringstream os; 1376 os << _graph.id(e); 1377 _writer_bits::writeToken(*_os, os.str()); 1378 *_os << '\t'; 1379 _edge_index.insert(std::make_pair(e, os.str())); 1380 } 1381 for (typename EdgeMaps::iterator it = _edge_maps.begin(); 1382 it != _edge_maps.end(); ++it) { 1383 std::string value = it->second->get(e); 1384 _writer_bits::writeToken(*_os, value); 1385 if (it->first == "label") { 1386 _edge_index.insert(std::make_pair(e, value)); 1387 } 1388 *_os << '\t'; 1389 } 1390 *_os << std::endl; 1391 1391 } 1392 1392 } … … 1395 1395 _writer_bits::MapStorageBase<Edge>* label = 0; 1396 1396 for (typename EdgeMaps::iterator it = _edge_maps.begin(); 1397 1397 it != _edge_maps.end(); ++it) { 1398 1398 if (it->first == "label") { 1399 1400 1401 1399 label = it->second; 1400 break; 1401 } 1402 1402 } 1403 1403 1404 1404 if (label == 0) { 1405 1406 1407 1408 _edge_index.insert(std::make_pair(e, os.str())); 1409 } 1405 for (EdgeIt e(_graph); e != INVALID; ++e) { 1406 std::ostringstream os; 1407 os << _graph.id(e); 1408 _edge_index.insert(std::make_pair(e, os.str())); 1409 } 1410 1410 } else { 1411 1412 std::string value = label->get(e); 1413 1414 1411 for (EdgeIt e(_graph); e != INVALID; ++e) { 1412 std::string value = label->get(e); 1413 _edge_index.insert(std::make_pair(e, value)); 1414 } 1415 1415 } 1416 1416 } … … 1420 1420 *_os << "@attributes"; 1421 1421 if (!_attributes_caption.empty()) { 1422 1422 _writer_bits::writeToken(*_os << ' ', _attributes_caption); 1423 1423 } 1424 1424 *_os << std::endl; 1425 1425 for (typename Attributes::iterator it = _attributes.begin(); 1426 1427 1428 1429 1430 } 1431 } 1432 1426 it != _attributes.end(); ++it) { 1427 _writer_bits::writeToken(*_os, it->first) << ' '; 1428 _writer_bits::writeToken(*_os, it->second->get()); 1429 *_os << std::endl; 1430 } 1431 } 1432 1433 1433 public: 1434 1435 /// \name Execution of the writer 1434 1435 /// \name Execution of the writer 1436 1436 /// @{ 1437 1437 … … 1441 1441 void run() { 1442 1442 if (!_skip_nodes) { 1443 1443 writeNodes(); 1444 1444 } else { 1445 1446 } 1447 if (!_skip_edges) { 1448 1445 createNodeIndex(); 1446 } 1447 if (!_skip_edges) { 1448 writeEdges(); 1449 1449 } else { 1450 1450 createEdgeIndex(); 1451 1451 } 1452 1452 writeAttributes(); … … 1464 1464 1465 1465 /// \brief Return a \ref GraphWriter class 1466 /// 1466 /// 1467 1467 /// This function just returns a \ref GraphWriter class. 1468 1468 /// \relates GraphWriter … … 1474 1474 1475 1475 /// \brief Return a \ref GraphWriter class 1476 /// 1476 /// 1477 1477 /// This function just returns a \ref GraphWriter class. 1478 1478 /// \relates GraphWriter … … 1484 1484 1485 1485 /// \brief Return a \ref GraphWriter class 1486 /// 1486 /// 1487 1487 /// This function just returns a \ref GraphWriter class. 1488 1488 /// \relates GraphWriter
Note: See TracChangeset
for help on using the changeset viewer.