Changeset 1333:2640cf6547ff in lemon-0.x
- Timestamp:
- 04/09/05 21:35:33 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1772
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/graph_io.dox
r1118 r1333 1 1 namespace lemon { 2 2 /*! 3 4 3 5 4 … … 21 20 The next line contains the names of the maps separated by whitespaces. 22 21 Each following line describes a node in the graph, it contains 23 in the right order the values of the maps. The first mapshould contain24 unique values because it regarded as I d-map.22 in the right order the values of the maps. The map named "id" should contain 23 unique values because it regarded as ID-map. 25 24 26 25 \code … … 36 35 The next line contains the whitespace separated list of names of the map. 37 36 Each of the next lines describes one edge. The first two elements in the line 38 are the ID of the source and target node as they occur in the firstnode map.37 are the ID of the source and target node as they occur in the ID node map. 39 38 40 39 \code … … 46 45 \endcode 47 46 48 The next section contains <em>labele snodes</em> (i.e. nodes having a special47 The next section contains <em>labeled nodes</em> (i.e. nodes having a special 49 48 label on them). The section starts with 50 49 \c \@nodes. Each of the next lines contains a label for a node in the graph 51 and then the ID described in the first column in thenodeset.50 and then the ID described in the nodeset. 52 51 53 52 \code … … 57 56 \endcode 58 57 59 The last section describes the <em>labeles edges</em> 60 (i.e. edges having a special 61 label on them). It starts with \c \@edges 58 The last section describes the <em>labeled edges</em> 59 (i.e. edges having a special label on them). It starts with \c \@edges 62 60 and then each line contains the name of the edge and the ID. 63 61 … … 89 87 90 88 \code 91 GraphWriter<ListGraph> writer( graph);89 GraphWriter<ListGraph> writer(std::cout, graph); 92 90 \endcode 93 91 94 92 The \c addNodeMap() function declares a \c NodeMap writing command in the 95 93 \c GraphWriter. You should give as parameter the name of the map and the map 96 object. The first NodeMap writing command should write a unique map because97 it is regarded as ID map.94 object. The NodeMap writing command with name "id" should write a 95 unique map because it is regarded as ID map. 98 96 99 97 \see IdMap, DescriptorMap … … 109 107 110 108 With the \c addEdgeMap() member function you can give an edge map 111 writing command similar to the NodeMaps. The first map writing command should 112 write unique map. 109 writing command similar to the NodeMaps. 113 110 114 111 \see IdMap, DescriptorMap … … 133 130 134 131 After you give all write commands you must call the \c run() member 135 function, which execute all the write commands.132 function, which execute all the writer commands. 136 133 137 134 \code … … 152 149 153 150 \code 154 GraphReader<ListGraph> reader( graph);151 GraphReader<ListGraph> reader(std::cin, graph); 155 152 \endcode 156 153 … … 207 204 template parameters to specialize it. When you give a reading 208 205 command for a map you can give a Reader type as template parameter. 209 With this template parameter you can control how does read the Reader206 With this template parameter you can control how the Reader reads 210 207 a value from the stream. 211 208 … … 245 242 The specialization of the writing should be very similar to the reading. 246 243 247 244 \author Balazs Dezso 248 245 */ 249 246 } -
src/lemon/graph_reader.h
r1311 r1333 35 35 namespace lemon { 36 36 37 /// \addtogroup io_group 38 /// @{ 37 39 38 40 /// \brief Standard ReaderTraits for the GraphReader class. … … 40 42 /// Standard ReaderTraits for the GraphReader class. 41 43 /// It defines standard reading method for all type of value. 44 /// \author Balazs Dezso 42 45 struct DefaultReaderTraits { 43 46 44 /// \brief Template class for reading an value.47 /// \brief Template class for reading an value. 45 48 /// 46 49 /// Template class for reading an value. 50 /// \author Balazs Dezso 47 51 template <typename _Value> 48 52 struct Reader { … … 58 62 }; 59 63 64 /// \brief Returns wheter this name is an ID map name. 65 /// 66 /// Returns wheter this name is an ID map name. 67 static bool idMapName(const std::string& name) { 68 return name == "id"; 69 } 70 60 71 /// The reader class for the not needed maps. 61 72 typedef Reader<std::string> DefaultReader; … … 67 78 /// Reader class for quoted strings. It can process the escape 68 79 /// sequences in the string. 80 /// \author Balazs Dezso 69 81 class QuotedStringReader { 70 82 public: … … 172 184 /// \brief The graph reader class. 173 185 /// 174 /// \ingroup io_group 175 /// The reader class for the graph input. 186 /// 187 /// The given file format may contain several maps and labeled nodes or 188 /// edges. 189 /// 190 /// If you read a graph you need not read all the maps and items just those 191 /// that you need. The interface of the \c GraphReader is very similar to 192 /// the GraphWriter but the reading method does not depend on the order the 193 /// given commands. 194 /// 195 /// The reader object suppose that each not readed value does not contain 196 /// whitespaces, therefore it has some extra possibilities to control how 197 /// it should skip the values when the string representation contains spaces. 198 /// 199 /// \code 200 /// GraphReader<ListGraph> reader(std::cin, graph); 201 /// \endcode 202 /// 203 /// The \c addNodeMap() function reads a map from the \c \@nodeset section. 204 /// If there is a map that you do not want to read from the file and there is 205 /// whitespace in the string represenation of the values then you should 206 /// call the \c skipNodeMap() template member function with proper 207 /// parameters. 208 /// 209 /// \code 210 /// reader.addNodeMap("x-coord", xCoordMap); 211 /// reader.addNodeMap("y-coord", yCoordMap); 212 /// 213 /// reader.addNodeMap<QuotedStringReader>("label", labelMap); 214 /// reader.skipNodeMap<QuotedStringReader>("description"); 215 /// 216 /// reader.addNodeMap("color", colorMap); 217 /// \endcode 218 /// 219 /// With the \c addEdgeMap() member function you can give an edge map 220 /// reading command similar to the NodeMaps. 221 /// 222 /// \code 223 /// reader.addEdgeMap("weight", weightMap); 224 /// reader.addEdgeMap("label", labelMap); 225 /// \endcode 226 /// 227 /// With \c addNode() and \c addEdge() functions you can read labeled Nodes 228 /// and Edges. 229 /// 230 /// \code 231 /// reader.addNode("source", sourceNode); 232 /// reader.addNode("target", targetNode); 233 /// 234 /// reader.addEdge("observed", edge); 235 /// \endcode 236 /// 237 /// After you give all read commands you must call the \c run() member 238 /// function, which execute all the commands. 239 /// 240 /// \code 241 /// reader.run(); 242 /// \endcode 243 /// 176 244 /// \see DefaultReaderTraits 177 245 /// \see QuotedStringReader 178 246 /// \see \ref GraphWriter 179 247 /// \see \ref graph-io-page 248 /// \author Balazs Dezso 180 249 template <typename _Graph, typename _ReaderTraits = DefaultReaderTraits> 181 250 class GraphReader { … … 201 270 /// Destruct the graph reader. 202 271 ~GraphReader() { 203 204 272 for (typename NodeMapReaders::iterator it = node_map_readers.begin(); 205 273 it != node_map_readers.end(); ++it) { … … 365 433 std::istringstream ls(line); 366 434 while (ls >> id) { 367 if (id[0] == '#') break;368 435 typename NodeMapReaders::iterator it = node_map_readers.find(id); 369 436 if (it != node_map_readers.end()) { … … 373 440 index.push_back(&nodeSkipper); 374 441 } 375 } 376 } 377 378 if (index.size() == 0) { 379 throw DataFormatError("Cannot find node id map"); 380 } 381 382 nodeInverter = 383 std::auto_ptr<InverterBase<Node> >(index[0]->getInverter()); 442 if (ReaderTraits::idMapName(id) && nodeInverter.get() == 0) { 443 nodeInverter.reset(index.back()->getInverter()); 444 index.back() = nodeInverter.get(); 445 } 446 } 447 } 448 449 // if (index.size() == 0) { 450 // throw DataFormatError("Cannot find node id map"); 451 // } 452 453 // nodeInverter = 454 // std::auto_ptr<InverterBase<Node> >(index[0]->getInverter()); 384 455 std::string line; 385 456 while (line = readNotEmptyLine(is, line_num), line[0] != '@') { 386 457 Node node = graph.addNode(); 387 458 std::istringstream ls(line); 388 nodeInverter->read(ls, node); 389 for (int i = 1; i < (int)index.size(); ++i) { 459 for (int i = 0; i < (int)index.size(); ++i) { 390 460 index[i]->read(ls, node); 391 461 } … … 403 473 std::istringstream ls(line); 404 474 while (ls >> id) { 405 if (id[0] == '#') break;406 475 typename EdgeMapReaders::iterator it = edge_map_readers.find(id); 407 476 if (it != edge_map_readers.end()) { … … 411 480 index.push_back(&edgeSkipper); 412 481 } 413 } 414 } 415 416 if (index.size() == 0) { 417 throw DataFormatError("Cannot find edge id map"); 418 } 419 420 edgeInverter = 421 std::auto_ptr<InverterBase<Edge> >(index[0]->getInverter()); 482 if (ReaderTraits::idMapName(id) && edgeInverter.get() == 0) { 483 edgeInverter.reset(index.back()->getInverter()); 484 index.back() = edgeInverter.get(); 485 } 486 } 487 } 488 489 if (nodeInverter.get() == 0) { 490 throw DataFormatError("Cannot find node id map"); 491 } 492 // if (index.size() == 0) { 493 // throw DataFormatError("Cannot find edge id map"); 494 // } 495 496 // edgeInverter = 497 // std::auto_ptr<InverterBase<Edge> >(index[0]->getInverter()); 422 498 std::string line; 423 499 while (line = readNotEmptyLine(is, line_num), line[0] != '@') { … … 426 502 Node target = nodeInverter->read(ls); 427 503 Edge edge = graph.addEdge(source, target); 428 edgeInverter->read(ls, edge); 429 for (int i = 1; i < (int)index.size(); ++i) { 504 for (int i = 0; i < (int)index.size(); ++i) { 430 505 index[i]->read(ls, edge); 431 506 } … … 437 512 std::auto_ptr<InverterBase<Node> >& nodeInverter) { 438 513 std::string line; 514 if (nodeInverter.get() == 0) { 515 throw DataFormatError("Cannot find node id map"); 516 } 439 517 while (line = readNotEmptyLine(is, line_num), line[0] != '@') { 440 518 std::istringstream ls(line); … … 452 530 std::auto_ptr<InverterBase<Edge> >& edgeInverter) { 453 531 std::string line; 532 if (edgeInverter.get() == 0) { 533 throw DataFormatError("Cannot find edge id map"); 534 } 454 535 while (line = readNotEmptyLine(is, line_num), line[0] != '@') { 455 536 std::istringstream ls(line); … … 467 548 std::string line; 468 549 while (++line_num, getline(is, line)) { 469 int vi = line.find_first_not_of(" \t"); 470 if (vi != (int)std::string::npos && line[vi] != '#') { 550 int vi = line.find('#'); 551 if (vi != (int)::std::string::npos) { 552 line = line.substr(0, vi); 553 } 554 vi = line.find_first_not_of(" \t"); 555 if (vi != (int)std::string::npos) { 556 std::cerr << "Line: " << line.substr(vi) << std::endl; 471 557 return line.substr(vi); 472 558 } … … 474 560 throw DataFormatError("End of stream error"); 475 561 } 476 477 // Inverters store and give back the Item from the id,478 // and may put the ids into a map.479 562 480 563 template <typename _Item> 481 class InverterBase { 564 class ReaderBase; 565 566 template <typename _Item> 567 class InverterBase : public ReaderBase<_Item> { 482 568 public: 483 569 typedef _Item Item; 484 570 virtual void read(std::istream&, const Item&) = 0; 485 571 virtual Item read(std::istream&) = 0; 572 573 virtual InverterBase<_Item>* getInverter() { 574 return this; 575 } 486 576 }; 487 577 … … 652 742 }; 653 743 654 /// Ready to use reader function. 744 /// \brief Read a graph from the input. 745 /// 746 /// Read a graph from the input. 747 /// \param is The input stream. 748 /// \param g The graph. 749 /// \param capacity The capacity map. 750 /// \param s The source node. 751 /// \param t The target node. 752 /// \param cost The cost map. 655 753 template<typename Graph, typename CapacityMap, typename CostMap> 656 754 void readGraph(std::istream& is, Graph &g, CapacityMap& capacity, … … 665 763 } 666 764 765 /// \brief Read a graph from the input. 766 /// 767 /// Read a graph from the input. 768 /// \param is The input stream. 769 /// \param g The graph. 770 /// \param capacity The capacity map. 771 /// \param s The source node. 772 /// \param t The target node. 667 773 template<typename Graph, typename CapacityMap> 668 774 void readGraph(std::istream& is, Graph &g, CapacityMap& capacity, … … 675 781 } 676 782 783 /// \brief Read a graph from the input. 784 /// 785 /// Read a graph from the input. 786 /// \param is The input stream. 787 /// \param g The graph. 788 /// \param capacity The capacity map. 789 /// \param s The source node. 677 790 template<typename Graph, typename CapacityMap> 678 791 void readGraph(std::istream& is, Graph &g, CapacityMap& capacity, … … 684 797 } 685 798 799 /// \brief Read a graph from the input. 800 /// 801 /// Read a graph from the input. 802 /// \param is The input stream. 803 /// \param g The graph. 804 /// \param capacity The capacity map. 686 805 template<typename Graph, typename CapacityMap> 687 806 void readGraph(std::istream& is, Graph &g, CapacityMap& capacity) { … … 691 810 } 692 811 812 /// \brief Read a graph from the input. 813 /// 814 /// Read a graph from the input. 815 /// \param is The input stream. 816 /// \param g The graph. 693 817 template<typename Graph> 694 818 void readGraph(std::istream& is, Graph &g) { … … 697 821 } 698 822 823 /// @} 699 824 } 700 825 -
src/lemon/graph_writer.h
r1311 r1333 38 38 namespace lemon { 39 39 40 /// \addtogroup io_group 41 /// @{ 42 40 43 /// \brief Standard WriterTraits for the GraphWriter class. 41 44 /// 42 45 /// Standard WriterTraits for the GraphWriter class. 43 46 /// It defines standard writing method for all type of value. 47 /// \author Balazs Dezso 44 48 struct DefaultWriterTraits { 45 49 … … 47 51 /// 48 52 /// Template class for writing an value. 53 /// \author Balazs Dezso 49 54 template <typename _Value> 50 55 struct Writer { … … 60 65 }; 61 66 67 /// \brief Returns wheter this name is an ID map name. 68 /// 69 /// Returns wheter this name is an ID map name. 70 static bool idMapName(const std::string& name) { 71 return name == "id"; 72 } 73 62 74 }; 63 75 … … 67 79 /// Writer class for quoted strings. It can process the escape 68 80 /// sequences in the string. 81 /// \author Balazs Dezso 69 82 class QuotedStringWriter { 70 83 public: … … 147 160 /// \brief The graph writer class. 148 161 /// 149 ///\ingroup io_group 150 /// The writer class for the graph output. 162 /// The \c GraphWriter class provides the graph output. To write a graph 163 /// you should first give writing commands for the writer. You can declare 164 /// write command as \c NodeMap or \c EdgeMap writing and labeled Node and 165 /// Edge writing. 166 /// 167 /// \code 168 /// GraphWriter<ListGraph> writer(std::cout, graph); 169 /// \endcode 170 /// 171 /// The \c addNodeMap() function declares a \c NodeMap writing command in the 172 /// \c GraphWriter. You should give as parameter the name of the map and the 173 /// map object. The NodeMap writing command with name "id" should write a 174 /// unique map because it is regarded as ID map. 175 /// 176 /// \code 177 /// IdMap<ListGraph, Node> nodeIdMap; 178 /// writer.addNodeMap("id", nodeIdMap); 179 /// 180 /// writer.addNodeMap("x-coord", xCoordMap); 181 /// writer.addNodeMap("y-coord", yCoordMap); 182 /// writer.addNodeMap("color", colorMap); 183 /// \endcode 184 /// 185 /// With the \c addEdgeMap() member function you can give an edge map 186 /// writing command similar to the NodeMaps. 187 /// 188 /// \code 189 /// DescriptorMap<ListGraph, Edge, ListGraph::EdgeMap<int> > 190 /// edgeDescMap(graph); 191 /// writer.addEdgeMap("descriptor", edgeDescMap); 192 /// 193 /// writer.addEdgeMap("weight", weightMap); 194 /// writer.addEdgeMap("label", labelMap); 195 /// \endcode 196 /// 197 /// With \c addNode() and \c addEdge() functions you can point out Nodes and 198 /// Edges in the graph. By example, you can write out the source and target 199 /// of the graph. 200 /// 201 /// \code 202 /// writer.addNode("source", sourceNode); 203 /// writer.addNode("target", targetNode); 204 /// 205 /// writer.addEdge("observed", edge); 206 /// \endcode 207 /// 208 /// After you give all write commands you must call the \c run() member 209 /// function, which execute all the writer commands. 210 /// 211 /// \code 212 /// writer.run(); 213 /// \endcode 214 /// 151 215 /// \see DefaultWriterTraits 152 216 /// \see QuotedStringWriter 217 /// \see IdMap 218 /// \see DescriptorMap 153 219 /// \see \ref GraphReader 154 220 /// \see \ref graph-io-page 221 /// \author Balazs Dezso 155 222 template <typename _Graph, typename _WriterTraits = DefaultWriterTraits> 156 223 class GraphWriter { … … 255 322 /// Executes the writer commands. 256 323 void run() { 257 writeNodeSet(); 258 writeEdgeSet(); 259 writeNodes(); 260 writeEdges(); 324 WriterBase<Node>* nodeWriter = 0; 325 WriterBase<Edge>* edgeWriter = 0; 326 writeNodeSet(nodeWriter); 327 writeEdgeSet(nodeWriter, edgeWriter); 328 writeNodes(nodeWriter); 329 writeEdges(edgeWriter); 261 330 os << "@end" << std::endl; 262 331 } 263 332 264 333 private: 265 266 void writeNodeSet() {267 if (node_map_writers.size() == 0) return;268 os << "@nodeset" << std::endl;269 for (int i = 0; i < (int)node_map_writers.size(); ++i) {270 os << node_map_writers[i].first << '\t';271 }272 os << std::endl;273 for (NodeIt it(graph); it != INVALID; ++it) {274 for (int i = 0; i < (int)node_map_writers.size(); ++i) {275 node_map_writers[i].second->write(os, it);276 }277 os << std::endl;278 }279 280 }281 282 void writeEdgeSet() {283 if (edge_map_writers.size() == 0) return;284 if (node_map_writers.size() == 0) {285 // ErrorMessage message;286 // message << "Missing node id map";287 // throw IOLogicError(message);288 }289 os << "@edgeset" << std::endl;290 os << "\t\t";291 for (int i = 0; i < (int)edge_map_writers.size(); ++i) {292 os << edge_map_writers[i].first << '\t';293 }294 os << std::endl;295 for (EdgeIt it(graph); it != INVALID; ++it) {296 node_map_writers[0].second->write(os, graph.source(it));297 node_map_writers[0].second->write(os, graph.target(it));298 for (int i = 0; i < (int)edge_map_writers.size(); ++i) {299 edge_map_writers[i].second->write(os, it);300 }301 os << std::endl;302 }303 }304 305 void writeNodes() {306 if (node_writers.size() == 0) return;307 if (node_map_writers.size() == 0) {308 // throw Exception() << "Missing node id map";309 }310 os << "@nodes" << std::endl;311 for (int i = 0; i < (int)node_writers.size(); ++i) {312 os << node_writers[i].first << '\t';313 node_map_writers[0].second->write(os, node_writers[i].second);314 os << std::endl;315 }316 }317 318 void writeEdges() {319 if (edge_writers.size() == 0) return;320 if (edge_map_writers.size() == 0) {321 // throw Exception() << "Missing edge id map";322 }323 os << "@edges" << std::endl;324 for (int i = 0; i < (int)edge_writers.size(); ++i) {325 os << edge_writers[i].first << '\t';326 edge_map_writers[0].second->write(os, edge_writers[i].second);327 os << std::endl;328 }329 }330 331 // Writers332 334 333 335 template <class _Item> … … 359 361 }; 360 362 363 void writeNodeSet(WriterBase<Node>* & nodeWriter) { 364 if (node_map_writers.size() == 0) return; 365 os << "@nodeset" << std::endl; 366 for (int i = 0; i < (int)node_map_writers.size(); ++i) { 367 const std::string& id = node_map_writers[i].first; 368 os << id << '\t'; 369 if (WriterTraits::idMapName(id) && nodeWriter == 0) { 370 nodeWriter = node_map_writers[i].second; 371 } 372 } 373 os << std::endl; 374 for (NodeIt it(graph); it != INVALID; ++it) { 375 for (int i = 0; i < (int)node_map_writers.size(); ++i) { 376 node_map_writers[i].second->write(os, it); 377 } 378 os << std::endl; 379 } 380 381 } 382 383 void writeEdgeSet(WriterBase<Node>* nodeWriter, 384 WriterBase<Edge>* & edgeWriter) { 385 if (nodeWriter == 0) { 386 throw DataFormatError("Cannot find node id map"); 387 } 388 os << "@edgeset" << std::endl; 389 os << "\t\t"; 390 for (int i = 0; i < (int)edge_map_writers.size(); ++i) { 391 const std::string& id = edge_map_writers[i].first; 392 os << id << '\t'; 393 if (WriterTraits::idMapName(id) && edgeWriter == 0) { 394 edgeWriter = edge_map_writers[i].second; 395 } 396 } 397 os << std::endl; 398 for (EdgeIt it(graph); it != INVALID; ++it) { 399 nodeWriter->write(os, graph.source(it)); 400 nodeWriter->write(os, graph.target(it)); 401 for (int i = 0; i < (int)edge_map_writers.size(); ++i) { 402 edge_map_writers[i].second->write(os, it); 403 } 404 os << std::endl; 405 } 406 } 407 408 void writeNodes(WriterBase<Node>* nodeWriter) { 409 if (nodeWriter == 0) { 410 throw DataFormatError("Cannot find node id map"); 411 } 412 os << "@nodes" << std::endl; 413 for (int i = 0; i < (int)node_writers.size(); ++i) { 414 os << node_writers[i].first << '\t'; 415 nodeWriter->write(os, node_writers[i].second); 416 os << std::endl; 417 } 418 } 419 420 void writeEdges(WriterBase<Edge>* edgeWriter) { 421 if (edgeWriter == 0) { 422 throw DataFormatError("Cannot find node id map"); 423 } 424 os << "@edges" << std::endl; 425 for (int i = 0; i < (int)edge_writers.size(); ++i) { 426 os << edge_writers[i].first << '\t'; 427 edgeWriter->write(os, edge_writers[i].second); 428 os << std::endl; 429 } 430 } 431 432 361 433 362 434 … … 380 452 }; 381 453 382 /// Ready to use writer function. 454 /// \brief Write a graph to the output. 455 /// 456 /// Write a graph to the output. 457 /// \param os The output stream. 458 /// \param g The graph. 459 /// \param capacity The capacity map. 460 /// \param s The source node. 461 /// \param t The target node. 462 /// \param cost The cost map. 383 463 template<typename Graph, typename CapacityMap, typename CostMap> 384 464 void writeGraph(std::ostream& os, const Graph &g, … … 397 477 } 398 478 399 /// Ready to use writer function. 479 /// \brief Write a graph to the output. 480 /// 481 /// Write a graph to the output. 482 /// \param os The output stream. 483 /// \param g The graph. 484 /// \param capacity The capacity map. 485 /// \param s The source node. 486 /// \param t The target node. 400 487 template<typename Graph, typename CapacityMap> 401 488 void writeGraph(std::ostream& os, const Graph &g, … … 413 500 } 414 501 415 /// Ready to use writer function. 502 /// \brief Write a graph to the output. 503 /// 504 /// Write a graph to the output. 505 /// \param os The output stream. 506 /// \param g The graph. 507 /// \param capacity The capacity map. 508 /// \param s The source node. 416 509 template<typename Graph, typename CapacityMap> 417 510 void writeGraph(std::ostream& os, const Graph &g, … … 426 519 reader.run(); 427 520 } 428 /// Ready to use writer function. 521 522 /// \brief Write a graph to the output. 523 /// 524 /// Write a graph to the output. 525 /// \param os The output stream. 526 /// \param g The graph. 527 /// \param capacity The capacity map. 429 528 template<typename Graph, typename CapacityMap> 430 529 void writeGraph(std::ostream& os, const Graph &g, … … 438 537 reader.run(); 439 538 } 440 /// Ready to use writer function. 539 540 /// \brief Write a graph to the output. 541 /// 542 /// Write a graph to the output. 543 /// \param os The output stream. 544 /// \param g The graph. 441 545 template<typename Graph> 442 546 void writeGraph(std::ostream& os, const Graph &g) { … … 449 553 } 450 554 555 /// @} 451 556 452 557 }
Note: See TracChangeset
for help on using the changeset viewer.